Bentley Capabilities

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

Sort
Expand

Retrieves metadata for an S3 object, returning key, size, last modified date, and content type for infrastructure data files.

naftiko: "0.5"
info:
  label: "Amazon S3 Object Retrieval"
  description: "Retrieves metadata for an S3 object, returning key, size, last modified date, and content type for infrastructure data files."
  tags:
    - cloud-storage
    - amazon-s3
    - data
capability:
  exposes:
    - type: mcp
      namespace: s3-storage
      port: 8080
      tools:
        - name: get-s3-object-info
          description: "Look up an S3 object by bucket and key."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "The S3 bucket name."
            - name: key
              in: body
              type: string
              description: "The object key."
          call: "s3.head-object"
          with:
            bucket: "{{bucket}}"
            key: "{{key}}"
          outputParameters:
            - name: content_type
              type: string
              mapping: "$.ContentType"
            - name: content_length
              type: integer
              mapping: "$.ContentLength"
            - name: last_modified
              type: string
              mapping: "$.LastModified"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: head-object
              method: HEAD

Fetches asset telemetry from Datadog, scores condition via Azure ML, updates the asset register in SAP, and sends a summary to the maintenance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Asset Condition Scoring Pipeline"
  description: "Fetches asset telemetry from Datadog, scores condition via Azure ML, updates the asset register in SAP, and sends a summary to the maintenance team via Microsoft Teams."
  tags:
    - asset-management
    - condition-monitoring
    - datadog
    - azure-machine-learning
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asset-condition
      port: 8080
      tools:
        - name: score-asset-condition
          description: "Score asset condition from telemetry data and update downstream systems."
          inputParameters:
            - name: asset_id
              in: body
              type: string
              description: "The asset identifier."
            - name: teams_channel
              in: body
              type: string
              description: "Microsoft Teams maintenance channel ID."
          steps:
            - name: get-telemetry
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:asset.vibration{asset_id:{{asset_id}}} by {sensor}"
                from: "-24h"
            - name: score-condition
              type: call
              call: "azureml.score"
              with:
                model_type: "asset_condition"
                data: "{{get-telemetry.series}}"
            - name: update-asset-register
              type: call
              call: "sap.update-equipment"
              with:
                equipment_id: "{{asset_id}}"
                condition_score: "{{score-condition.condition_score}}"
                next_maintenance: "{{score-condition.recommended_maintenance_date}}"
            - name: notify-maintenance
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel}}"
                text: "Asset {{asset_id}} condition score: {{score-condition.condition_score}}/100. Status: {{score-condition.status}}. Next maintenance: {{score-condition.recommended_maintenance_date}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_EQUIPMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment
          path: "/Equipment('{{equipment_id}}')"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: update-equipment
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an infrastructure asset reaches its maintenance window, creates a ServiceNow work order, updates the asset record in Oracle EBS, and notifies the maintenance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Asset Lifecycle Tracking Pipeline"
  description: "When an infrastructure asset reaches its maintenance window, creates a ServiceNow work order, updates the asset record in Oracle EBS, and notifies the maintenance team via Microsoft Teams."
  tags:
    - asset-management
    - maintenance
    - servicenow
    - oracle-e-business-suite
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: asset-lifecycle
      port: 8080
      tools:
        - name: trigger-maintenance-workflow
          description: "Given an asset ID and maintenance type, orchestrate work order creation across ServiceNow, Oracle EBS, and Microsoft Teams."
          inputParameters:
            - name: asset_id
              in: body
              type: string
              description: "The infrastructure asset identifier."
            - name: maintenance_type
              in: body
              type: string
              description: "Type of maintenance (e.g., preventive, corrective)."
            - name: maintenance_team_channel
              in: body
              type: string
              description: "Microsoft Teams channel for the maintenance team."
          steps:
            - name: get-asset
              type: call
              call: "oracle-ebs.get-asset"
              with:
                asset_id: "{{asset_id}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-work-order"
              with:
                short_description: "{{maintenance_type}} maintenance for {{get-asset.asset_name}}"
                asset_tag: "{{asset_id}}"
                category: "maintenance"
                description: "Scheduled {{maintenance_type}} maintenance for asset {{get-asset.asset_name}} ({{asset_id}})."
            - name: update-asset-status
              type: call
              call: "oracle-ebs.update-asset"
              with:
                asset_id: "{{asset_id}}"
                status: "IN_MAINTENANCE"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{maintenance_team_channel}}"
                text: "Maintenance scheduled for {{get-asset.asset_name}} ({{asset_id}}). Work order: {{create-work-order.number}}. Type: {{maintenance_type}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: assets
          path: "/assets/{{asset_id}}"
          inputParameters:
            - name: asset_id
              in: path
          operations:
            - name: get-asset
              method: GET
            - name: update-asset
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Lists files in an Autodesk Docs project folder, returning names, versions, and last-modified timestamps for BIM document management.

naftiko: "0.5"
info:
  label: "Autodesk Docs File Listing"
  description: "Lists files in an Autodesk Docs project folder, returning names, versions, and last-modified timestamps for BIM document management."
  tags:
    - bim
    - autodesk
capability:
  exposes:
    - type: mcp
      namespace: autodesk-docs
      port: 8080
      tools:
        - name: list-files
          description: "List files in an Autodesk Docs project folder."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Autodesk project ID."
            - name: folder_id
              in: body
              type: string
              description: "The folder ID within the project."
          call: "autodesk.list-folder-contents"
          with:
            project_id: "{{project_id}}"
            folder_id: "{{folder_id}}"
          outputParameters:
            - name: items
              type: array
              mapping: "$.data"
            - name: count
              type: integer
              mapping: "$.total"
  consumes:
    - type: http
      namespace: autodesk
      baseUri: "https://developer.api.autodesk.com/data/v1"
      authentication:
        type: bearer
        token: "$secrets.autodesk_token"
      resources:
        - name: folder-contents
          path: "/projects/{{project_id}}/folders/{{folder_id}}/contents"
          inputParameters:
            - name: project_id
              in: path
            - name: folder_id
              in: path
          operations:
            - name: list-folder-contents
              method: GET

Invokes an AWS Lambda function synchronously, returning the function response payload for serverless infrastructure automation.

naftiko: "0.5"
info:
  label: "AWS Lambda Function Invocation"
  description: "Invokes an AWS Lambda function synchronously, returning the function response payload for serverless infrastructure automation."
  tags:
    - serverless
    - aws-lambda
capability:
  exposes:
    - type: mcp
      namespace: aws-lambda
      port: 8080
      tools:
        - name: invoke-function
          description: "Invoke an AWS Lambda function by name."
          inputParameters:
            - name: function_name
              in: body
              type: string
              description: "The Lambda function name or ARN."
            - name: payload
              in: body
              type: string
              description: "JSON payload to pass to the function."
          call: "lambda.invoke"
          with:
            function_name: "{{function_name}}"
            payload: "{{payload}}"
          outputParameters:
            - name: status_code
              type: integer
              mapping: "$.StatusCode"
            - name: response_payload
              type: string
              mapping: "$.Payload"
  consumes:
    - type: http
      namespace: lambda
      baseUri: "https://lambda.us-east-1.amazonaws.com/2015-03-31"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: functions
          path: "/functions/{{function_name}}/invocations"
          inputParameters:
            - name: function_name
              in: path
          operations:
            - name: invoke
              method: POST

Uploads a file to Azure Blob Storage, returning the blob URL for infrastructure project file management.

naftiko: "0.5"
info:
  label: "Azure Blob Storage Upload"
  description: "Uploads a file to Azure Blob Storage, returning the blob URL for infrastructure project file management."
  tags:
    - cloud-storage
    - azure-blob-storage
capability:
  exposes:
    - type: mcp
      namespace: azure-blob
      port: 8080
      tools:
        - name: upload-blob
          description: "Upload a file to an Azure Blob Storage container."
          inputParameters:
            - name: container
              in: body
              type: string
              description: "The Azure Blob container name."
            - name: blob_name
              in: body
              type: string
              description: "The destination blob name."
          call: "azureblob.put-blob"
          with:
            container: "{{container}}"
            blob_name: "{{blob_name}}"
          outputParameters:
            - name: url
              type: string
              mapping: "$.url"
            - name: etag
              type: string
              mapping: "$.etag"
  consumes:
    - type: http
      namespace: azureblob
      baseUri: "https://bentley.blob.core.windows.net"
      authentication:
        type: apiKey
        name: "x-ms-access-key"
        in: header
        value: "$secrets.azure_storage_key"
      resources:
        - name: blobs
          path: "/{{container}}/{{blob_name}}"
          inputParameters:
            - name: container
              in: path
            - name: blob_name
              in: path
          operations:
            - name: put-blob
              method: PUT

Retrieves the latest build status for a given Azure DevOps pipeline, returning build number, result, start time, and duration.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Lookup"
  description: "Retrieves the latest build status for a given Azure DevOps pipeline, returning build number, result, start time, and duration."
  tags:
    - ci
    - devops
    - azure-devops
    - build
capability:
  exposes:
    - type: mcp
      namespace: devops-builds
      port: 8080
      tools:
        - name: get-build-status
          description: "Look up the latest Azure DevOps build for a given pipeline definition ID."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline definition ID."
          call: "azuredevops.get-latest-build"
          with:
            definition_id: "{{pipeline_id}}"
          outputParameters:
            - name: build_number
              type: string
              mapping: "$.value[0].buildNumber"
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: start_time
              type: string
              mapping: "$.value[0].startTime"
            - name: duration
              type: string
              mapping: "$.value[0].finishTime"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/bentley/_apis/build"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_pat"
      inputParameters:
        - name: api-version
          in: query
          value: "7.0"
      resources:
        - name: builds
          path: "/builds?definitions={{definition_id}}&$top=1&statusFilter=completed"
          inputParameters:
            - name: definition_id
              in: query
          operations:
            - name: get-latest-build
              method: GET

Searches for documents within Bentley ProjectWise by keyword and project, returning matching document metadata and version history.

naftiko: "0.5"
info:
  label: "Bentley ProjectWise Document Search"
  description: "Searches for documents within Bentley ProjectWise by keyword and project, returning matching document metadata and version history."
  tags:
    - document-management
    - projectwise
capability:
  exposes:
    - type: mcp
      namespace: projectwise
      port: 8080
      tools:
        - name: search-documents
          description: "Search for documents in Bentley ProjectWise."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The ProjectWise project identifier."
            - name: keyword
              in: body
              type: string
              description: "Search keyword or phrase."
          call: "projectwise.search"
          with:
            project_id: "{{project_id}}"
            keyword: "{{keyword}}"
          outputParameters:
            - name: documents
              type: array
              mapping: "$.instances"
            - name: total_count
              type: integer
              mapping: "$.totalCount"
  consumes:
    - type: http
      namespace: projectwise
      baseUri: "https://projectwise.bentley.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.projectwise_token"
      resources:
        - name: search
          path: "/projects/{{project_id}}/documents/search"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: search
              method: POST

Runs clash detection on a BIM model via Bentley iTwin, logs results to Jira, uploads the clash report to SharePoint, and notifies the design team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "BIM Clash Detection and Resolution Pipeline"
  description: "Runs clash detection on a BIM model via Bentley iTwin, logs results to Jira, uploads the clash report to SharePoint, and notifies the design team via Microsoft Teams."
  tags:
    - bim
    - clash-detection
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bim-clash
      port: 8080
      tools:
        - name: detect-and-resolve-clashes
          description: "Run clash detection on a BIM model and distribute results to Jira, SharePoint, and Teams."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin model identifier."
            - name: project_key
              in: body
              type: string
              description: "The Jira project key for logging issues."
            - name: teams_channel
              in: body
              type: string
              description: "Microsoft Teams channel ID for notifications."
          steps:
            - name: run-clash-detection
              type: call
              call: "itwin.run-clash-test"
              with:
                model_id: "{{model_id}}"
            - name: create-jira-issues
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "BIM Clash Detected: {{run-clash-detection.clash_count}} clashes in model {{model_id}}"
                description: "Clash detection found {{run-clash-detection.clash_count}} issues. Categories: {{run-clash-detection.categories}}"
                issue_type: "Bug"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "bim_reports_site"
                folder_path: "ClashReports/{{model_id}}"
                file_name: "clash_report_{{model_id}}.pdf"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel}}"
                text: "Clash detection complete for model {{model_id}}: {{run-clash-detection.clash_count}} clashes found. Jira: {{create-jira-issues.key}}. Report: {{upload-report.url}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/clashdetection/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: clash-tests
          path: "/models/{{model_id}}/clashtests"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: run-clash-test
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Validates a BIM model against compliance rules, logs findings in ServiceNow, creates a Jira defect for each violation, and posts a summary to Microsoft Teams.

naftiko: "0.5"
info:
  label: "BIM Model Validation and Compliance Check"
  description: "Validates a BIM model against compliance rules, logs findings in ServiceNow, creates a Jira defect for each violation, and posts a summary to Microsoft Teams."
  tags:
    - engineering
    - bim
    - compliance
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bim-compliance
      port: 8080
      tools:
        - name: trigger-bim-validation
          description: "Given a BIM model ID and compliance ruleset, orchestrate validation across ServiceNow, Jira, and Microsoft Teams."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The BIM model identifier."
            - name: ruleset_id
              in: body
              type: string
              description: "The compliance ruleset to validate against."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for defect logging."
            - name: notify_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel for summary notification."
          steps:
            - name: validate-model
              type: call
              call: "itwin.validate-model"
              with:
                model_id: "{{model_id}}"
                ruleset_id: "{{ruleset_id}}"
            - name: log-findings
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "BIM compliance findings for model {{model_id}}"
                description: "Validation completed. Violations found: {{validate-model.violation_count}}. Ruleset: {{ruleset_id}}."
                category: "compliance"
            - name: create-defect
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "BIM Compliance Violations: Model {{model_id}}"
                issue_type: "Bug"
                description: "{{validate-model.violation_count}} violations found. Details: {{validate-model.summary}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{notify_channel_id}}"
                text: "BIM validation complete for model {{model_id}}: {{validate-model.violation_count}} violations. Jira: {{create-defect.key}}. ServiceNow: {{log-findings.number}}."
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwin/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: validations
          path: "/models/{{model_id}}/validate"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: validate-model
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the latest pull request status for a Bitbucket repository, returning title, state, author, and reviewers.

naftiko: "0.5"
info:
  label: "Bitbucket Pull Request Status"
  description: "Retrieves the latest pull request status for a Bitbucket repository, returning title, state, author, and reviewers."
  tags:
    - development
    - bitbucket
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: code-review
      port: 8080
      tools:
        - name: get-latest-pr
          description: "Look up the latest pull request for a Bitbucket repository."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "The Bitbucket workspace slug."
            - name: repo_slug
              in: body
              type: string
              description: "The repository slug."
          call: "bitbucket.get-latest-pr"
          with:
            workspace: "{{workspace}}"
            repo_slug: "{{repo_slug}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.values[0].title"
            - name: state
              type: string
              mapping: "$.values[0].state"
            - name: author
              type: string
              mapping: "$.values[0].author.display_name"
  consumes:
    - type: http
      namespace: bitbucket
      baseUri: "https://api.bitbucket.org/2.0"
      authentication:
        type: bearer
        token: "$secrets.bitbucket_token"
      resources:
        - name: pull-requests
          path: "/repositories/{{workspace}}/{{repo_slug}}/pullrequests?sort=-created_on&pagelen=1"
          inputParameters:
            - name: workspace
              in: path
            - name: repo_slug
              in: path
          operations:
            - name: get-latest-pr
              method: GET

Retrieves file metadata from Box by file ID, returning name, size, owner, and shared link for engineering document access.

naftiko: "0.5"
info:
  label: "Box File Retrieval"
  description: "Retrieves file metadata from Box by file ID, returning name, size, owner, and shared link for engineering document access."
  tags:
    - collaboration
    - box
    - documents
