Bentley Capabilities
Naftiko 0.5 capability definitions for Bentley - 100 capabilities showing integration workflows and service orchestrations.
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