capability:
  exposes:
    - type: mcp
      namespace: cloud-storage
      port: 8080
      tools:
        - name: get-box-file
          description: "Look up a Box file by ID."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file ID."
          call: "box.get-file"
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: integer
              mapping: "$.size"
            - name: owner
              type: string
              mapping: "$.owned_by.name"
            - name: shared_link
              type: string
              mapping: "$.shared_link.url"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

Retrieves bridge structural model data from iTwin, runs finite element analysis scoring via Azure ML, logs findings in ServiceNow, and posts results to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Bridge Structural Analysis Orchestrator"
  description: "Retrieves bridge structural model data from iTwin, runs finite element analysis scoring via Azure ML, logs findings in ServiceNow, and posts results to Microsoft Teams."
  tags:
    - structural-engineering
    - itwin
    - azure-machine-learning
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bridge-analysis
      port: 8080
      tools:
        - name: analyze-bridge
          description: "Run structural analysis on a bridge model and distribute findings."
          inputParameters:
            - name: bridge_id
              in: body
              type: string
              description: "The bridge model identifier in iTwin."
            - name: teams_channel
              in: body
              type: string
              description: "Microsoft Teams channel for notifications."
          steps:
            - name: get-model-data
              type: call
              call: "itwin.get-element-properties"
              with:
                model_id: "{{bridge_id}}"
            - name: run-analysis
              type: call
              call: "azureml.score"
              with:
                model_type: "bridge_structural"
                data: "{{get-model-data.properties}}"
            - name: log-finding
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Bridge structural analysis: {{bridge_id}}"
                description: "FEA score: {{run-analysis.structural_score}}/100. Risk level: {{run-analysis.risk_level}}. Load capacity: {{run-analysis.load_capacity_tons}} tons."
                category: "structural_assessment"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel}}"
                text: "Bridge {{bridge_id}} analysis complete. Score: {{run-analysis.structural_score}}/100. Risk: {{run-analysis.risk_level}}. ServiceNow: {{log-finding.number}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: elements
          path: "/models/{{model_id}}/elements"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: get-element-properties
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a CAD model is updated in the iTwin platform, logs the change in ServiceNow, updates the Jira engineering task, and notifies stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "CAD Model Change Notification Pipeline"
  description: "When a CAD model is updated in the iTwin platform, logs the change in ServiceNow, updates the Jira engineering task, and notifies stakeholders via Microsoft Teams."
  tags:
    - engineering
    - cad
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cad-change-mgmt
      port: 8080
      tools:
        - name: trigger-model-change-notification
          description: "Given a model change event with model ID and change description, orchestrate notifications across ServiceNow, Jira, and Microsoft Teams."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin model identifier."
            - name: change_description
              in: body
              type: string
              description: "Description of the model change."
            - name: jira_issue_key
              in: body
              type: string
              description: "The associated Jira issue key."
            - name: team_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for notifications."
          steps:
            - name: log-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "CAD model update: {{model_id}}"
                description: "{{change_description}}"
                category: "engineering_change"
            - name: update-jira
              type: call
              call: "jira.add-comment"
              with:
                issue_key: "{{jira_issue_key}}"
                body: "CAD model {{model_id}} updated. Change request: {{log-change.number}}. Details: {{change_description}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{team_channel_id}}"
                text: "Model {{model_id}} has been updated. CR: {{log-change.number}}. Jira: {{jira_issue_key}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: comments
          path: "/issue/{{issue_key}}/comment"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-comment
              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/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Aggregates project milestones from Oracle EBS, financial data from SAP, generates an executive dashboard in Power BI, and distributes the report via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Capital Project Status Reporting Pipeline"
  description: "Aggregates project milestones from Oracle EBS, financial data from SAP, generates an executive dashboard in Power BI, and distributes the report via Microsoft Outlook."
  tags:
    - project-management
    - reporting
    - oracle-e-business-suite
    - sap
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: capital-project-report
      port: 8080
      tools:
        - name: generate-status-report
          description: "Aggregate milestones, financials, generate dashboard, and distribute report."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Oracle EBS project identifier."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
            - name: exec_emails
              in: body
              type: string
              description: "Executive distribution list."
          steps:
            - name: get-milestones
              type: call
              call: "oracle-ebs.get-project-milestones"
              with:
                project_id: "{{project_id}}"
            - name: get-financials
              type: call
              call: "sap.get-cost-center-report"
              with:
                cost_center: "{{cost_center}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: distribute-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{exec_emails}}"
                subject: "Capital Project Status: {{project_id}}"
                body: "Milestones completed: {{get-milestones.completed_count}}/{{get-milestones.total_count}}. Budget utilization: {{get-financials.utilization_pct}}%. Dashboard refreshed."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: milestones
          path: "/projects/{{project_id}}/milestones"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-milestones
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')/to_Actuals"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-report
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Provisions cloud infrastructure on Oracle Cloud, registers the resources in ServiceNow CMDB, creates a Jira story for configuration, and notifies the cloud team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Resource Provisioning Pipeline"
  description: "Provisions cloud infrastructure on Oracle Cloud, registers the resources in ServiceNow CMDB, creates a Jira story for configuration, and notifies the cloud team via Microsoft Teams."
  tags:
    - cloud
    - provisioning
    - oracle-cloud
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-provisioning
      port: 8080
      tools:
        - name: provision-cloud-resources
          description: "Given a resource specification, provision on OCI and register across ServiceNow, Jira, and Microsoft Teams."
          inputParameters:
            - name: resource_type
              in: body
              type: string
              description: "The type of cloud resource to provision (e.g., compute, storage)."
            - name: compartment_id
              in: body
              type: string
              description: "The OCI compartment OCID."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for tracking."
            - name: cloud_team_channel
              in: body
              type: string
              description: "Microsoft Teams channel for cloud team."
          steps:
            - name: provision-resource
              type: call
              call: "oci.create-instance"
              with:
                resource_type: "{{resource_type}}"
                compartment_id: "{{compartment_id}}"
            - name: register-cmdb
              type: call
              call: "servicenow.create-ci"
              with:
                name: "{{provision-resource.display_name}}"
                category: "Cloud Resource"
                environment: "production"
                cloud_provider: "Oracle Cloud"
                resource_id: "{{provision-resource.id}}"
            - name: create-config-story
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Configure {{resource_type}}: {{provision-resource.display_name}}"
                issue_type: "Story"
                description: "New {{resource_type}} provisioned. OCI ID: {{provision-resource.id}}. CMDB CI: {{register-cmdb.sys_id}}."
            - name: notify-cloud-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{cloud_team_channel}}"
                text: "New {{resource_type}} provisioned: {{provision-resource.display_name}}. Jira: {{create-config-story.key}}. CMDB registered."
  consumes:
    - type: http
      namespace: oci
      baseUri: "https://iaas.us-ashburn-1.oraclecloud.com/20160918"
      authentication:
        type: bearer
        token: "$secrets.oci_token"
      resources:
        - name: instances
          path: "/instances"
          operations:
            - name: create-instance
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: create-ci
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Cloudflare DNS records for a given zone, returning record type, name, content, and TTL.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Record Lookup"
  description: "Retrieves Cloudflare DNS records for a given zone, returning record type, name, content, and TTL."
  tags:
    - networking
    - cloudflare
    - dns
capability:
  exposes:
    - type: mcp
      namespace: dns-management
      port: 8080
      tools:
        - name: get-dns-records
          description: "Look up DNS records for a Cloudflare zone."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone ID."
            - name: record_name
              in: body
              type: string
              description: "The DNS record name to filter by."
          call: "cloudflare.list-dns-records"
          with:
            zone_id: "{{zone_id}}"
            name: "{{record_name}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: dns-records
          path: "/zones/{{zone_id}}/dns_records?name={{name}}"
          inputParameters:
            - name: zone_id
              in: path
            - name: name
              in: query
          operations:
            - name: list-dns-records
              method: GET

Captures concrete pour sensor data from Datadog, validates mix compliance in Snowflake, logs results in ServiceNow, and notifies the quality manager via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Concrete Pour Quality Monitoring Pipeline"
  description: "Captures concrete pour sensor data from Datadog, validates mix compliance in Snowflake, logs results in ServiceNow, and notifies the quality manager via Microsoft Outlook."
  tags:
    - construction
    - quality-control
    - datadog
    - snowflake
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: concrete-quality
      port: 8080
      tools:
        - name: monitor-concrete-pour
          description: "Monitor concrete pour quality, validate compliance, log results, and notify."
          inputParameters:
            - name: pour_id
              in: body
              type: string
              description: "The concrete pour identifier."
            - name: quality_manager_email
              in: body
              type: string
              description: "Quality manager email."
          steps:
            - name: get-sensor-data
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:concrete.temperature{pour_id:{{pour_id}}} by {sensor}"
                from: "-4h"
            - name: validate-mix
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL VALIDATE_CONCRETE_MIX('{{pour_id}}')"
                warehouse: "QUALITY_WH"
            - name: log-results
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_quality_inspection"
                pour_id: "{{pour_id}}"
                compliance_status: "{{validate-mix.status}}"
            - name: notify-manager
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{quality_manager_email}}"
                subject: "Concrete Pour QC: {{pour_id}}"
                body: "Pour {{pour_id}} compliance: {{validate-mix.status}}. Temperature: {{get-sensor-data.avg_value}}C. ServiceNow: {{log-results.sys_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves the content of a Confluence wiki page by page ID, returning the title, body, and version for engineering documentation lookup.

naftiko: "0.5"
info:
  label: "Confluence Page Retrieval"
  description: "Retrieves the content of a Confluence wiki page by page ID, returning the title, body, and version for engineering documentation lookup."
  tags:
    - documentation
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: confluence
      port: 8080
      tools:
        - name: get-page
          description: "Retrieve a Confluence page by its ID."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page identifier."
          call: "confluence.get-page-content"
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
            - name: version
              type: integer
              mapping: "$.version.number"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://bentley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=body.storage,version"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page-content
              method: GET

Aggregates construction progress data from Oracle EBS, generates a Power BI dashboard refresh, uploads the summary to SharePoint, and emails stakeholders via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Construction Progress Report Orchestrator"
  description: "Aggregates construction progress data from Oracle EBS, generates a Power BI dashboard refresh, uploads the summary to SharePoint, and emails stakeholders via Microsoft Outlook."
  tags:
    - construction
    - reporting
    - oracle-e-business-suite
    - power-bi
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: construction-reporting
      port: 8080
      tools:
        - name: generate-progress-report
          description: "Given a project ID, aggregate progress data and distribute the report across Power BI, SharePoint, and email."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Oracle EBS project identifier."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the progress dashboard."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: stakeholder_emails
              in: body
              type: string
              description: "Comma-separated email addresses of stakeholders."
          steps:
            - name: get-progress-data
              type: call
              call: "oracle-ebs.get-project-progress"
              with:
                project_id: "{{project_id}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: upload-summary
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "construction_reports_site"
                folder_path: "ProgressReports/{{project_id}}"
                file_name: "progress_report_{{project_id}}.pdf"
            - name: email-stakeholders
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{stakeholder_emails}}"
                subject: "Construction Progress Report: Project {{project_id}}"
                body: "Progress report for project {{project_id}} is available. Completion: {{get-progress-data.percent_complete}}%. Dashboard refreshed. Report: {{upload-summary.url}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: project-progress
          path: "/projects/{{project_id}}/progress"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-progress
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Creates a Request for Information in Jira, links it to the relevant BIM model in iTwin, attaches supporting documents from Box, and notifies the design team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Construction RFI Management Pipeline"
  description: "Creates a Request for Information in Jira, links it to the relevant BIM model in iTwin, attaches supporting documents from Box, and notifies the design team via Microsoft Teams."
  tags:
    - construction
    - rfi
    - jira
    - itwin
    - box
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: construction-rfi
      port: 8080
      tools:
        - name: submit-rfi
          description: "Submit an RFI with model references, documents, and team notifications."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: model_id
              in: body
              type: string
              description: "iTwin model with the design question."
            - name: question
              in: body
              type: string
              description: "The RFI question."
            - name: doc_folder_id
              in: body
              type: string
              description: "Box folder ID with supporting documents."
            - name: design_channel
              in: body
              type: string
              description: "Microsoft Teams design team channel."
          steps:
            - name: create-rfi
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "RFI: {{question}}"
                description: "Model reference: {{model_id}}. Question: {{question}}"
                issue_type: "Task"
            - name: get-model-context
              type: call
              call: "itwin.get-element-properties"
              with:
                model_id: "{{model_id}}"
            - name: get-documents
              type: call
              call: "box.get-folder-items"
              with:
                folder_id: "{{doc_folder_id}}"
            - name: notify-design-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{design_channel}}"
                text: "New RFI: {{create-rfi.key}}. Question: {{question}}. Model: {{model_id}}. Supporting docs: {{get-documents.total_count}} files."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: elements
          path: "/models/{{model_id}}/elements"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: get-element-properties
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Verifies contractor certifications in Workday, checks insurance status via Box document retrieval, creates a compliance record in ServiceNow, and emails the procurement team via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Contractor Compliance Verification Pipeline"
  description: "Verifies contractor certifications in Workday, checks insurance status via Box document retrieval, creates a compliance record in ServiceNow, and emails the procurement team via Microsoft Outlook."
  tags:
    - compliance
    - contractor-management
    - workday
    - box
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: contractor-compliance
      port: 8080
      tools:
        - name: verify-contractor
          description: "Verify contractor certifications, insurance, and compliance status."
          inputParameters:
            - name: contractor_id
              in: body
              type: string
              description: "The contractor employee ID in Workday."
            - name: insurance_folder_id
              in: body
              type: string
              description: "The Box folder ID containing insurance documents."
            - name: procurement_email
              in: body
              type: string
              description: "Procurement team email address."
          steps:
            - name: check-certifications
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{contractor_id}}"
            - name: get-insurance-docs
              type: call
              call: "box.get-folder-items"
              with:
                folder_id: "{{insurance_folder_id}}"
            - name: create-compliance-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_contractor_compliance"
                contractor_id: "{{contractor_id}}"
                certification_status: "{{check-certifications.certification_status}}"
                insurance_docs_count: "{{get-insurance-docs.total_count}}"
            - name: notify-procurement
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{procurement_email}}"
                subject: "Contractor Compliance: {{check-certifications.full_name}}"
                body: "Contractor {{check-certifications.full_name}} verification complete. Certifications: {{check-certifications.certification_status}}. Insurance documents: {{get-insurance-docs.total_count}} on file."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/api/v1/bentley"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves the current status of a Datadog monitor by ID, returning state, name, and last triggered timestamp.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Alert Lookup"
  description: "Retrieves the current status of a Datadog monitor by ID, returning state, name, and last triggered timestamp."
  tags:
    - monitoring
    - infrastructure
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Look up a Datadog monitor by ID. Returns monitor name, overall state, and last triggered time."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: state
              type: string
              mapping: "$.overall_state"
            - name: last_triggered
              type: string
              mapping: "$.overall_state_modified"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        appKey: "$secrets.datadog_app_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Exports design deliverables from iTwin, uploads them to SharePoint, creates a handoff record in Jira, and sends acceptance notification via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Design Deliverable Handoff Orchestrator"
  description: "Exports design deliverables from iTwin, uploads them to SharePoint, creates a handoff record in Jira, and sends acceptance notification via Microsoft Outlook."
  tags:
    - design-management
    - deliverables
    - itwin
    - sharepoint
    - jira
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: design-handoff
      port: 8080
      tools:
        - name: hand-off-deliverable
          description: "Export, upload, track, and notify for a design deliverable handoff."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin model identifier."
            - name: deliverable_name
              in: body
              type: string
              description: "Name of the deliverable."
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: recipient_email
              in: body
              type: string
              description: "Recipient email for acceptance."
          steps:
            - name: export-model
              type: call
              call: "itwin.export-model"
              with:
                model_id: "{{model_id}}"
                format: "ifc"
            - name: upload-deliverable
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "deliverables_site"
                folder_path: "Handoffs/{{deliverable_name}}"
                file_name: "{{deliverable_name}}.ifc"
            - name: create-handoff-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Design Handoff: {{deliverable_name}}"
                description: "Deliverable exported from model {{model_id}}. SharePoint: {{upload-deliverable.url}}"
                issue_type: "Task"
            - name: notify-recipient
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{recipient_email}}"
                subject: "Design Deliverable Ready: {{deliverable_name}}"
                body: "Deliverable {{deliverable_name}} is ready for acceptance. Download: {{upload-deliverable.url}}. Jira: {{create-handoff-ticket.key}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: exports
          path: "/models/{{model_id}}/export"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: export-model
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Extracts design parameters from iTwin, validates against regulatory standards in Snowflake, creates non-compliance tickets in Jira, and generates a compliance report in Power BI.

naftiko: "0.5"
info:
  label: "Design Standards Compliance Check Pipeline"
  description: "Extracts design parameters from iTwin, validates against regulatory standards in Snowflake, creates non-compliance tickets in Jira, and generates a compliance report in Power BI."
  tags:
    - design-compliance
    - standards
    - itwin
    - snowflake
    - jira
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: design-compliance
      port: 8080
      tools:
        - name: check-design-compliance
          description: "Validate design parameters against standards and report non-compliance."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin model identifier."
            - name: standard_code
              in: body
              type: string
              description: "The design standard code to check against."
            - name: project_key
              in: body
              type: string
              description: "Jira project for non-compliance tickets."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
          steps:
            - name: extract-parameters
              type: call
              call: "itwin.get-design-parameters"
              with:
                model_id: "{{model_id}}"
            - name: validate-standards
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL CHECK_DESIGN_STANDARDS('{{model_id}}', '{{standard_code}}')"
                warehouse: "COMPLIANCE_WH"
            - name: create-noncompliance-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Non-compliance: {{validate-standards.violation_count}} violations against {{standard_code}}"
                description: "Model {{model_id}} has {{validate-standards.violation_count}} violations. Details: {{validate-standards.violations}}"
                issue_type: "Bug"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: design-params
          path: "/models/{{model_id}}/parameters"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: get-design-parameters
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Synchronizes a digital twin model from the iTwin platform with Snowflake analytics tables, updates the asset registry in Oracle EBS, and notifies the engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Digital Twin Synchronization Pipeline"
  description: "Synchronizes a digital twin model from the iTwin platform with Snowflake analytics tables, updates the asset registry in Oracle EBS, and notifies the engineering team via Microsoft Teams."
  tags:
    - digital-twin
    - synchronization
    - snowflake
    - oracle-e-business-suite
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: digital-twin-sync
      port: 8080
      tools:
        - name: sync-digital-twin
          description: "Given an iTwin model ID, synchronize data to Snowflake and Oracle EBS, then notify the team."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin digital twin model identifier."
            - name: asset_id
              in: body
              type: string
              description: "The corresponding Oracle EBS asset ID."
            - name: notify_channel
              in: body
              type: string
              description: "Microsoft Teams channel for sync notifications."
          steps:
            - name: get-twin-data
              type: call
              call: "itwin.get-model"
              with:
                model_id: "{{model_id}}"
            - name: update-snowflake
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "MERGE INTO DIGITAL_TWINS USING (SELECT '{{model_id}}' as model_id, '{{get-twin-data.last_modified}}' as last_sync) src ON DIGITAL_TWINS.model_id = src.model_id WHEN MATCHED THEN UPDATE SET last_sync = src.last_sync"
                warehouse: "ENGINEERING_WH"
            - name: update-oracle-asset
              type: call
              call: "oracle-ebs.update-asset"
              with:
                asset_id: "{{asset_id}}"
                digital_twin_ref: "{{model_id}}"
                last_sync: "{{get-twin-data.last_modified}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{notify_channel}}"
                text: "Digital twin {{model_id}} synchronized. Asset {{asset_id}} updated. Last modified: {{get-twin-data.last_modified}}."
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwin/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: models
          path: "/models/{{model_id}}"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: get-model
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: assets
          path: "/assets/{{asset_id}}"
          inputParameters:
            - name: asset_id
              in: path
          operations:
            - name: update-asset
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Scans a Docker container image for known vulnerabilities using Snyk Container, returning findings and severity scores.

naftiko: "0.5"
info:
  label: "Docker Image Vulnerability Scan"
  description: "Scans a Docker container image for known vulnerabilities using Snyk Container, returning findings and severity scores."
  tags:
    - security
    - snyk
capability:
  exposes:
    - type: mcp
      namespace: container-security
      port: 8080
      tools:
        - name: scan-image
          description: "Scan a Docker image for vulnerabilities."
          inputParameters:
            - name: image
              in: body
              type: string
              description: "The Docker image reference (e.g., registry/repo:tag)."
          call: "snyk.test-image"
          with:
            image: "{{image}}"
          outputParameters:
            - name: vulnerability_count
              type: integer
              mapping: "$.summary.totalVulnerabilities"
            - name: critical_count
              type: integer
              mapping: "$.summary.criticalVulnerabilities"
  consumes:
    - type: http
      namespace: snyk
      baseUri: "https://api.snyk.io/v1"
      authentication:
        type: bearer
        token: "$secrets.snyk_token"
      resources:
        - name: test
          path: "/test/docker"
          operations:
            - name: test-image
              method: POST

Retrieves drone imagery from S3, processes point clouds in iTwin, generates orthomosaics, stores results in Azure Blob Storage, and notifies the survey team via Slack.

naftiko: "0.5"
info:
  label: "Drone Survey Processing Pipeline"
  description: "Retrieves drone imagery from S3, processes point clouds in iTwin, generates orthomosaics, stores results in Azure Blob Storage, and notifies the survey team via Slack."
  tags:
    - drone-survey
    - point-cloud
    - amazon-s3
    - itwin
    - azure-blob-storage
    - slack
capability:
  exposes:
    - type: mcp
      namespace: drone-survey
      port: 8080
      tools:
        - name: process-drone-survey
          description: "Process drone survey imagery through point cloud generation and distribution."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "S3 bucket containing drone imagery."
            - name: imagery_prefix
              in: body
              type: string
              description: "S3 key prefix for the imagery set."
            - name: model_id
              in: body
              type: string
              description: "iTwin model ID for point cloud processing."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for survey team."
          steps:
            - name: list-imagery
              type: call
              call: "s3.list-objects"
              with:
                bucket: "{{bucket}}"
                prefix: "{{imagery_prefix}}"
            - name: process-point-cloud
              type: call
              call: "itwin.create-reality-data"
              with:
                model_id: "{{model_id}}"
                source_bucket: "{{bucket}}"
                source_prefix: "{{imagery_prefix}}"
            - name: store-results
              type: call
              call: "azureblob.put-blob"
              with:
                container: "survey-results"
                blob_name: "{{model_id}}/orthomosaic.tif"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Drone survey processed for model {{model_id}}. Images: {{list-imagery.count}}. Point cloud: {{process-point-cloud.point_count}} points. Results: {{store-results.url}}"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/"
          operations:
            - name: list-objects
              method: GET
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/realitydata/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: reality-data
          path: "/models/{{model_id}}/realitydata"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: create-reality-data
              method: POST
    - type: http
      namespace: azureblob
      baseUri: "https://bentley.blob.core.windows.net"
      authentication:
        type: apiKey
        name: "x-ms-access-key"
        in: header
        value: "$secrets.azure_storage_key"
      resources:
        - name: blobs
          path: "/{{container}}/{{blob_name}}"
          inputParameters:
            - name: container
              in: path
            - name: blob_name
              in: path
          operations:
            - name: put-blob
              method: PUT
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves an active Dynatrace problem by ID, returning title, severity, impact level, and affected entities.

naftiko: "0.5"
info:
  label: "Dynatrace Problem Detection Lookup"
  description: "Retrieves an active Dynatrace problem by ID, returning title, severity, impact level, and affected entities."
  tags:
    - monitoring
    - dynatrace
    - problem-detection
capability:
  exposes:
    - type: mcp
      namespace: apm-problems
      port: 8080
      tools:
        - name: get-problem
          description: "Look up a Dynatrace problem by ID."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "The Dynatrace problem ID."
          call: "dynatrace.get-problem"
          with:
            problem_id: "{{problem_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: severity
              type: string
              mapping: "$.severityLevel"
            - name: impact
              type: string
              mapping: "$.impactLevel"
            - name: affected_entities
              type: string
              mapping: "$.affectedEntities[0].name"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://bentley.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET

Executes a search query against an Elasticsearch index, returning matching documents for infrastructure log analysis.

naftiko: "0.5"
info:
  label: "Elastic Search Log Query"
  description: "Executes a search query against an Elasticsearch index, returning matching documents for infrastructure log analysis."
  tags:
    - search
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: elasticsearch
      port: 8080
      tools:
        - name: search-index
          description: "Execute a search query against an Elasticsearch index."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "The Elasticsearch index name."
            - name: query
              in: body
              type: string
              description: "The search query string."
          call: "elasticsearch.search"
          with:
            index: "{{index}}"
            q: "{{query}}"
          outputParameters:
            - name: total_hits
              type: integer
              mapping: "$.hits.total.value"
            - name: results
              type: array
              mapping: "$.hits.hits"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://elasticsearch.bentley.com:9200"
      authentication:
        type: basic
        username: "$secrets.elasticsearch_user"
        password: "$secrets.elasticsearch_password"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search
              method: GET

Collects building energy data from Snowflake, predicts consumption patterns via Azure ML, updates facility records in SAP, and reports savings to executives via Power BI.

naftiko: "0.5"
info:
  label: "Energy Consumption Optimization Pipeline"
  description: "Collects building energy data from Snowflake, predicts consumption patterns via Azure ML, updates facility records in SAP, and reports savings to executives via Power BI."
  tags:
    - energy-management
    - optimization
    - snowflake
    - azure-machine-learning
    - sap
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: energy-optimization
      port: 8080
      tools:
        - name: optimize-energy
          description: "Analyze energy consumption, predict patterns, update facilities, and report."
          inputParameters:
            - name: building_id
              in: body
              type: string
              description: "The building identifier."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
          steps:
            - name: get-energy-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ENERGY_CONSUMPTION WHERE building_id = '{{building_id}}' AND reading_date >= DATEADD(month, -3, CURRENT_DATE())"
                warehouse: "FACILITIES_WH"
            - name: predict-consumption
              type: call
              call: "azureml.score"
              with:
                model_type: "energy_consumption"
                data: "{{get-energy-data.results}}"
            - name: update-facility
              type: call
              call: "sap.update-facility"
              with:
                building_id: "{{building_id}}"
                predicted_savings: "{{predict-consumption.predicted_savings_kwh}}"
                optimization_plan: "{{predict-consumption.recommendations}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_FACILITY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: facilities
          path: "/A_Facility('{{building_id}}')"
          inputParameters:
            - name: building_id
              in: path
          operations:
            - name: update-facility
              method: PATCH
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Creates an engineering change request in Jira, updates the affected BIM model version in iTwin, notifies approvers via Microsoft Teams, and archives the request in SharePoint.

naftiko: "0.5"
info:
  label: "Engineering Change Request Workflow"
  description: "Creates an engineering change request in Jira, updates the affected BIM model version in iTwin, notifies approvers via Microsoft Teams, and archives the request in SharePoint."
  tags:
    - change-management
    - jira
    - itwin
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: engineering-change
      port: 8080
      tools:
        - name: submit-change-request
          description: "Submit an engineering change request across Jira, iTwin, Teams, and SharePoint."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin model affected by the change."
            - name: change_summary
              in: body
              type: string
              description: "Summary of the proposed change."
            - name: approver_channel
              in: body
              type: string
              description: "Microsoft Teams channel for approvers."
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
          steps:
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "ECR: {{change_summary}}"
                description: "Engineering change request for model {{model_id}}. {{change_summary}}"
                issue_type: "Story"
            - name: tag-model-version
              type: call
              call: "itwin.create-named-version"
              with:
                model_id: "{{model_id}}"
                name: "ECR-{{create-ticket.key}}"
                description: "Baseline before change: {{change_summary}}"
            - name: notify-approvers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{approver_channel}}"
                text: "New ECR submitted: {{create-ticket.key}}. Model: {{model_id}}. Change: {{change_summary}}. Baseline version: {{tag-model-version.version_id}}"
            - name: archive-request
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "ecr_archive_site"
                folder_path: "ChangeRequests/{{create-ticket.key}}"
                file_name: "ecr_{{create-ticket.key}}.json"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: named-versions
          path: "/models/{{model_id}}/namedversions"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: create-named-version
              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/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Searches the Bentley SharePoint knowledge base for engineering standards and returns matching document titles and URLs.

naftiko: "0.5"
info:
  label: "Engineering Knowledge Base Search"
  description: "Searches the Bentley SharePoint knowledge base for engineering standards and returns matching document titles and URLs."
  tags:
    - knowledge-management
    - sharepoint
    - search
capability:
  exposes:
    - type: mcp
      namespace: kb-search
      port: 8080
      tools:
        - name: search-knowledge-base
          description: "Search the SharePoint knowledge base for engineering documents."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The search query string."
          call: "sharepoint.search"
          with:
            query: "{{query}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/search/query"
          operations:
            - name: search
              method: POST

At sprint end, pulls Jira sprint metrics, creates a SharePoint retrospective document, posts the summary to the engineering Microsoft Teams channel, and updates the Power BI sprint dashboard.

naftiko: "0.5"
info:
  label: "Engineering Sprint Retrospective Pipeline"
  description: "At sprint end, pulls Jira sprint metrics, creates a SharePoint retrospective document, posts the summary to the engineering Microsoft Teams channel, and updates the Power BI sprint dashboard."
  tags:
    - agile
    - sprint
    - jira
    - sharepoint
    - microsoft-teams
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: agile-retro
      port: 8080
      tools:
        - name: run-sprint-retro
          description: "Given a Jira sprint ID, generate retrospective artifacts across SharePoint, Microsoft Teams, and Power BI."
          inputParameters:
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID."
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID."
            - name: team_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel for the engineering team."
            - name: bi_dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for sprint metrics."
            - name: bi_group_id
              in: body
              type: string
              description: "Power BI workspace ID."
          steps:
            - name: get-sprint-report
              type: call
              call: "jira.get-sprint-report"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: create-retro-doc
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "engineering_team_site"
                folder_path: "Retrospectives/Sprint_{{sprint_id}}"
                file_name: "retro_sprint_{{sprint_id}}.md"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{team_channel_id}}"
                text: "Sprint {{sprint_id}} complete. Completed: {{get-sprint-report.completed_issues}}. Carried over: {{get-sprint-report.incomplete_issues}}. Velocity: {{get-sprint-report.velocity}} pts."
            - name: refresh-bi
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{bi_group_id}}"
                dataset_id: "{{bi_dataset_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Collects environmental sensor data from Snowflake, runs impact analysis in Azure ML, generates a compliance report in Power BI, and notifies regulators via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Environmental Impact Assessment Pipeline"
  description: "Collects environmental sensor data from Snowflake, runs impact analysis in Azure ML, generates a compliance report in Power BI, and notifies regulators via Microsoft Outlook."
  tags:
    - environmental
    - compliance
    - snowflake
    - azure-machine-learning
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: environmental-impact
      port: 8080
      tools:
        - name: assess-environmental-impact
          description: "Collect sensor data, run impact analysis, generate report, and notify regulators."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The infrastructure site identifier."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: regulator_email
              in: body
              type: string
              description: "Regulator email address."
          steps:
            - name: get-sensor-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ENV_SENSOR_READINGS WHERE site_id = '{{site_id}}' AND reading_date >= DATEADD(day, -30, CURRENT_DATE())"
                warehouse: "ENV_WH"
            - name: run-impact-analysis
              type: call
              call: "azureml.score"
              with:
                model_type: "environmental_impact"
                data: "{{get-sensor-data.results}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-regulator
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{regulator_email}}"
                subject: "Environmental Impact Assessment: Site {{site_id}}"
                body: "Impact score: {{run-impact-analysis.impact_score}}. Compliance status: {{run-impact-analysis.compliance_status}}. Dashboard refreshed for review."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Collects vehicle telematics from Datadog, analyzes fleet utilization in Snowflake, updates asset records in SAP, and distributes the fleet report via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Fleet Telematics Reporting Pipeline"
  description: "Collects vehicle telematics from Datadog, analyzes fleet utilization in Snowflake, updates asset records in SAP, and distributes the fleet report via Microsoft Outlook."
  tags:
    - fleet-management
    - telematics
    - datadog
    - snowflake
    - sap
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: fleet-telematics
      port: 8080
      tools:
        - name: generate-fleet-report
          description: "Collect telematics, analyze utilization, update assets, and distribute report."
          inputParameters:
            - name: fleet_id
              in: body
              type: string
              description: "The fleet group identifier."
            - name: report_email
              in: body
              type: string
              description: "Distribution email for the fleet report."
          steps:
            - name: get-telematics
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:fleet.utilization{fleet:{{fleet_id}}} by {vehicle}"
                from: "-24h"
            - name: analyze-utilization
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL ANALYZE_FLEET_UTILIZATION('{{fleet_id}}')"
                warehouse: "FLEET_WH"
            - name: update-assets
              type: call
              call: "sap.update-fleet-status"
              with:
                fleet_id: "{{fleet_id}}"
                utilization: "{{analyze-utilization.avg_utilization}}"
            - name: send-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{report_email}}"
                subject: "Fleet Telematics Report: {{fleet_id}}"
                body: "Fleet {{fleet_id}} utilization: {{analyze-utilization.avg_utilization}}%. Vehicles: {{analyze-utilization.vehicle_count}}. Idle time: {{analyze-utilization.total_idle_hours}}h."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_FLEET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fleets
          path: "/A_Fleet('{{fleet_id}}')"
          inputParameters:
            - name: fleet_id
              in: path
          operations:
            - name: update-fleet-status
              method: PATCH
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Ingests geospatial survey data from an S3 bucket, registers it in the iTwin platform, creates a Snowflake table entry, and notifies the GIS team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Geospatial Data Ingestion Pipeline"
  description: "Ingests geospatial survey data from an S3 bucket, registers it in the iTwin platform, creates a Snowflake table entry, and notifies the GIS team via Microsoft Teams."
  tags:
    - geospatial
    - data-ingestion
    - amazon-s3
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: geo-ingestion
      port: 8080
      tools:
        - name: ingest-survey-data
          description: "Given an S3 URI for survey data, register in iTwin and Snowflake, then notify the GIS team."
          inputParameters:
            - name: s3_uri
              in: body
              type: string
              description: "The S3 URI of the survey data file."
            - name: project_id
              in: body
              type: string
              description: "The iTwin project ID."
            - name: team_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel for GIS team notifications."
          steps:
            - name: register-in-itwin
              type: call
              call: "itwin.register-data"
              with:
                project_id: "{{project_id}}"
                source_uri: "{{s3_uri}}"
                data_type: "geospatial_survey"
            - name: create-table-entry
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO GEO_SURVEYS (project_id, s3_uri, itwin_ref, ingested_at) VALUES ('{{project_id}}', '{{s3_uri}}', '{{register-in-itwin.data_id}}', CURRENT_TIMESTAMP())"
                warehouse: "GEO_WH"
            - name: notify-gis-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{team_channel_id}}"
                text: "New survey data ingested for project {{project_id}}. iTwin ref: {{register-in-itwin.data_id}}. Source: {{s3_uri}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwin/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: data-registrations
          path: "/projects/{{project_id}}/data"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: register-data
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Extracts GIS feature layers from iTwin, transforms and loads them into Snowflake, validates spatial accuracy, and updates Google Maps overlays for field teams.

naftiko: "0.5"
info:
  label: "GIS Data Synchronization Pipeline"
  description: "Extracts GIS feature layers from iTwin, transforms and loads them into Snowflake, validates spatial accuracy, and updates Google Maps overlays for field teams."
  tags:
    - gis
    - data-synchronization
    - itwin
    - snowflake
    - google-maps
capability:
  exposes:
    - type: mcp
      namespace: gis-sync
      port: 8080
      tools:
        - name: sync-gis-data
          description: "Extract GIS features, load to Snowflake, validate, and update maps."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "iTwin model with GIS features."
            - name: layer_name
              in: body
              type: string
              description: "The GIS layer to synchronize."
          steps:
            - name: extract-features
              type: call
              call: "itwin.get-spatial-features"
              with:
                model_id: "{{model_id}}"
                layer: "{{layer_name}}"
            - name: load-to-warehouse
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL LOAD_GIS_FEATURES('{{model_id}}', '{{layer_name}}')"
                warehouse: "GIS_WH"
            - name: validate-spatial
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL VALIDATE_SPATIAL_ACCURACY('{{model_id}}', '{{layer_name}}')"
                warehouse: "GIS_WH"
            - name: update-map-overlay
              type: call
              call: "googlemaps.update-dataset"
              with:
                dataset_id: "{{layer_name}}"
                features: "{{extract-features.geojson}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: spatial
          path: "/models/{{model_id}}/spatial/{{layer}}"
          inputParameters:
            - name: model_id
              in: path
            - name: layer
              in: path
          operations:
            - name: get-spatial-features
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: googlemaps
      baseUri: "https://mapsplatformdatasets.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_maps_token"
      resources:
        - name: datasets
          path: "/projects/bentley/datasets/{{dataset_id}}"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: update-dataset
              method: PATCH

Fetches repository metadata from GitHub including open issues count, stars, and default branch for a given Bentley Systems repository.

naftiko: "0.5"
info:
  label: "GitHub Repository Insights"
  description: "Fetches repository metadata from GitHub including open issues count, stars, and default branch for a given Bentley Systems repository."
  tags:
    - development
    - github
    - repository
capability:
  exposes:
    - type: mcp
      namespace: dev-insights
      port: 8080
      tools:
        - name: get-repo-info
          description: "Look up a GitHub repository by owner and name. Returns open issues count, stars, and default branch."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The repository name (e.g., bentley/iTwin-platform)."
          call: "github.get-repo"
          with:
            repo_name: "{{repo_name}}"
          outputParameters:
            - name: open_issues
              type: integer
              mapping: "$.open_issues_count"
            - name: stars
              type: integer
              mapping: "$.stargazers_count"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo_name}}"
          inputParameters:
            - name: repo_name
              in: path
          operations:
            - name: get-repo
              method: GET

Retrieves the latest GitLab CI/CD pipeline status for a given project, returning pipeline ID, status, and ref branch.

naftiko: "0.5"
info:
  label: "GitLab Pipeline Status"
  description: "Retrieves the latest GitLab CI/CD pipeline status for a given project, returning pipeline ID, status, and ref branch."
  tags:
    - ci
    - gitlab
    - pipeline
capability:
  exposes:
    - type: mcp
      namespace: ci-pipelines
      port: 8080
      tools:
        - name: get-pipeline-status
          description: "Look up the latest GitLab pipeline for a project."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GitLab project ID."
          call: "gitlab.get-latest-pipeline"
          with:
            project_id: "{{project_id}}"
          outputParameters:
            - name: pipeline_id
              type: integer
              mapping: "$[0].id"
            - name: status
              type: string
              mapping: "$[0].status"
            - name: ref
              type: string
              mapping: "$[0].ref"
  consumes:
    - type: http
      namespace: gitlab
      baseUri: "https://gitlab.bentley.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.gitlab_token"
      resources:
        - name: pipelines
          path: "/projects/{{project_id}}/pipelines?per_page=1"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-latest-pipeline
              method: GET

Retrieves Google Analytics traffic metrics for the Bentley website, returning page views, sessions, and bounce rate for a given date range.

naftiko: "0.5"
info:
  label: "Google Analytics Traffic Report"
  description: "Retrieves Google Analytics traffic metrics for the Bentley website, returning page views, sessions, and bounce rate for a given date range."
  tags:
    - marketing
    - google-analytics
    - web-traffic
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-traffic-report
          description: "Retrieve Google Analytics traffic metrics for a date range."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The GA4 property ID."
            - name: start_date
              in: body
              type: string
              description: "Start date (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "End date (YYYY-MM-DD)."
          call: "ga.run-report"
          with:
            property_id: "{{property_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

Creates a snapshot of a Grafana dashboard for sharing infrastructure performance metrics with stakeholders.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Snapshot"
  description: "Creates a snapshot of a Grafana dashboard for sharing infrastructure performance metrics with stakeholders."
  tags:
    - monitoring
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: create-snapshot
          description: "Create a shareable snapshot of a Grafana dashboard."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The Grafana dashboard UID."
            - name: expires_in
              in: body
              type: integer
              description: "Snapshot expiry in seconds."
          call: "grafana.create-snapshot"
          with:
            dashboard_uid: "{{dashboard_uid}}"
            expires: "{{expires_in}}"
          outputParameters:
            - name: snapshot_url
              type: string
              mapping: "$.url"
            - name: snapshot_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.bentley.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: snapshots
          path: "/snapshots"
          operations:
            - name: create-snapshot
              method: POST

Reads a secret from HashiCorp Vault KV secrets engine, used for secure credential retrieval in infrastructure pipelines.

naftiko: "0.5"
info:
  label: "HashiCorp Vault Secret Read"
  description: "Reads a secret from HashiCorp Vault KV secrets engine, used for secure credential retrieval in infrastructure pipelines."
  tags:
    - secrets-management
    - hashicorp-vault
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: read-secret
          description: "Read a secret from HashiCorp Vault."
          inputParameters:
            - name: secret_path
              in: body
              type: string
              description: "The secret path in Vault (e.g., secret/data/my-app)."
          call: "vault.read-secret"
          with:
            path: "{{secret_path}}"
          outputParameters:
            - name: data
              type: object
              mapping: "$.data.data"
            - name: metadata
              type: object
              mapping: "$.data.metadata"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.bentley.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: read-secret
              method: GET

Retrieves a HubSpot contact by email address, returning name, company, lifecycle stage, and lead status.

naftiko: "0.5"
info:
  label: "HubSpot Contact Lookup"
  description: "Retrieves a HubSpot contact by email address, returning name, company, lifecycle stage, and lead status."
  tags:
    - marketing
    - hubspot
    - contacts
capability:
  exposes:
    - type: mcp
      namespace: marketing-crm
      port: 8080
      tools:
        - name: get-contact
          description: "Look up a HubSpot contact by email."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The contact email address."
          call: "hubspot.get-contact-by-email"
          with:
            email: "{{email}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.properties.firstname"
            - name: company
              type: string
              mapping: "$.properties.company"
            - name: lifecycle_stage
              type: string
              mapping: "$.properties.lifecyclestage"
            - name: lead_status
              type: string
              mapping: "$.properties.hs_lead_status"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{email}}?idProperty=email"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-contact-by-email
              method: GET

Triggers an Informatica Cloud data integration task and returns the run ID and status for ETL monitoring.

naftiko: "0.5"
info:
  label: "Informatica Data Pipeline Trigger"
  description: "Triggers an Informatica Cloud data integration task and returns the run ID and status for ETL monitoring."
  tags:
    - data-integration
    - informatica
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-integration
      port: 8080
      tools:
        - name: trigger-informatica-task
          description: "Trigger an Informatica Cloud task by task ID."
          inputParameters:
            - name: task_id
              in: body
              type: string
              description: "The Informatica Cloud task ID."
            - name: task_type
              in: body
              type: string
              description: "The task type (e.g., DSS, MTT)."
          call: "informatica.start-task"
          with:
            taskId: "{{task_id}}"
            taskType: "{{task_type}}"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: jobs
          path: "/job"
          operations:
            - name: start-task
              method: POST

When a design document is uploaded to SharePoint, creates a Jira review task, assigns it via Workday org lookup, and posts a review request to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Infrastructure Design Review Pipeline"
  description: "When a design document is uploaded to SharePoint, creates a Jira review task, assigns it via Workday org lookup, and posts a review request to the engineering Microsoft Teams channel."
  tags:
    - engineering
    - design-review
    - sharepoint
    - jira
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: design-review
      port: 8080
      tools:
        - name: trigger-design-review
          description: "Given a SharePoint document URL and reviewer employee ID, orchestrate a design review workflow across Jira, Workday, and Microsoft Teams."
          inputParameters:
            - name: document_url
              in: body
              type: string
              description: "SharePoint URL of the design document."
            - name: reviewer_employee_id
              in: body
              type: string
              description: "Workday employee ID of the designated reviewer."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for the review task."
          steps:
            - name: get-reviewer
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{reviewer_employee_id}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Design Review: {{document_url}}"
                issue_type: "Task"
                assignee: "{{get-reviewer.work_email}}"
                description: "Please review the infrastructure design document at {{document_url}}."
            - name: notify-reviewer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-reviewer.work_email}}"
                text: "You have been assigned a design review: {{create-review-task.key}}. Document: {{document_url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a critical Datadog alert fires, creates a ServiceNow P1 incident, pages the on-call engineer via Microsoft Teams, and opens a Jira tracking issue.

naftiko: "0.5"
info:
  label: "Infrastructure Incident Response Orchestrator"
  description: "When a critical Datadog alert fires, creates a ServiceNow P1 incident, pages the on-call engineer via Microsoft Teams, and opens a Jira tracking issue."
  tags:
    - incident-response
    - datadog
    - servicenow
    - microsoft-teams
    - jira
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: trigger-incident-response
          description: "Given a Datadog alert ID, orchestrate P1 incident creation across ServiceNow, Microsoft Teams, and Jira."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert event ID."
            - name: on_call_email
              in: body
              type: string
              description: "Email of the on-call engineer."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for incident tracking."
          steps:
            - name: get-alert
              type: call
              call: "datadog.get-event"
              with:
                event_id: "{{alert_id}}"
            - name: create-p1-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "P1: {{get-alert.title}}"
                priority: "1"
                category: "infrastructure"
                description: "Critical alert from Datadog: {{get-alert.text}}"
            - name: page-oncall
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{on_call_email}}"
                text: "P1 INCIDENT: {{get-alert.title}}. ServiceNow: {{create-p1-incident.number}}. Respond immediately."
            - name: create-tracking-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "P1 Incident: {{get-alert.title}}"
                issue_type: "Bug"
                priority: "Highest"
                description: "ServiceNow: {{create-p1-incident.number}}. Alert: {{get-alert.text}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        appKey: "$secrets.datadog_app_key"
      resources:
        - name: events
          path: "/events/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

On new infrastructure project creation in Oracle E-Business Suite, opens a ServiceNow project ticket, provisions a SharePoint document library, and notifies the project team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Infrastructure Project Onboarding Orchestrator"
  description: "On new infrastructure project creation in Oracle E-Business Suite, opens a ServiceNow project ticket, provisions a SharePoint document library, and notifies the project team in Microsoft Teams."
  tags:
    - infrastructure
    - onboarding
    - oracle-e-business-suite
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: project-onboarding
      port: 8080
      tools:
        - name: trigger-project-onboarding
          description: "Given an Oracle EBS project ID, orchestrate the full project onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Oracle EBS project identifier."
            - name: project_name
              in: body
              type: string
              description: "The human-readable project name."
            - name: project_manager_email
              in: body
              type: string
              description: "Email address of the assigned project manager."
          steps:
            - name: get-project
              type: call
              call: "oracle-ebs.get-project"
              with:
                project_id: "{{project_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New infrastructure project: {{project_name}}"
                category: "project_onboarding"
                assigned_group: "Engineering_PMO"
                description: "Onboarding for project {{project_name}} ({{project_id}}), managed by {{project_manager_email}}."
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "engineering_projects_site"
                folder_path: "Projects/{{project_name}}_{{project_id}}"
            - name: send-notification
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{project_manager_email}}"
                text: "Project {{project_name}} is live. ServiceNow ticket: {{open-ticket.number}}. Documents: {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: projects
          path: "/projects/{{project_id}}"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.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/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls risk assessment data from ServiceNow, scores risks via Snowflake analytics, updates the risk register in SharePoint, and emails the risk committee via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Infrastructure Risk Register Update Pipeline"
  description: "Pulls risk assessment data from ServiceNow, scores risks via Snowflake analytics, updates the risk register in SharePoint, and emails the risk committee via Microsoft Outlook."
  tags:
    - risk-management
    - servicenow
    - snowflake
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: risk-register
      port: 8080
      tools:
        - name: update-risk-register
          description: "Pull risk data, score, update register, and notify committee."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The project identifier."
            - name: committee_email
              in: body
              type: string
              description: "Risk committee distribution list."
          steps:
            - name: get-risks
              type: call
              call: "servicenow.get-records"
              with:
                table: "u_risk_assessment"
                query: "project_id={{project_id}}"
            - name: score-risks
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL SCORE_PROJECT_RISKS('{{project_id}}')"
                warehouse: "RISK_WH"
            - name: update-register
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "risk_management_site"
                folder_path: "RiskRegisters/{{project_id}}"
                file_name: "risk_register_{{project_id}}.xlsx"
            - name: notify-committee
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{committee_email}}"
                subject: "Risk Register Updated: Project {{project_id}}"
                body: "Risk register updated with {{get-risks.count}} risks. Top risk score: {{score-risks.max_score}}. Register: {{update-register.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: get-records
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Promotes an iTwin model version from staging to production, runs SonarQube quality checks on associated code, updates the Jira release ticket, and notifies the team via Slack.

naftiko: "0.5"
info:
  label: "iTwin Model Version Promotion Pipeline"
  description: "Promotes an iTwin model version from staging to production, runs SonarQube quality checks on associated code, updates the Jira release ticket, and notifies the team via Slack."
  tags:
    - model-management
    - itwin
    - sonarqube
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: model-promotion
      port: 8080
      tools:
        - name: promote-model-version
          description: "Promote a model version through quality checks, ticketing, and notifications."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin model identifier."
            - name: version
              in: body
              type: string
              description: "The model version to promote."
            - name: jira_key
              in: body
              type: string
              description: "The Jira release ticket key."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel ID for notifications."
          steps:
            - name: promote-version
              type: call
              call: "itwin.promote-changeset"
              with:
                model_id: "{{model_id}}"
                version: "{{version}}"
            - name: quality-check
              type: call
              call: "sonarqube.get-quality-gate"
              with:
                project_key: "model-{{model_id}}"
            - name: update-ticket
              type: call
              call: "jira.transition-issue"
              with:
                issue_key: "{{jira_key}}"
                transition: "Done"
                comment: "Model {{model_id}} v{{version}} promoted. Quality gate: {{quality-check.status}}."
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Model {{model_id}} v{{version}} promoted to production. Quality: {{quality-check.status}}. Jira: {{jira_key}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: changesets
          path: "/models/{{model_id}}/changesets/{{version}}/promote"
          inputParameters:
            - name: model_id
              in: path
            - name: version
              in: path
          operations:
            - name: promote-changeset
              method: POST
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.bentley.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: transitions
          path: "/issue/{{issue_key}}/transitions"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: transition-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches a Jira issue by key and returns summary, status, assignee, and priority. Used by engineering teams to quickly check issue state.

naftiko: "0.5"
info:
  label: "Jira Issue Retrieval"
  description: "Fetches a Jira issue by key and returns summary, status, assignee, and priority. Used by engineering teams to quickly check issue state."
  tags:
    - project-management
    - jira
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: project-tracking
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key. Returns summary, status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., PROJ-1234)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Creates a LinkedIn job posting for infrastructure engineering roles by pulling the job spec from SharePoint and publishing via the LinkedIn API.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Publisher"
  description: "Creates a LinkedIn job posting for infrastructure engineering roles by pulling the job spec from SharePoint and publishing via the LinkedIn API."
  tags:
    - hr
    - recruitment
    - linkedin
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: hr-recruitment
      port: 8080
      tools:
        - name: publish-job-posting
          description: "Given a job spec document path in SharePoint, publish a LinkedIn job posting."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "SharePoint site ID containing job specs."
            - name: job_spec_path
              in: body
              type: string
              description: "Path to the job specification document."
            - name: job_title
              in: body
              type: string
              description: "The job title for the posting."
            - name: location
              in: body
              type: string
              description: "Job location."
          steps:
            - name: get-job-spec
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "{{site_id}}"
                file_path: "{{job_spec_path}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{job_title}}"
                location: "{{location}}"
                description: "{{get-job-spec.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/simpleJobPostings"
          operations:
            - name: create-job-posting
              method: POST

Validates material requirements from SAP, checks supplier ratings in Salesforce, creates a purchase requisition in Oracle EBS, and notifies the procurement manager via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Material Procurement Approval Workflow"
  description: "Validates material requirements from SAP, checks supplier ratings in Salesforce, creates a purchase requisition in Oracle EBS, and notifies the procurement manager via Microsoft Outlook."
  tags:
    - procurement
    - materials
    - sap
    - salesforce
    - oracle-e-business-suite
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: material-procurement
      port: 8080
      tools:
        - name: approve-procurement
          description: "Validate materials, check suppliers, create requisition, and notify manager."
          inputParameters:
            - name: material_id
              in: body
              type: string
              description: "SAP material number."
            - name: quantity
              in: body
              type: integer
              description: "Quantity to procure."
            - name: supplier_account
              in: body
              type: string
              description: "Salesforce supplier account ID."
            - name: manager_email
              in: body
              type: string
              description: "Procurement manager email."
          steps:
            - name: check-material
              type: call
              call: "sap.get-material"
              with:
                material_id: "{{material_id}}"
            - name: check-supplier
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{supplier_account}}"
            - name: create-requisition
              type: call
              call: "oracle-ebs.create-requisition"
              with:
                material: "{{material_id}}"
                quantity: "{{quantity}}"
                supplier: "{{check-supplier.Name}}"
                unit_price: "{{check-material.unit_price}}"
            - name: notify-manager
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{manager_email}}"
                subject: "Procurement Requisition: {{check-material.description}}"
                body: "Requisition {{create-requisition.req_number}} created. Material: {{check-material.description}}. Qty: {{quantity}}. Supplier: {{check-supplier.Name}}. Rating: {{check-supplier.Rating}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_id}}')"
          inputParameters:
            - name: material_id
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://bentley.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: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: requisitions
          path: "/purchaseRequisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves project data from Snowflake and triggers a Microsoft Power Automate flow to populate an Excel report template.

naftiko: "0.5"
info:
  label: "Microsoft Excel Report Generation"
  description: "Retrieves project data from Snowflake and triggers a Microsoft Power Automate flow to populate an Excel report template."
  tags:
    - reporting
    - microsoft-excel
    - snowflake
    - microsoft-power-automate
capability:
  exposes:
    - type: mcp
      namespace: report-gen
      port: 8080
      tools:
        - name: generate-excel-report
          description: "Given a Snowflake query and Power Automate flow URL, generate an Excel report from project data."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The Snowflake SQL query for report data."
            - name: flow_url
              in: body
              type: string
              description: "The Power Automate HTTP trigger URL."
            - name: report_name
              in: body
              type: string
              description: "The output report file name."
          steps:
            - name: fetch-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "{{sql_query}}"
                warehouse: "REPORTING_WH"
            - name: trigger-flow
              type: call
              call: "powerautomate.trigger-flow"
              with:
                flow_url: "{{flow_url}}"
                report_name: "{{report_name}}"
                data_reference: "{{fetch-data.statement_handle}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: powerautomate
      baseUri: "https://prod-00.westus.logic.azure.com"
      authentication:
        type: bearer
        token: "$secrets.powerautomate_token"
      resources:
        - name: flows
          path: "/workflows/{{flow_url}}"
          inputParameters:
            - name: flow_url
              in: path
          operations:
            - name: trigger-flow
              method: POST

Sends an email via Microsoft Outlook Graph API for automated project communications.

naftiko: "0.5"
info:
  label: "Microsoft Outlook Email Notification"
  description: "Sends an email via Microsoft Outlook Graph API for automated project communications."
  tags:
    - communication
    - microsoft-outlook
    - email
capability:
  exposes:
    - type: mcp
      namespace: email-comms
      port: 8080
      tools:
        - name: send-email
          description: "Send an email via Microsoft Outlook."
          inputParameters:
            - name: to
              in: body
              type: string
              description: "Recipient email address."
            - name: subject
              in: body
              type: string
              description: "Email subject line."
            - name: body
              in: body
              type: string
              description: "Email body content."
          call: "outlook.send-mail"
          with:
            to: "{{to}}"
            subject: "{{subject}}"
            body: "{{body}}"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves a Microsoft Project schedule summary by project ID, returning task count, percent complete, and next milestone.

naftiko: "0.5"
info:
  label: "Microsoft Project Schedule Lookup"
  description: "Retrieves a Microsoft Project schedule summary by project ID, returning task count, percent complete, and next milestone."
  tags:
    - project-management
    - microsoft-project
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: pm-scheduling
      port: 8080
      tools:
        - name: get-project-schedule
          description: "Look up a Microsoft Project schedule summary."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Microsoft Project project ID."
          call: "msproject.get-project"
          with:
            project_id: "{{project_id}}"
          outputParameters:
            - name: task_count
              type: integer
              mapping: "$.taskCount"
            - name: percent_complete
              type: string
              mapping: "$.percentComplete"
            - name: next_milestone
              type: string
              mapping: "$.nextMilestone.name"
  consumes:
    - type: http
      namespace: msproject
      baseUri: "https://project.microsoft.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.msproject_token"
      resources:
        - name: projects
          path: "/projects/{{project_id}}"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET

Sends a message to a Microsoft Teams channel, used for automated engineering notifications.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message"
  description: "Sends a message to a Microsoft Teams channel, used for automated engineering notifications."
  tags:
    - collaboration
    - microsoft-teams
    - notification
capability:
  exposes:
    - type: mcp
      namespace: team-comms
      port: 8080
      tools:
        - name: send-channel-message
          description: "Post a message to a Microsoft Teams channel."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The channel ID within the team."
            - name: message
              in: body
              type: string
              description: "The message text to post."
          call: "msteams.post-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a Visio diagram from SharePoint and returns download metadata for engineering documentation workflows.

naftiko: "0.5"
info:
  label: "Microsoft Visio Diagram Export"
  description: "Retrieves a Visio diagram from SharePoint and returns download metadata for engineering documentation workflows."
  tags:
    - documentation
    - microsoft-visio
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-export
      port: 8080
      tools:
        - name: get-visio-diagram
          description: "Retrieve a Visio diagram from SharePoint by site and file path."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: file_path
              in: body
              type: string
              description: "Path to the Visio file."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.name"
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET

Compares network topology snapshots in Snowflake, detects unauthorized changes via Datadog, creates a security incident in ServiceNow, and alerts the network team via PagerDuty.

naftiko: "0.5"
info:
  label: "Network Topology Change Detection Pipeline"
  description: "Compares network topology snapshots in Snowflake, detects unauthorized changes via Datadog, creates a security incident in ServiceNow, and alerts the network team via PagerDuty."
  tags:
    - network-security
    - topology
    - snowflake
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: topology-change
      port: 8080
      tools:
        - name: detect-topology-changes
          description: "Detect unauthorized network topology changes and escalate."
          inputParameters:
            - name: network_id
              in: body
              type: string
              description: "The network identifier."
            - name: pagerduty_service
              in: body
              type: string
              description: "PagerDuty service ID for network alerts."
          steps:
            - name: compare-snapshots
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL DETECT_TOPOLOGY_CHANGES('{{network_id}}')"
                warehouse: "NETWORK_WH"
            - name: check-monitoring
              type: call
              call: "datadog.query-metrics"
              with:
                query: "sum:network.topology.changes{network:{{network_id}}}"
                from: "-1h"
            - name: create-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Unauthorized topology change detected: network {{network_id}}"
                description: "Changes detected: {{compare-snapshots.change_count}}. Datadog metric: {{check-monitoring.value}}."
                urgency: "1"
                category: "security"
            - name: alert-network-team
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service}}"
                title: "Network topology change: {{network_id}} — {{compare-snapshots.change_count}} changes"
                urgency: "high"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

On new engineering hire in Workday, provisions Azure DevOps access, creates a GitHub team membership, sets up a Snowflake user account, and sends a welcome message via Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Hire Engineering Environment Provisioning"
  description: "On new engineering hire in Workday, provisions Azure DevOps access, creates a GitHub team membership, sets up a Snowflake user account, and sends a welcome message via Microsoft Teams."
  tags:
    - hr
    - onboarding
    - workday
    - azure-devops
    - github
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: eng-onboarding
      port: 8080
      tools:
        - name: provision-engineering-env
          description: "Given a Workday employee ID, provision engineering tool access across Azure DevOps, GitHub, Snowflake, and notify via Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: github_team
              in: body
              type: string
              description: "The GitHub team slug to add the user to."
            - name: devops_project
              in: body
              type: string
              description: "The Azure DevOps project name for access."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: add-to-github
              type: call
              call: "github.add-team-member"
              with:
                team_slug: "{{github_team}}"
                username: "{{get-employee.github_username}}"
            - name: grant-devops-access
              type: call
              call: "azuredevops.add-user"
              with:
                project: "{{devops_project}}"
                user_email: "{{get-employee.work_email}}"
            - name: create-snowflake-user
              type: call
              call: "snowflake.create-user"
              with:
                username: "{{get-employee.work_email}}"
                default_role: "ENGINEER"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Bentley Engineering! GitHub team: {{github_team}}, DevOps project: {{devops_project}}, Snowflake account ready."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: team-members
          path: "/orgs/bentley/teams/{{team_slug}}/memberships/{{username}}"
          inputParameters:
            - name: team_slug
              in: path
            - name: username
              in: path
          operations:
            - name: add-team-member
              method: PUT
    - type: http
      namespace: azuredevops
      baseUri: "https://vsaex.dev.azure.com/bentley/_apis"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_pat"
      resources:
        - name: users
          path: "/userentitlements"
          operations:
            - name: add-user
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves application performance metrics from New Relic for a given application ID, returning response time, throughput, and error rate.

naftiko: "0.5"
info:
  label: "New Relic Application Performance Lookup"
  description: "Retrieves application performance metrics from New Relic for a given application ID, returning response time, throughput, and error rate."
  tags:
    - monitoring
    - new-relic
    - performance
capability:
  exposes:
    - type: mcp
      namespace: apm-monitoring
      port: 8080
      tools:
        - name: get-app-performance
          description: "Look up New Relic APM metrics for an application."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID."
          call: "newrelic.get-app-metrics"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: response_time
              type: string
              mapping: "$.application.application_summary.response_time"
            - name: throughput
              type: string
              mapping: "$.application.application_summary.throughput"
            - name: error_rate
              type: string
              mapping: "$.application.application_summary.error_rate"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET

Creates an OpsGenie alert for infrastructure system issues, routing to the appropriate engineering team.

naftiko: "0.5"
info:
  label: "OpsGenie Alert Creation"
  description: "Creates an OpsGenie alert for infrastructure system issues, routing to the appropriate engineering team."
  tags:
    - alerting
    - opsgenie
capability:
  exposes:
    - type: mcp
      namespace: opsgenie
      port: 8080
      tools:
        - name: create-alert
          description: "Create a new OpsGenie alert."
          inputParameters:
            - name: message
              in: body
              type: string
              description: "Alert message."
            - name: priority
              in: body
              type: string
              description: "Priority level: P1 through P5."
            - name: team
              in: body
              type: string
              description: "Responder team name."
          call: "opsgenie.create-alert"
          with:
            message: "{{message}}"
            priority: "{{priority}}"
            team: "{{team}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
            - name: result
              type: string
              mapping: "$.result"
  consumes:
    - type: http
      namespace: opsgenie
      baseUri: "https://api.opsgenie.com/v2"
      authentication:
        type: apiKey
        name: "Authorization"
        in: header
        value: "GenieKey $secrets.opsgenie_api_key"
      resources:
        - name: alerts
          path: "/alerts"
          operations:
            - name: create-alert
              method: POST

Retrieves Oracle Cloud Infrastructure cost summary for a given date range and compartment, returning total cost and breakdown by service.

naftiko: "0.5"
info:
  label: "Oracle Cloud Cost Report"
  description: "Retrieves Oracle Cloud Infrastructure cost summary for a given date range and compartment, returning total cost and breakdown by service."
  tags:
    - cloud
    - oracle-cloud
    - cost-management
    - finance
capability:
  exposes:
    - type: mcp
      namespace: cloud-finance
      port: 8080
      tools:
        - name: get-cost-report
          description: "Retrieve OCI cost summary for a compartment and date range."
          inputParameters:
            - name: compartment_id
              in: body
              type: string
              description: "The OCI compartment OCID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "oci.get-cost-summary"
          with:
            compartment_id: "{{compartment_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
  consumes:
    - type: http
      namespace: oci
      baseUri: "https://usagecost.oraclecloud.com/20200107"
      authentication:
        type: bearer
        token: "$secrets.oci_token"
      resources:
        - name: cost-summaries
          path: "/usage"
          operations:
            - name: get-cost-summary
              method: POST

Triggers a new PagerDuty incident for critical infrastructure alerts, routing to the appropriate on-call engineering team.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Trigger"
  description: "Triggers a new PagerDuty incident for critical infrastructure alerts, routing to the appropriate on-call engineering team."
  tags:
    - incident-management
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: pagerduty
      port: 8080
      tools:
        - name: trigger-incident
          description: "Create a new PagerDuty incident."
          inputParameters:
            - name: service_id
              in: body
              type: string
              description: "The PagerDuty service ID to trigger against."
            - name: title
              in: body
              type: string
              description: "Incident title."
            - name: urgency
              in: body
              type: string
              description: "Incident urgency: high or low."
          call: "pagerduty.create-incident"
          with:
            service_id: "{{service_id}}"
            title: "{{title}}"
            urgency: "{{urgency}}"
          outputParameters:
            - name: incident_id
              type: string
              mapping: "$.incident.id"
            - name: incident_url
              type: string
              mapping: "$.incident.html_url"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Retrieves a Palo Alto Networks firewall security rule by name, returning source zones, destination zones, and action.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Firewall Rule Lookup"
  description: "Retrieves a Palo Alto Networks firewall security rule by name, returning source zones, destination zones, and action."
  tags:
    - security
    - palo-alto-networks
    - firewall
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Look up a Palo Alto firewall security rule by name."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "The firewall rule name."
          call: "paloalto.get-security-rule"
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: source_zones
              type: string
              mapping: "$.result.entry.from.member"
            - name: destination_zones
              type: string
              mapping: "$.result.entry.to.member"
            - name: action
              type: string
              mapping: "$.result.entry.action"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://bentley-fw.paloaltonetworks.com/restapi/v10.1"
      authentication:
        type: apiKey
        key: "$secrets.paloalto_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?name={{rule_name}}"
          inputParameters:
            - name: rule_name
              in: query
          operations:
            - name: get-security-rule
              method: GET

Retrieves pavement sensor data from Datadog, scores condition via Azure ML, updates maintenance plans in SAP, and publishes the assessment report to SharePoint.

naftiko: "0.5"
info:
  label: "Pavement Condition Assessment Pipeline"
  description: "Retrieves pavement sensor data from Datadog, scores condition via Azure ML, updates maintenance plans in SAP, and publishes the assessment report to SharePoint."
  tags:
    - pavement
    - condition-assessment
    - datadog
    - azure-machine-learning
    - sap
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: pavement-assessment
      port: 8080
      tools:
        - name: assess-pavement
          description: "Score pavement condition, update plans, and publish report."
          inputParameters:
            - name: road_segment_id
              in: body
              type: string
              description: "The road segment identifier."
          steps:
            - name: get-sensor-data
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:pavement.roughness{segment:{{road_segment_id}}} by {sensor}"
                from: "-7d"
            - name: score-condition
              type: call
              call: "azureml.score"
              with:
                model_type: "pavement_condition"
                data: "{{get-sensor-data.series}}"
            - name: update-maintenance-plan
              type: call
              call: "sap.update-maintenance-plan"
              with:
                segment_id: "{{road_segment_id}}"
                condition_index: "{{score-condition.pci}}"
                recommended_treatment: "{{score-condition.treatment}}"
            - name: publish-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "pavement_management_site"
                folder_path: "Assessments/{{road_segment_id}}"
                file_name: "assessment_{{road_segment_id}}.pdf"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_MAINTPLAN_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-plans
          path: "/A_MaintenancePlan('{{segment_id}}')"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: update-maintenance-plan
              method: PATCH
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Tracks permit applications in ServiceNow, retrieves supporting documents from Box, updates project timelines in Microsoft Project, and sends status updates via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Permit Application Tracking Pipeline"
  description: "Tracks permit applications in ServiceNow, retrieves supporting documents from Box, updates project timelines in Microsoft Project, and sends status updates via Microsoft Outlook."
  tags:
    - permits
    - tracking
    - servicenow
    - box
    - microsoft-project
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: permit-tracking
      port: 8080
      tools:
        - name: track-permit
          description: "Track permit application status across ServiceNow, Box, Microsoft Project, and Outlook."
          inputParameters:
            - name: permit_id
              in: body
              type: string
              description: "The ServiceNow permit record ID."
            - name: doc_folder_id
              in: body
              type: string
              description: "Box folder ID for permit documents."
            - name: project_plan_id
              in: body
              type: string
              description: "Microsoft Project plan ID."
            - name: stakeholder_email
              in: body
              type: string
              description: "Stakeholder email for updates."
          steps:
            - name: get-permit-status
              type: call
              call: "servicenow.get-record"
              with:
                table: "u_permits"
                sys_id: "{{permit_id}}"
            - name: get-documents
              type: call
              call: "box.get-folder-items"
              with:
                folder_id: "{{doc_folder_id}}"
            - name: update-timeline
              type: call
              call: "msproject.update-task"
              with:
                plan_id: "{{project_plan_id}}"
                task_name: "Permit {{permit_id}}"
                status: "{{get-permit-status.result.state}}"
            - name: send-update
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{stakeholder_email}}"
                subject: "Permit Update: {{get-permit-status.result.permit_number}}"
                body: "Permit {{get-permit-status.result.permit_number}} status: {{get-permit-status.result.state}}. Documents on file: {{get-documents.total_count}}. Project timeline updated."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}/{{sys_id}}"
          inputParameters:
            - name: table
              in: path
            - name: sys_id
              in: path
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: msproject
      baseUri: "https://graph.microsoft.com/v1.0/planner"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "/plans/{{plan_id}}/tasks"
          inputParameters:
            - name: plan_id
              in: path
          operations:
            - name: update-task
              method: PATCH
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Triggers a Power BI dataset refresh for infrastructure analytics dashboards and returns refresh status.

naftiko: "0.5"
info:
  label: "Power BI Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for infrastructure analytics dashboards and returns refresh status."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-dataset
          description: "Trigger a Power BI dataset refresh by dataset ID."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
          call: "powerbi.refresh-dataset"
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When a procurement requisition is approved in Oracle EBS, creates a purchase order in SAP, logs the PO in ServiceNow, and notifies the requester via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Procurement Requisition to PO Pipeline"
  description: "When a procurement requisition is approved in Oracle EBS, creates a purchase order in SAP, logs the PO in ServiceNow, and notifies the requester via Microsoft Teams."
  tags:
    - procurement
    - oracle-e-business-suite
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-pipeline
      port: 8080
      tools:
        - name: process-requisition-to-po
          description: "Given an approved requisition ID, create a SAP PO, log in ServiceNow, and notify the requester."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Oracle EBS requisition ID."
            - name: requester_email
              in: body
              type: string
              description: "Email of the person who submitted the requisition."
          steps:
            - name: get-requisition
              type: call
              call: "oracle-ebs.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-po
              type: call
              call: "sap.create-purchase-order"
              with:
                vendor_id: "{{get-requisition.vendor_id}}"
                material: "{{get-requisition.material_number}}"
                quantity: "{{get-requisition.quantity}}"
                plant: "{{get-requisition.plant}}"
            - name: log-in-servicenow
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "PO created from requisition {{requisition_id}}"
                description: "SAP PO {{create-po.po_number}} created for vendor {{get-requisition.vendor_id}}."
                category: "procurement"
            - name: notify-requester
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{requester_email}}"
                text: "Your requisition {{requisition_id}} has been converted to PO {{create-po.po_number}}. ServiceNow: {{log-in-servicenow.number}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bentley-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"
          operations:
            - name: create-purchase-order
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries project cost data from Oracle EBS, compares actuals against budget in Snowflake, generates a variance dashboard in Power BI, and escalates overruns via PagerDuty.

naftiko: "0.5"
info:
  label: "Project Cost Variance Alert Pipeline"
  description: "Queries project cost data from Oracle EBS, compares actuals against budget in Snowflake, generates a variance dashboard in Power BI, and escalates overruns via PagerDuty."
  tags:
    - cost-management
    - oracle-e-business-suite
    - snowflake
    - power-bi
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: cost-variance
      port: 8080
      tools:
        - name: check-cost-variance
          description: "Analyze project cost variance and escalate overruns."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Oracle EBS project identifier."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: pagerduty_service
              in: body
              type: string
              description: "PagerDuty service ID for escalation."
          steps:
            - name: get-actuals
              type: call
              call: "oracle-ebs.get-project-costs"
              with:
                project_id: "{{project_id}}"
            - name: compare-budget
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT budget, actual, (actual - budget) as variance FROM PROJECT_BUDGETS WHERE project_id = '{{project_id}}'"
                warehouse: "FINANCE_WH"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: escalate-overrun
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service}}"
                title: "Cost overrun on project {{project_id}}: Variance {{compare-budget.variance}}"
                urgency: "high"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: project-costs
          path: "/projects/{{project_id}}/costs"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-costs
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Detects schedule delays in Microsoft Project, calculates impact in Snowflake, creates an escalation in Jira, and alerts the PMO via PagerDuty.

naftiko: "0.5"
info:
  label: "Project Schedule Delay Escalation Pipeline"
  description: "Detects schedule delays in Microsoft Project, calculates impact in Snowflake, creates an escalation in Jira, and alerts the PMO via PagerDuty."
  tags:
    - scheduling
    - escalation
    - microsoft-project
    - snowflake
    - jira
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: schedule-delay
      port: 8080
      tools:
        - name: escalate-delay
          description: "Detect schedule delays, assess impact, create escalation, and alert PMO."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Microsoft Project plan identifier."
            - name: project_key
              in: body
              type: string
              description: "Jira project key."
            - name: pagerduty_service
              in: body
              type: string
              description: "PagerDuty service for PMO alerts."
          steps:
            - name: get-schedule
              type: call
              call: "msproject.get-tasks"
              with:
                plan_id: "{{plan_id}}"
            - name: assess-impact
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL ASSESS_SCHEDULE_IMPACT('{{plan_id}}')"
                warehouse: "PMO_WH"
            - name: create-escalation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Schedule Delay: {{assess-impact.delayed_tasks}} tasks, {{assess-impact.total_delay_days}} days impact"
                description: "Critical path delay: {{assess-impact.critical_path_impact}} days. Budget impact: ${{assess-impact.cost_impact}}."
                issue_type: "Bug"
                priority: "High"
            - name: alert-pmo
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service}}"
                title: "Schedule delay: {{assess-impact.total_delay_days}} days on plan {{plan_id}}"
                urgency: "high"
  consumes:
    - type: http
      namespace: msproject
      baseUri: "https://graph.microsoft.com/v1.0/planner"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "/plans/{{plan_id}}/tasks"
          inputParameters:
            - name: plan_id
              in: path
          operations:
            - name: get-tasks
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Collects rail track sensor data from Datadog, runs predictive maintenance scoring in Azure ML, schedules maintenance in SAP PM, and alerts the rail operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Rail Corridor Monitoring Pipeline"
  description: "Collects rail track sensor data from Datadog, runs predictive maintenance scoring in Azure ML, schedules maintenance in SAP PM, and alerts the rail operations team via Microsoft Teams."
  tags:
    - rail-infrastructure
    - predictive-maintenance
    - datadog
    - azure-machine-learning
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rail-monitoring
      port: 8080
      tools:
        - name: monitor-rail-corridor
          description: "Collect sensor data, predict maintenance needs, schedule work, and alert operations."
          inputParameters:
            - name: corridor_id
              in: body
              type: string
              description: "The rail corridor identifier."
            - name: ops_channel
              in: body
              type: string
              description: "Microsoft Teams rail operations channel."
          steps:
            - name: get-sensor-data
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:rail.track.vibration{corridor:{{corridor_id}}} by {segment}"
                from: "-12h"
            - name: predict-maintenance
              type: call
              call: "azureml.score"
              with:
                model_type: "rail_maintenance"
                data: "{{get-sensor-data.series}}"
            - name: schedule-maintenance
              type: call
              call: "sap.create-work-order"
              with:
                order_type: "PREVENTIVE"
                corridor_id: "{{corridor_id}}"
                priority: "{{predict-maintenance.priority}}"
                description: "Predicted maintenance for corridor {{corridor_id}}: {{predict-maintenance.failure_component}}"
            - name: alert-operations
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel}}"
                text: "Rail corridor {{corridor_id}}: Maintenance predicted for {{predict-maintenance.failure_component}}. Probability: {{predict-maintenance.failure_probability}}%. WO: {{schedule-maintenance.order_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_MAINTORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a cached value from Redis by key, used for fast lookup of infrastructure configuration and session data.

naftiko: "0.5"
info:
  label: "Redis Cache Lookup"
  description: "Retrieves a cached value from Redis by key, used for fast lookup of infrastructure configuration and session data."
  tags:
    - caching
    - redis
capability:
  exposes:
    - type: mcp
      namespace: redis-cache
      port: 8080
      tools:
        - name: get-value
          description: "Look up a value in Redis by key."
          inputParameters:
            - name: key
              in: body
              type: string
              description: "The Redis key to retrieve."
          call: "redis.get-key"
          with:
            key: "{{key}}"
          outputParameters:
            - name: value
              type: string
              mapping: "$.value"
            - name: ttl
              type: integer
              mapping: "$.ttl"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.bentley.com:6380"
      authentication:
        type: apiKey
        name: "Authorization"
        in: header
        value: "$secrets.redis_token"
      resources:
        - name: keys
          path: "/get/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-key
              method: GET

Extracts road network geometry from Bentley OpenRoads, validates against design standards in Snowflake, generates a compliance report in Power BI, and notifies reviewers via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Road Network Design Review Pipeline"
  description: "Extracts road network geometry from Bentley OpenRoads, validates against design standards in Snowflake, generates a compliance report in Power BI, and notifies reviewers via Microsoft Outlook."
  tags:
    - road-design
    - openroads
    - snowflake
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: road-design-review
      port: 8080
      tools:
        - name: review-road-design
          description: "Extract road geometry, validate standards, generate report, and notify reviewers."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The OpenRoads project identifier."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: reviewer_emails
              in: body
              type: string
              description: "Comma-separated reviewer email addresses."
          steps:
            - name: extract-geometry
              type: call
              call: "openroads.get-alignment"
              with:
                project_id: "{{project_id}}"
            - name: validate-standards
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM ROAD_DESIGN_STANDARDS WHERE project_id = '{{project_id}}' AND compliant = FALSE"
                warehouse: "DESIGN_WH"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: email-reviewers
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{reviewer_emails}}"
                subject: "Road Design Review: Project {{project_id}}"
                body: "Design review for project {{project_id}} is ready. Violations found: {{validate-standards.rowCount}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: openroads
      baseUri: "https://api.bentley.com/openroads/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: alignments
          path: "/projects/{{project_id}}/alignments"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-alignment
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Checks employee safety training records in Workday, identifies expired certifications in Snowflake, creates training assignments in ServiceNow, and notifies managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Safety Training Compliance Orchestrator"
  description: "Checks employee safety training records in Workday, identifies expired certifications in Snowflake, creates training assignments in ServiceNow, and notifies managers via Microsoft Teams."
  tags:
    - safety
    - training
    - workday
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: safety-training
      port: 8080
      tools:
        - name: check-training-compliance
          description: "Verify safety training compliance and create assignments for expired certifications."
          inputParameters:
            - name: department_id
              in: body
              type: string
              description: "The Workday department identifier."
            - name: manager_channel
              in: body
              type: string
              description: "Microsoft Teams channel for manager notifications."
          steps:
            - name: get-training-records
              type: call
              call: "workday.get-training-records"
              with:
                department_id: "{{department_id}}"
            - name: find-expired
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT employee_id, certification, expiry_date FROM SAFETY_CERTS WHERE department_id = '{{department_id}}' AND expiry_date < CURRENT_DATE()"
                warehouse: "HR_WH"
            - name: create-assignments
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_training_assignment"
                department_id: "{{department_id}}"
                expired_count: "{{find-expired.rowCount}}"
                assignment_type: "safety_recertification"
            - name: notify-managers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{manager_channel}}"
                text: "Safety training compliance check: {{find-expired.rowCount}} expired certifications in department {{department_id}}. Training assignments created: {{create-assignments.sys_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-services1.myworkday.com/ccx/api/v1/bentley"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: training
          path: "/departments/{{department_id}}/training"
          inputParameters:
            - name: department_id
              in: path
          operations:
            - name: get-training-records
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              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/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a Salesforce lead is qualified, converts it to an opportunity, creates a Jira story for the sales engineering team, and posts to the sales Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Lead to Opportunity Conversion Pipeline"
  description: "When a Salesforce lead is qualified, converts it to an opportunity, creates a Jira story for the sales engineering team, and posts to the sales Microsoft Teams channel."
  tags:
    - sales
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-pipeline
      port: 8080
      tools:
        - name: convert-lead-to-opportunity
          description: "Given a Salesforce lead ID, convert to opportunity and orchestrate follow-up across Jira and Microsoft Teams."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for sales engineering tasks."
            - name: sales_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel for sales updates."
          steps:
            - name: convert-lead
              type: call
              call: "salesforce.convert-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: create-se-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Sales Engineering: {{convert-lead.opportunity_name}}"
                issue_type: "Story"
                description: "New opportunity from lead {{lead_id}}. Account: {{convert-lead.account_name}}. Value: {{convert-lead.amount}}."
            - name: notify-sales
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{sales_channel_id}}"
                text: "Lead converted to opportunity: {{convert-lead.opportunity_name}}. Account: {{convert-lead.account_name}}. SE task: {{create-se-task.key}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bentley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}/convert"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: convert-lead
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for infrastructure sales tracking.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for infrastructure sales tracking."
  tags:
    - sales
    - salesforce
    - opportunity
capability:
  exposes:
    - type: mcp
      namespace: sales-crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID. Returns stage, amount, close date, and account name."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
            - name: account_name
              type: string
              mapping: "$.Account.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://bentley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET

Retrieves SAP material master data by material number, returning description, unit of measure, and material group for infrastructure components.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves SAP material master data by material number, returning description, unit of measure, and material group for infrastructure components."
  tags:
    - erp
    - sap
    - materials
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: erp-materials
      port: 8080
      tools:
        - name: get-material
          description: "Look up a SAP material master record by material number."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-material"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: unit_of_measure
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Retrieves the status of a SAP Plant Maintenance work order, returning current phase, assigned technician, and completion percentage.

naftiko: "0.5"
info:
  label: "SAP Work Order Status"
  description: "Retrieves the status of a SAP Plant Maintenance work order, returning current phase, assigned technician, and completion percentage."
  tags:
    - maintenance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: sap-maintenance
      port: 8080
      tools:
        - name: get-work-order
          description: "Retrieve the status of a SAP work order."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The SAP work order number."
          call: "sap.get-work-order"
          with:
            order_id: "{{order_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.Status"
            - name: description
              type: string
              mapping: "$.d.Description"
            - name: completion_pct
              type: number
              mapping: "$.d.CompletionPercent"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_MAINTORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/MaintenanceOrder('{{order_id}}')"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-work-order
              method: GET

When a SonarQube scan detects critical vulnerabilities, creates a Jira security bug, logs a ServiceNow security incident, and alerts the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "When a SonarQube scan detects critical vulnerabilities, creates a Jira security bug, logs a ServiceNow security incident, and alerts the security team via Microsoft Teams."
  tags:
    - security
    - sonarqube
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-remediation
      port: 8080
      tools:
        - name: trigger-vuln-remediation
          description: "Given a SonarQube project key with critical vulnerabilities, orchestrate remediation across Jira, ServiceNow, and Microsoft Teams."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for security bugs."
            - name: security_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel for the security team."
          steps:
            - name: get-vulnerabilities
              type: call
              call: "sonarqube.get-quality-gate"
              with:
                project_key: "{{project_key}}"
            - name: create-security-bug
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                summary: "Critical vulnerabilities in {{project_key}}"
                issue_type: "Bug"
                priority: "Highest"
                labels: "security"
                description: "SonarQube detected critical vulnerabilities in {{project_key}}. Gate status: {{get-vulnerabilities.gate_status}}."
            - name: log-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Security vulnerabilities: {{project_key}}"
                priority: "2"
                category: "security"
                description: "Critical vulnerabilities detected by SonarQube in {{project_key}}. Jira: {{create-security-bug.key}}."
            - name: alert-security-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{security_channel_id}}"
                text: "SECURITY ALERT: Critical vulnerabilities in {{project_key}}. Jira: {{create-security-bug.key}}. ServiceNow: {{log-security-incident.number}}."
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.bentley.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and short description."
  tags:
    - itsm
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: itsm-incidents
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Retrieves metadata for a SharePoint document by path, returning file name, size, last modified date, and download URL.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves metadata for a SharePoint document by path, returning file name, size, last modified date, and download URL."
  tags:
    - collaboration
    - sharepoint
    - documents
capability:
  exposes:
    - type: mcp
      namespace: doc-management
      port: 8080
      tools:
        - name: get-document
          description: "Look up a SharePoint document by site and path."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: file_path
              in: body
              type: string
              description: "The path to the file within the site drive."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.name"
            - name: size
              type: integer
              mapping: "$.size"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET

Pulls inspection data from ServiceNow, cross-references against design specs in ProjectWise, generates a consolidated PDF via Microsoft Excel, and emails the report to the project manager.

naftiko: "0.5"
info:
  label: "Site Inspection Report Orchestrator"
  description: "Pulls inspection data from ServiceNow, cross-references against design specs in ProjectWise, generates a consolidated PDF via Microsoft Excel, and emails the report to the project manager."
  tags:
    - inspections
    - servicenow
    - projectwise
    - microsoft-excel
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: site-inspection
      port: 8080
      tools:
        - name: generate-inspection-report
          description: "Compile inspection data, cross-reference designs, generate report, and email to stakeholders."
          inputParameters:
            - name: inspection_id
              in: body
              type: string
              description: "The ServiceNow inspection record ID."
            - name: project_id
              in: body
              type: string
              description: "The ProjectWise project identifier."
            - name: manager_email
              in: body
              type: string
              description: "Project manager email address."
          steps:
            - name: get-inspection
              type: call
              call: "servicenow.get-record"
              with:
                table: "u_site_inspection"
                sys_id: "{{inspection_id}}"
            - name: get-design-specs
              type: call
              call: "projectwise.get-documents"
              with:
                project_id: "{{project_id}}"
                doc_type: "design_specification"
            - name: generate-report
              type: call
              call: "excel.create-workbook"
              with:
                template: "inspection_report"
                data: "{{get-inspection.result}}"
            - name: email-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{manager_email}}"
                subject: "Site Inspection Report: {{get-inspection.result.site_name}}"
                body: "Inspection report for {{get-inspection.result.site_name}} completed. Findings: {{get-inspection.result.finding_count}}. Design cross-reference included."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}/{{sys_id}}"
          inputParameters:
            - name: table
              in: path
            - name: sys_id
              in: path
          operations:
            - name: get-record
              method: GET
    - type: http
      namespace: projectwise
      baseUri: "https://projectwise.bentley.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.projectwise_token"
      resources:
        - name: documents
          path: "/projects/{{project_id}}/documents"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-documents
              method: GET
    - type: http
      namespace: excel
      baseUri: "https://graph.microsoft.com/v1.0/me/drive"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: workbooks
          path: "/root:/Reports:/workbook"
          operations:
            - name: create-workbook
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Posts a message to a Slack channel for infrastructure team communications and automated notifications.

naftiko: "0.5"
info:
  label: "Slack Channel Message"
  description: "Posts a message to a Slack channel for infrastructure team communications and automated notifications."
  tags:
    - messaging
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slack
      port: 8080
      tools:
        - name: post-message
          description: "Post a message to a Slack channel."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "The Slack channel ID."
            - name: text
              in: body
              type: string
              description: "Message text."
          call: "slack.post-message"
          with:
            channel: "{{channel}}"
            text: "{{text}}"
          outputParameters:
            - name: ts
              type: string
              mapping: "$.ts"
            - name: ok
              type: boolean
              mapping: "$.ok"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes a SQL statement against the Bentley Snowflake data warehouse and returns the result set for infrastructure analytics.

naftiko: "0.5"
info:
  label: "Snowflake Data Warehouse Query"
  description: "Executes a SQL statement against the Bentley Snowflake data warehouse and returns the result set for infrastructure analytics."
  tags:
    - data
    - analytics
    - snowflake
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: run-snowflake-query
          description: "Execute a SQL query against the Bentley Snowflake warehouse."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The SQL statement to execute."
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse name."
          call: "snowflake.execute-statement"
          with:
            statement: "{{sql_statement}}"
            warehouse: "{{warehouse}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Retrieves SonarQube project quality gate status for a given project key, returning gate status, bugs count, vulnerabilities, and code smells.

naftiko: "0.5"
info:
  label: "SonarQube Code Quality Check"
  description: "Retrieves SonarQube project quality gate status for a given project key, returning gate status, bugs count, vulnerabilities, and code smells."
  tags:
    - code-quality
    - sonarqube
    - development
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: get-quality-gate
          description: "Look up SonarQube quality gate status for a project."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key."
          call: "sonarqube.get-quality-gate"
          with:
            project_key: "{{project_key}}"
          outputParameters:
            - name: gate_status
              type: string
              mapping: "$.projectStatus.status"
            - name: bugs
              type: integer
              mapping: "$.projectStatus.conditions[?(@.metricKey=='bugs')].actualValue"
            - name: vulnerabilities
              type: integer
              mapping: "$.projectStatus.conditions[?(@.metricKey=='vulnerabilities')].actualValue"
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.bentley.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-quality-gate
              method: GET

Retrieves rainfall forecast data from an external weather API, runs stormwater capacity analysis via Azure ML, updates drainage models in iTwin, and alerts municipal engineers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Stormwater Management Analysis Pipeline"
  description: "Retrieves rainfall forecast data from an external weather API, runs stormwater capacity analysis via Azure ML, updates drainage models in iTwin, and alerts municipal engineers via Microsoft Teams."
  tags:
    - stormwater
    - hydrology
    - azure-machine-learning
    - itwin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: stormwater-analysis
      port: 8080
      tools:
        - name: analyze-stormwater
          description: "Forecast rainfall, analyze capacity, update models, and alert engineers."
          inputParameters:
            - name: catchment_id
              in: body
              type: string
              description: "The stormwater catchment identifier."
            - name: model_id
              in: body
              type: string
              description: "The iTwin drainage model ID."
            - name: teams_channel
              in: body
              type: string
              description: "Microsoft Teams channel for municipal engineers."
          steps:
            - name: get-rainfall-forecast
              type: call
              call: "weather.get-forecast"
              with:
                catchment_id: "{{catchment_id}}"
            - name: analyze-capacity
              type: call
              call: "azureml.score"
              with:
                model_type: "stormwater_capacity"
                rainfall_data: "{{get-rainfall-forecast.forecast}}"
                catchment_id: "{{catchment_id}}"
            - name: update-drainage-model
              type: call
              call: "itwin.update-properties"
              with:
                model_id: "{{model_id}}"
                properties:
                  capacity_pct: "{{analyze-capacity.capacity_pct}}"
                  overflow_risk: "{{analyze-capacity.overflow_risk}}"
            - name: alert-engineers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{teams_channel}}"
                text: "Stormwater alert for catchment {{catchment_id}}: Capacity at {{analyze-capacity.capacity_pct}}%. Overflow risk: {{analyze-capacity.overflow_risk}}. Drainage model updated."
  consumes:
    - type: http
      namespace: weather
      baseUri: "https://api.weather.gov"
      authentication:
        type: apiKey
        name: "x-api-key"
        in: header
        value: "$secrets.weather_api_key"
      resources:
        - name: forecasts
          path: "/gridpoints/{{catchment_id}}/forecast"
          inputParameters:
            - name: catchment_id
              in: path
          operations:
            - name: get-forecast
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: properties
          path: "/models/{{model_id}}/properties"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: update-properties
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Ingests GPR survey data from S3, maps subsurface utilities in iTwin, cross-references with existing records in Snowflake, and publishes findings to SharePoint.

naftiko: "0.5"
info:
  label: "Subsurface Utility Mapping Pipeline"
  description: "Ingests GPR survey data from S3, maps subsurface utilities in iTwin, cross-references with existing records in Snowflake, and publishes findings to SharePoint."
  tags:
    - subsurface
    - utility-mapping
    - amazon-s3
    - itwin
    - snowflake
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: subsurface-mapping
      port: 8080
      tools:
        - name: map-subsurface-utilities
          description: "Ingest GPR data, map utilities, cross-reference records, and publish."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "S3 bucket with GPR survey data."
            - name: survey_key
              in: body
              type: string
              description: "S3 object key for GPR data."
            - name: model_id
              in: body
              type: string
              description: "iTwin model ID."
            - name: site_id
              in: body
              type: string
              description: "SharePoint site for publishing."
          steps:
            - name: get-gpr-data
              type: call
              call: "s3.get-object"
              with:
                bucket: "{{bucket}}"
                key: "{{survey_key}}"
            - name: map-utilities
              type: call
              call: "itwin.create-subsurface-layer"
              with:
                model_id: "{{model_id}}"
                gpr_data: "{{get-gpr-data.body}}"
            - name: cross-reference
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL CROSS_REFERENCE_UTILITIES('{{model_id}}')"
                warehouse: "UTILITIES_WH"
            - name: publish-findings
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "{{site_id}}"
                folder_path: "SubsurfaceMaps/{{model_id}}"
                file_name: "subsurface_map_{{model_id}}.pdf"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: get-object
              method: GET
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: subsurface
          path: "/models/{{model_id}}/subsurface"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: create-subsurface-layer
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Ingests geospatial survey data from S3, validates coordinate accuracy in Snowflake, flags outliers in Jira, and refreshes the survey QA dashboard in Power BI.

naftiko: "0.5"
info:
  label: "Survey Data Quality Assurance Pipeline"
  description: "Ingests geospatial survey data from S3, validates coordinate accuracy in Snowflake, flags outliers in Jira, and refreshes the survey QA dashboard in Power BI."
  tags:
    - surveying
    - data-quality
    - amazon-s3
    - snowflake
    - jira
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: survey-qa
      port: 8080
      tools:
        - name: validate-survey-data
          description: "Validate survey data quality across S3, Snowflake, Jira, and Power BI."
          inputParameters:
            - name: bucket
              in: body
              type: string
              description: "The S3 bucket containing survey data."
            - name: survey_key
              in: body
              type: string
              description: "The S3 object key for the survey file."
            - name: project_key
              in: body
              type: string
              description: "Jira project key for flagging issues."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
          steps:
            - name: get-survey-file
              type: call
              call: "s3.head-object"
              with:
                bucket: "{{bucket}}"
                key: "{{survey_key}}"
            - name: validate-coordinates
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL VALIDATE_SURVEY_COORDINATES('{{survey_key}}')"
                warehouse: "SURVEY_WH"
            - name: flag-outliers
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "Survey QA: {{validate-coordinates.outlier_count}} outliers detected in {{survey_key}}"
                description: "Validation results: {{validate-coordinates.total_points}} points checked, {{validate-coordinates.outlier_count}} outliers found."
                issue_type: "Bug"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: head-object
              method: HEAD
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: jira
      baseUri: "https://bentley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Executes a SQL query against the Bentley Teradata data warehouse for infrastructure asset analytics.

naftiko: "0.5"
info:
  label: "Teradata Analytics Query"
  description: "Executes a SQL query against the Bentley Teradata data warehouse for infrastructure asset analytics."
  tags:
    - data
    - analytics
    - teradata
capability:
  exposes:
    - type: mcp
      namespace: dw-analytics
      port: 8080
      tools:
        - name: run-teradata-query
          description: "Execute a SQL query against the Teradata warehouse."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The SQL statement to execute."
            - name: database_name
              in: body
              type: string
              description: "The target Teradata database."
          call: "teradata.execute-query"
          with:
            query: "{{sql_statement}}"
            database: "{{database_name}}"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://bentley-td.teradata.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.teradata_token"
      resources:
        - name: queries
          path: "/queries"
          operations:
            - name: execute-query
              method: POST

Triggers an Azure DevOps pipeline to run a Terraform deployment, monitors the build, and posts the result to Microsoft Teams with the deployment summary.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Deployment Pipeline"
  description: "Triggers an Azure DevOps pipeline to run a Terraform deployment, monitors the build, and posts the result to Microsoft Teams with the deployment summary."
  tags:
    - infrastructure
    - terraform
    - azure-devops
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: infra-deploy
      port: 8080
      tools:
        - name: trigger-terraform-deploy
          description: "Given a pipeline definition ID and environment, trigger a Terraform deployment via Azure DevOps and notify via Microsoft Teams."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "The Azure DevOps pipeline definition ID."
            - name: environment
              in: body
              type: string
              description: "Target environment (e.g., dev, staging, prod)."
            - name: notify_email
              in: body
              type: string
              description: "Email to notify with deployment results."
          steps:
            - name: queue-build
              type: call
              call: "azuredevops.queue-build"
              with:
                definition_id: "{{pipeline_id}}"
                parameters: "{\"environment\": \"{{environment}}\"}"
            - name: notify-started
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{notify_email}}"
                text: "Terraform deployment started for {{environment}}. Build: {{queue-build.buildNumber}}. Pipeline: {{pipeline_id}}."
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/bentley/_apis/build"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_pat"
      inputParameters:
        - name: api-version
          in: query
          value: "7.0"
      resources:
        - name: builds
          path: "/builds"
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Ingests terrain survey data into iTwin, validates elevations in Snowflake, publishes the updated model to SharePoint, and notifies the GIS team via Slack.

naftiko: "0.5"
info:
  label: "Terrain Model Update and Distribution Pipeline"
  description: "Ingests terrain survey data into iTwin, validates elevations in Snowflake, publishes the updated model to SharePoint, and notifies the GIS team via Slack."
  tags:
    - terrain-modeling
    - itwin
    - snowflake
    - sharepoint
    - slack
capability:
  exposes:
    - type: mcp
      namespace: terrain-update
      port: 8080
      tools:
        - name: update-terrain-model
          description: "Ingest terrain data, validate, publish, and notify."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The iTwin terrain model identifier."
            - name: survey_dataset
              in: body
              type: string
              description: "The survey dataset reference."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for GIS notifications."
          steps:
            - name: ingest-data
              type: call
              call: "itwin.upload-reality-data"
              with:
                model_id: "{{model_id}}"
                dataset: "{{survey_dataset}}"
            - name: validate-elevations
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL VALIDATE_TERRAIN_ELEVATIONS('{{model_id}}')"
                warehouse: "GIS_WH"
            - name: publish-model
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "gis_models_site"
                folder_path: "TerrainModels/{{model_id}}"
                file_name: "terrain_{{model_id}}.dtm"
            - name: notify-gis
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Terrain model {{model_id}} updated. Elevation validation: {{validate-elevations.status}}. Published: {{publish-model.url}}"
  consumes:
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/realitydata/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: reality-data
          path: "/models/{{model_id}}/realitydata"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: upload-reality-data
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors tunnel ventilation sensor data via Datadog, runs air quality predictions in Azure ML, updates the iTwin digital twin, and alerts safety officers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tunnel Ventilation Monitoring Pipeline"
  description: "Monitors tunnel ventilation sensor data via Datadog, runs air quality predictions in Azure ML, updates the iTwin digital twin, and alerts safety officers via Microsoft Teams."
  tags:
    - tunnel-engineering
    - ventilation
    - datadog
    - azure-machine-learning
    - itwin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tunnel-ventilation
      port: 8080
      tools:
        - name: monitor-ventilation
          description: "Monitor ventilation, predict air quality, update digital twin, and alert safety."
          inputParameters:
            - name: tunnel_id
              in: body
              type: string
              description: "The tunnel identifier."
            - name: model_id
              in: body
              type: string
              description: "iTwin digital twin model ID."
            - name: safety_channel
              in: body
              type: string
              description: "Microsoft Teams safety officers channel."
          steps:
            - name: get-ventilation-data
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:tunnel.airflow{tunnel:{{tunnel_id}}} by {zone}"
                from: "-1h"
            - name: predict-air-quality
              type: call
              call: "azureml.score"
              with:
                model_type: "tunnel_air_quality"
                data: "{{get-ventilation-data.series}}"
            - name: update-digital-twin
              type: call
              call: "itwin.update-properties"
              with:
                model_id: "{{model_id}}"
                properties:
                  air_quality_index: "{{predict-air-quality.aqi}}"
                  ventilation_status: "{{predict-air-quality.status}}"
            - name: alert-safety
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{safety_channel}}"
                text: "Tunnel {{tunnel_id}} ventilation: AQI {{predict-air-quality.aqi}}. Status: {{predict-air-quality.status}}. Digital twin updated."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: properties
          path: "/models/{{model_id}}/properties"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: update-properties
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Sends an SMS notification to a specified phone number using Twilio, typically for infrastructure alert escalation.

naftiko: "0.5"
info:
  label: "Twilio SMS Notification"
  description: "Sends an SMS notification to a specified phone number using Twilio, typically for infrastructure alert escalation."
  tags:
    - notifications
    - twilio
capability:
  exposes:
    - type: mcp
      namespace: twilio-sms
      port: 8080
      tools:
        - name: send-sms
          description: "Send an SMS message to a phone number."
          inputParameters:
            - name: to
              in: body
              type: string
              description: "Recipient phone number in E.164 format."
            - name: message
              in: body
              type: string
              description: "The SMS message body."
          call: "twilio.send-message"
          with:
            to: "{{to}}"
            from: "$secrets.twilio_from_number"
            body: "{{message}}"
          outputParameters:
            - name: message_sid
              type: string
              mapping: "$.sid"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: twilio
      baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
      authentication:
        type: basic
        username: "$secrets.twilio_account_sid"
        password: "$secrets.twilio_auth_token"
      resources:
        - name: messages
          path: "/Messages.json"
          operations:
            - name: send-message
              method: POST

Detects utility network outages via Datadog, creates a ServiceNow incident, dispatches a field crew through SAP, and notifies operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Utility Network Outage Response Pipeline"
  description: "Detects utility network outages via Datadog, creates a ServiceNow incident, dispatches a field crew through SAP, and notifies operations via Microsoft Teams."
  tags:
    - utilities
    - outage-management
    - datadog
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: utility-outage
      port: 8080
      tools:
        - name: respond-to-outage
          description: "Coordinate outage response across monitoring, ticketing, dispatch, and communication systems."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert identifier."
            - name: network_zone
              in: body
              type: string
              description: "The utility network zone affected."
            - name: ops_channel
              in: body
              type: string
              description: "Microsoft Teams operations channel ID."
          steps:
            - name: get-alert-details
              type: call
              call: "datadog.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Utility outage in zone {{network_zone}}"
                description: "Datadog alert: {{get-alert-details.title}}. Severity: {{get-alert-details.severity}}. Affected zone: {{network_zone}}."
                urgency: "1"
            - name: dispatch-crew
              type: call
              call: "sap.create-work-order"
              with:
                order_type: "EMERGENCY"
                network_zone: "{{network_zone}}"
                description: "Emergency outage repair — {{get-alert-details.title}}"
            - name: notify-operations
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel}}"
                text: "OUTAGE ALERT: Zone {{network_zone}}. Incident: {{create-incident.number}}. Crew dispatched: WO {{dispatch-crew.order_id}}. Severity: {{get-alert-details.severity}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: alerts
          path: "/alert/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.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: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_MAINTORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Analyzes satellite imagery from S3, detects vegetation encroachment via Azure ML, updates asset records in iTwin, and creates maintenance requests in ServiceNow.

naftiko: "0.5"
info:
  label: "Vegetation Encroachment Detection Pipeline"
  description: "Analyzes satellite imagery from S3, detects vegetation encroachment via Azure ML, updates asset records in iTwin, and creates maintenance requests in ServiceNow."
  tags:
    - vegetation-management
    - remote-sensing
    - amazon-s3
    - azure-machine-learning
    - itwin
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: vegetation-detection
      port: 8080
      tools:
        - name: detect-encroachment
          description: "Analyze imagery, detect vegetation, update assets, and create maintenance requests."
          inputParameters:
            - name: corridor_id
              in: body
              type: string
              description: "The infrastructure corridor identifier."
            - name: bucket
              in: body
              type: string
              description: "S3 bucket with satellite imagery."
            - name: imagery_key
              in: body
              type: string
              description: "S3 key for the imagery file."
            - name: model_id
              in: body
              type: string
              description: "iTwin model ID."
          steps:
            - name: get-imagery
              type: call
              call: "s3.get-object"
              with:
                bucket: "{{bucket}}"
                key: "{{imagery_key}}"
            - name: detect-vegetation
              type: call
              call: "azureml.score"
              with:
                model_type: "vegetation_encroachment"
                imagery: "{{get-imagery.body}}"
                corridor_id: "{{corridor_id}}"
            - name: update-asset-model
              type: call
              call: "itwin.update-properties"
              with:
                model_id: "{{model_id}}"
                properties:
                  vegetation_risk: "{{detect-vegetation.risk_level}}"
                  encroachment_zones: "{{detect-vegetation.zone_count}}"
            - name: create-maintenance-request
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Vegetation encroachment: corridor {{corridor_id}}"
                description: "Detected {{detect-vegetation.zone_count}} encroachment zones. Risk: {{detect-vegetation.risk_level}}. Highest priority zone: {{detect-vegetation.priority_zone}}."
                category: "vegetation_management"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: get-object
              method: GET
    - type: http
      namespace: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: itwin
      baseUri: "https://api.bentley.com/itwins/v1"
      authentication:
        type: bearer
        token: "$secrets.itwin_token"
      resources:
        - name: properties
          path: "/models/{{model_id}}/properties"
          inputParameters:
            - name: model_id
              in: path
          operations:
            - name: update-properties
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.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 vendor is approved in Oracle EBS, creates a vendor record in SAP, opens a ServiceNow onboarding request, and notifies procurement via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Onboarding Orchestrator"
  description: "When a new vendor is approved in Oracle EBS, creates a vendor record in SAP, opens a ServiceNow onboarding request, and notifies procurement via Microsoft Teams."
  tags:
    - procurement
    - vendor-management
    - oracle-e-business-suite
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vendor-onboarding
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given an Oracle EBS vendor ID, orchestrate vendor onboarding across SAP, ServiceNow, and Microsoft Teams."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The Oracle EBS vendor ID."
            - name: procurement_channel
              in: body
              type: string
              description: "Microsoft Teams channel for procurement notifications."
          steps:
            - name: get-vendor
              type: call
              call: "oracle-ebs.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: create-sap-vendor
              type: call
              call: "sap.create-vendor"
              with:
                vendor_name: "{{get-vendor.vendor_name}}"
                tax_id: "{{get-vendor.tax_id}}"
                country: "{{get-vendor.country}}"
            - name: open-onboarding-request
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Vendor onboarding: {{get-vendor.vendor_name}}"
                category: "procurement_onboarding"
                description: "New vendor {{get-vendor.vendor_name}} approved. SAP vendor: {{create-sap-vendor.vendor_number}}."
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{procurement_channel}}"
                text: "New vendor onboarded: {{get-vendor.vendor_name}}. SAP: {{create-sap-vendor.vendor_number}}. ServiceNow: {{open-onboarding-request.number}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://bentley-ebs.oraclecloud.com/webservices/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_ebs_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://bentley-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries water pressure sensor data from Snowflake, detects anomalies via Azure ML, logs alerts in ServiceNow, and posts notifications to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Water Network Pressure Monitoring Pipeline"
  description: "Queries water pressure sensor data from Snowflake, detects anomalies via Azure ML, logs alerts in ServiceNow, and posts notifications to Microsoft Teams."
  tags:
    - water-infrastructure
    - monitoring
    - snowflake
    - azure-machine-learning
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: water-pressure
      port: 8080
      tools:
        - name: monitor-water-pressure
          description: "Analyze water pressure data, detect anomalies, log alerts, and notify operations."
          inputParameters:
            - name: network_zone
              in: body
              type: string
              description: "The water network zone identifier."
            - name: ops_channel
              in: body
              type: string
              description: "Microsoft Teams operations channel ID."
          steps:
            - name: get-pressure-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM WATER_PRESSURE_READINGS WHERE zone = '{{network_zone}}' AND reading_time >= DATEADD(hour, -6, CURRENT_TIMESTAMP())"
                warehouse: "UTILITIES_WH"
            - name: detect-anomalies
              type: call
              call: "azureml.score"
              with:
                model_type: "pressure_anomaly"
                data: "{{get-pressure-data.results}}"
            - name: log-alert
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Water pressure anomaly in zone {{network_zone}}"
                description: "Anomaly score: {{detect-anomalies.anomaly_score}}. Affected sensors: {{detect-anomalies.affected_sensors}}."
                urgency: "2"
            - name: notify-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel}}"
                text: "Water pressure anomaly detected in zone {{network_zone}}. Score: {{detect-anomalies.anomaly_score}}. Incident: {{log-alert.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://bentley.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: azureml
      baseUri: "https://bentley-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://bentley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves employee details from Workday by worker ID, returning name, department, title, and work email.

naftiko: "0.5"
info:
  label: "Workday Employee Directory Lookup"
  description: "Retrieves employee details from Workday by worker ID, returning name, department, title, and work email."
  tags:
    - hr
    - workday
    - employee
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an employee in Workday by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.fullName"
            - name: department
              type: string
              mapping: "$.department"
            - name: title
              type: string
              mapping: "$.jobTitle"
            - name: email
              type: string
              mapping: "$.workEmail"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Creates a Zoom meeting for infrastructure project reviews and returns the join URL and meeting ID.

naftiko: "0.5"
info:
  label: "Zoom Meeting Scheduler"
  description: "Creates a Zoom meeting for infrastructure project reviews and returns the join URL and meeting ID."
  tags:
    - collaboration
    - zoom
    - meetings
capability:
  exposes:
    - type: mcp
      namespace: meeting-scheduler
      port: 8080
      tools:
        - name: create-zoom-meeting
          description: "Create a Zoom meeting with specified topic and duration."
          inputParameters:
            - name: topic
              in: body
              type: string
              description: "The meeting topic."
            - name: duration
              in: body
              type: integer
              description: "Meeting duration in minutes."
            - name: start_time
              in: body
              type: string
              description: "Meeting start time in ISO 8601 format."
          call: "zoom.create-meeting"
          with:
            topic: "{{topic}}"
            duration: "{{duration}}"
            start_time: "{{start_time}}"
          outputParameters:
            - name: join_url
              type: string
              mapping: "$.join_url"
            - name: meeting_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              method: POST