AECOM Capabilities
Naftiko 0.5 capability definitions for AECOM - 100 capabilities showing integration workflows and service orchestrations.
Retrieves payroll summary data from ADP for a given employee ID, returning gross pay, net pay, and pay period for project labor cost tracking.
naftiko: "0.5"
info:
label: "ADP Payroll Data Lookup"
description: "Retrieves payroll summary data from ADP for a given employee ID, returning gross pay, net pay, and pay period for project labor cost tracking."
tags:
- hr
- adp
- payroll
capability:
exposes:
- type: mcp
namespace: payroll
port: 8080
tools:
- name: get-payroll-summary
description: "Retrieve payroll summary from ADP by employee ID."
inputParameters:
- name: employee_id
in: body
type: string
description: "The ADP employee identifier."
call: "adp.get-payroll"
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: gross_pay
type: string
mapping: "$.payStatements[0].grossPayAmount"
- name: net_pay
type: string
mapping: "$.payStatements[0].netPayAmount"
- name: pay_period
type: string
mapping: "$.payStatements[0].payPeriod"
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/hr/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: payroll
path: "/workers/{{employee_id}}/pay-statements"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-payroll
method: GET
Reads a Jira epic and its child issues, creates corresponding Asana tasks for non-technical stakeholders, and sends a Slack summary to the project channel.
naftiko: "0.5"
info:
label: "Asana Task Assignment from Jira Epic"
description: "Reads a Jira epic and its child issues, creates corresponding Asana tasks for non-technical stakeholders, and sends a Slack summary to the project channel."
tags:
- project-management
- jira
- asana
- slack
capability:
exposes:
- type: mcp
namespace: cross-platform-tasks
port: 8080
tools:
- name: sync-epic-to-asana
description: "Pull a Jira epic with children, create Asana tasks, and notify via Slack."
inputParameters:
- name: epic_key
in: body
type: string
description: "The Jira epic issue key."
- name: asana_project_gid
in: body
type: string
description: "The Asana project GID."
- name: slack_channel
in: body
type: string
description: "The Slack channel name."
steps:
- name: get-epic
type: call
call: "jira.get-issue"
with:
issue_key: "{{epic_key}}"
- name: create-asana-task
type: call
call: "asana.create-task"
with:
project_gid: "{{asana_project_gid}}"
name: "{{get-epic.summary}}"
notes: "From Jira: {{epic_key}}. Status: {{get-epic.status}}. Priority: {{get-epic.priority}}."
- name: notify-channel
type: call
call: "slack.send-message"
with:
channel: "{{slack_channel}}"
text: "Jira epic {{epic_key}} synced to Asana. Task: {{create-asana-task.url}}. Status: {{get-epic.status}}."
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.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
- type: http
namespace: asana
baseUri: "https://app.asana.com/api/1.0"
authentication:
type: bearer
token: "$secrets.asana_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
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: send-message
method: POST
Fetches the latest version metadata of an AutoCAD drawing stored in Autodesk BIM 360, including revision number, last modified date, and author.
naftiko: "0.5"
info:
label: "AutoCAD Drawing Version Retrieval"
description: "Fetches the latest version metadata of an AutoCAD drawing stored in Autodesk BIM 360, including revision number, last modified date, and author."
tags:
- engineering
- autocad
- autodesk
capability:
exposes:
- type: mcp
namespace: cad-management
port: 8080
tools:
- name: get-drawing-version
description: "Retrieve the latest revision metadata of an AutoCAD drawing from Autodesk BIM 360 by item ID."
inputParameters:
- name: project_id
in: body
type: string
description: "The BIM 360 project identifier."
- name: item_id
in: body
type: string
description: "The drawing item identifier in BIM 360."
call: "autodesk.get-item-versions"
with:
project_id: "{{project_id}}"
item_id: "{{item_id}}"
outputParameters:
- name: version_number
type: string
mapping: "$.data[0].attributes.versionNumber"
- name: last_modified
type: string
mapping: "$.data[0].attributes.lastModifiedTime"
- name: author
type: string
mapping: "$.data[0].attributes.lastModifiedUserName"
consumes:
- type: http
namespace: autodesk
baseUri: "https://developer.api.autodesk.com/data/v1/projects"
authentication:
type: bearer
token: "$secrets.autodesk_token"
resources:
- name: item-versions
path: "/{{project_id}}/items/{{item_id}}/versions"
inputParameters:
- name: project_id
in: path
- name: item_id
in: path
operations:
- name: get-item-versions
method: GET
Collects bid requirements from Salesforce, assembles cost estimates from Oracle, generates proposal in Confluence, and notifies bid team.
naftiko: "0.5"
info:
label: "Bid Proposal Assembly Pipeline"
description: "Collects bid requirements from Salesforce, assembles cost estimates from Oracle, generates proposal in Confluence, and notifies bid team."
tags:
- bidding
- salesforce
- oracle
- confluence
- slack
capability:
exposes:
- type: mcp
namespace: bidding
port: 8080
tools:
- name: bid_proposal_assembly_pipeline
description: "Orchestrate bid proposal assembly pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-salesforce
type: call
call: "salesforce.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-oracle
type: call
call: "oracle.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-confluence
type: call
call: "confluence.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: salesforce-op
method: POST
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Receives change orders, validates scope and cost in Oracle, routes for approval in ServiceNow, updates project budget, and notifies stakeholders.
naftiko: "0.5"
info:
label: "Change Order Processing Pipeline"
description: "Receives change orders, validates scope and cost in Oracle, routes for approval in ServiceNow, updates project budget, and notifies stakeholders."
tags:
- change-management
- oracle
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: change-management
port: 8080
tools:
- name: change_order_processing_pipeline
description: "Orchestrate change order processing pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Extracts billing data from Oracle, reconciles with project costs in Snowflake, creates invoices, logs in ServiceNow, and notifies finance.
naftiko: "0.5"
info:
label: "Client Billing Reconciliation Pipeline"
description: "Extracts billing data from Oracle, reconciles with project costs in Snowflake, creates invoices, logs in ServiceNow, and notifies finance."
tags:
- finance
- oracle
- snowflake
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: client_billing_reconciliation_pipeline
description: "Orchestrate client billing reconciliation pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Generates a client invoice by pulling billable hours from Oracle EBS, creating the invoice document in Google Docs, uploading to SharePoint, updating the Salesforce opportunity, and emailing the client via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Client Invoice Generation Pipeline"
description: "Generates a client invoice by pulling billable hours from Oracle EBS, creating the invoice document in Google Docs, uploading to SharePoint, updating the Salesforce opportunity, and emailing the client via Microsoft Outlook."
tags:
- finance
- oracle-e-business-suite
- google-docs
- sharepoint
- salesforce
- microsoft-outlook
- invoicing
capability:
exposes:
- type: mcp
namespace: invoicing
port: 8080
tools:
- name: generate-client-invoice
description: "Pull billable data, create invoice, upload, update CRM, and email client."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID."
- name: client_email
in: body
type: string
description: "The client contact email."
- name: billing_period
in: body
type: string
description: "The billing period (e.g., 2026-Q1)."
steps:
- name: get-billable-data
type: call
call: "oracle-ebs.get-billable-hours"
with:
project_number: "{{project_number}}"
period: "{{billing_period}}"
- name: create-invoice-doc
type: call
call: "googledocs.create-document"
with:
title: "Invoice: {{project_number}} - {{billing_period}}"
body: "Billable hours: {{get-billable-data.total_hours}}. Amount: ${{get-billable-data.total_amount}}. Period: {{billing_period}}."
- name: upload-invoice
type: call
call: "sharepoint.upload-file"
with:
site_id: "finance_invoices"
folder_path: "Invoices/{{project_number}}"
file_name: "invoice_{{billing_period}}.pdf"
- name: update-opportunity
type: call
call: "salesforce.update-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
last_invoice_date: "{{billing_period}}"
invoiced_amount: "{{get-billable-data.total_amount}}"
- name: email-client
type: call
call: "outlook.send-mail"
with:
to: "{{client_email}}"
subject: "Invoice: Project {{project_number}} - {{billing_period}}"
body: "Please find attached the invoice for {{billing_period}}. Total: ${{get-billable-data.total_amount}}. Document: {{upload-invoice.url}}"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: billable
path: "/billable-hours/{{project_number}}?period={{period}}"
inputParameters:
- name: project_number
in: path
- name: period
in: query
operations:
- name: get-billable-hours
method: GET
- type: http
namespace: googledocs
baseUri: "https://docs.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_docs_token"
resources:
- name: documents
path: "/documents"
operations:
- name: create-document
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}}/{{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: salesforce
baseUri: "https://aecom.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: update-opportunity
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
Retrieves an engineering design specification page from Confluence by page ID, returning the title, body content, and last update timestamp.
naftiko: "0.5"
info:
label: "Confluence Design Spec Retrieval"
description: "Retrieves an engineering design specification page from Confluence by page ID, returning the title, body content, and last update timestamp."
tags:
- engineering
- confluence
- documentation
capability:
exposes:
- type: mcp
namespace: knowledge-management
port: 8080
tools:
- name: get-design-spec
description: "Retrieve a Confluence page used as an engineering design specification."
inputParameters:
- name: page_id
in: body
type: string
description: "The Confluence page identifier."
call: "confluence.get-page"
with:
page_id: "{{page_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: last_updated
type: string
mapping: "$.version.when"
consumes:
- type: http
namespace: confluence
baseUri: "https://aecom.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
method: GET
Retrieves Confluence page content for AECOM knowledge base.
naftiko: "0.5"
info:
label: "Confluence Page Retrieval"
description: "Retrieves Confluence page content for AECOM knowledge base."
tags:
- collaboration
- confluence
- documentation
capability:
exposes:
- type: mcp
namespace: knowledge
port: 8080
tools:
- name: get-page
description: "Get page at AECOM."
inputParameters:
- name: page_id
in: body
type: string
description: "The page_id to look up."
call: "confluence.get-page_id"
with:
page_id: "{{page_id}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence_page_retrieval
method: GET
When a construction change order is submitted in Oracle EBS, creates a Jira change request, updates the project schedule in Microsoft Project, and notifies the project manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Construction Change Order Pipeline"
description: "When a construction change order is submitted in Oracle EBS, creates a Jira change request, updates the project schedule in Microsoft Project, and notifies the project manager via Microsoft Teams."
tags:
- construction
- oracle-e-business-suite
- jira
- microsoft-project
- microsoft-teams
- change-management
capability:
exposes:
- type: mcp
namespace: change-order-management
port: 8080
tools:
- name: process-change-order
description: "Orchestrate processing of a construction change order from Oracle EBS through Jira tracking, schedule update, and PM notification."
inputParameters:
- name: change_order_id
in: body
type: string
description: "The Oracle EBS change order identifier."
- name: project_id
in: body
type: string
description: "The Microsoft Project GUID."
- name: pm_email
in: body
type: string
description: "The project manager email for notification."
steps:
- name: get-change-order
type: call
call: "oracle-ebs.get-change-order"
with:
change_order_id: "{{change_order_id}}"
- name: create-change-request
type: call
call: "jira.create-issue"
with:
project_key: "CONSTR"
summary: "CO: {{get-change-order.description}}"
description: "Change Order {{change_order_id}} - Cost Impact: ${{get-change-order.cost_impact}}. Schedule Impact: {{get-change-order.schedule_days}} days."
issue_type: "Change Request"
- name: update-schedule
type: call
call: "msproject.update-task"
with:
project_id: "{{project_id}}"
task_name: "{{get-change-order.affected_task}}"
duration_change: "{{get-change-order.schedule_days}}"
- name: notify-pm
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{pm_email}}"
text: "Change Order {{change_order_id}} processed. Cost: ${{get-change-order.cost_impact}}. Jira: {{create-change-request.key}}. Schedule updated by {{get-change-order.schedule_days}} days."
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: change-orders
path: "/change-orders/{{change_order_id}}"
inputParameters:
- name: change_order_id
in: path
operations:
- name: get-change-order
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.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: msproject
baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "('{{project_id}}')/Tasks"
inputParameters:
- name: project_id
in: path
operations:
- name: update-task
method: PATCH
- 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
Receives claims, validates against contracts in Oracle, analyzes in Snowflake, creates resolution workflow in ServiceNow, and notifies legal.
naftiko: "0.5"
info:
label: "Construction Claims Management Pipeline"
description: "Receives claims, validates against contracts in Oracle, analyzes in Snowflake, creates resolution workflow in ServiceNow, and notifies legal."
tags:
- claims
- oracle
- snowflake
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: claims
port: 8080
tools:
- name: construction_claims_management_pipeline
description: "Orchestrate construction claims management pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Compares project costs against industry benchmarks in Snowflake, identifies optimization opportunities, creates Jira tasks, and reports to management.
naftiko: "0.5"
info:
label: "Construction Cost Benchmarking"
description: "Compares project costs against industry benchmarks in Snowflake, identifies optimization opportunities, creates Jira tasks, and reports to management."
tags:
- cost-management
- snowflake
- jira
- powerbi
- slack
capability:
exposes:
- type: mcp
namespace: cost-management
port: 8080
tools:
- name: construction_cost_benchmarking
description: "Orchestrate construction cost benchmarking workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-snowflake
type: call
call: "snowflake.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-jira
type: call
call: "jira.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-servicenow
type: call
call: "servicenow.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
Analyzes schedule delays from Oracle Primavera, identifies critical path impacts in Snowflake, creates recovery plans in Jira, and notifies management.
naftiko: "0.5"
info:
label: "Construction Delay Analysis Pipeline"
description: "Analyzes schedule delays from Oracle Primavera, identifies critical path impacts in Snowflake, creates recovery plans in Jira, and notifies management."
tags:
- scheduling
- oracle
- snowflake
- jira
- slack
capability:
exposes:
- type: mcp
namespace: scheduling
port: 8080
tools:
- name: construction_delay_analysis_pipeline
description: "Orchestrate construction delay analysis pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-jira
type: call
call: "jira.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Collects field progress data, compares against baseline schedule in Oracle, updates Snowflake analytics, refreshes dashboards, and alerts management.
naftiko: "0.5"
info:
label: "Construction Progress Monitoring"
description: "Collects field progress data, compares against baseline schedule in Oracle, updates Snowflake analytics, refreshes dashboards, and alerts management."
tags:
- construction
- oracle
- snowflake
- powerbi
- slack
capability:
exposes:
- type: mcp
namespace: construction
port: 8080
tools:
- name: construction_progress_monitoring
description: "Orchestrate construction progress monitoring workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-servicenow
type: call
call: "servicenow.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
Collects safety incident reports, validates against OSHA requirements, creates investigations in ServiceNow, updates dashboards, and alerts safety team.
naftiko: "0.5"
info:
label: "Construction Site Safety Pipeline"
description: "Collects safety incident reports, validates against OSHA requirements, creates investigations in ServiceNow, updates dashboards, and alerts safety team."
tags:
- safety
- servicenow
- snowflake
- powerbi
- slack
capability:
exposes:
- type: mcp
namespace: safety
port: 8080
tools:
- name: construction_site_safety_pipeline
description: "Orchestrate construction site safety pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-servicenow
type: call
call: "servicenow.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Processes contractor timesheets by retrieving hours from Oracle EBS, validating against the project budget, creating an approval task in Jira, and notifying the project manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Contractor Timesheet Approval Workflow"
description: "Processes contractor timesheets by retrieving hours from Oracle EBS, validating against the project budget, creating an approval task in Jira, and notifying the project manager via Microsoft Teams."
tags:
- construction
- oracle-e-business-suite
- jira
- microsoft-teams
- timesheet
capability:
exposes:
- type: mcp
namespace: timesheet-management
port: 8080
tools:
- name: process-contractor-timesheet
description: "Retrieve timesheet data, validate against budget, create approval task, and notify PM."
inputParameters:
- name: contractor_id
in: body
type: string
description: "The contractor identifier in Oracle EBS."
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: week_ending
in: body
type: string
description: "The week ending date (YYYY-MM-DD)."
- name: pm_email
in: body
type: string
description: "The project manager email."
steps:
- name: get-timesheet
type: call
call: "oracle-ebs.get-timesheet"
with:
contractor_id: "{{contractor_id}}"
project_number: "{{project_number}}"
week_ending: "{{week_ending}}"
- name: get-budget
type: call
call: "oracle-ebs.get-project-costs"
with:
project_number: "{{project_number}}"
- name: create-approval-task
type: call
call: "jira.create-issue"
with:
project_key: "CONSTR"
summary: "Timesheet approval: {{get-timesheet.contractor_name}} - W/E {{week_ending}}"
description: "Hours: {{get-timesheet.total_hours}}. Cost: ${{get-timesheet.total_cost}}. Budget remaining: ${{get-budget.travel_budget_remaining}}."
issue_type: "Task"
- name: notify-pm
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{pm_email}}"
text: "Timesheet pending approval: {{get-timesheet.contractor_name}}, {{get-timesheet.total_hours}} hrs (${{get-timesheet.total_cost}}) for W/E {{week_ending}}. Jira: {{create-approval-task.key}}"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: timesheets
path: "/timesheets?contractor={{contractor_id}}&project={{project_number}}&weekEnding={{week_ending}}"
inputParameters:
- name: contractor_id
in: query
- name: project_number
in: query
- name: week_ending
in: query
operations:
- name: get-timesheet
method: GET
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.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
Collects contractor timesheets, validates against contracts in SAP, creates approval workflows in ServiceNow, and notifies project managers.
naftiko: "0.5"
info:
label: "Contractor Timesheet Processing Pipeline"
description: "Collects contractor timesheets, validates against contracts in SAP, creates approval workflows in ServiceNow, and notifies project managers."
tags:
- workforce
- sap
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: workforce
port: 8080
tools:
- name: contractor_timesheet_processing_pipeline
description: "Orchestrate contractor timesheet processing pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-sap
type: call
call: "sap.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Retrieves a purchase requisition from Coupa by ID, returning the status, requested amount, supplier, and approval status for procurement tracking.
naftiko: "0.5"
info:
label: "Coupa Purchase Requisition Lookup"
description: "Retrieves a purchase requisition from Coupa by ID, returning the status, requested amount, supplier, and approval status for procurement tracking."
tags:
- procurement
- coupa
capability:
exposes:
- type: mcp
namespace: procurement-coupa
port: 8080
tools:
- name: get-requisition
description: "Look up a Coupa purchase requisition by ID."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The Coupa requisition identifier."
call: "coupa.get-requisition"
with:
requisition_id: "{{requisition_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: total_amount
type: string
mapping: "$.total"
- name: supplier_name
type: string
mapping: "$.supplier.name"
consumes:
- type: http
namespace: coupa
baseUri: "https://aecom.coupahost.com/api"
authentication:
type: apiKey
name: X-COUPA-API-KEY
in: header
value: "$secrets.coupa_api_key"
resources:
- name: requisitions
path: "/requisitions/{{requisition_id}}"
inputParameters:
- name: requisition_id
in: path
operations:
- name: get-requisition
method: GET
Aggregates daily construction progress from Autodesk BIM 360 field data, updates the project cost tracker in Oracle EBS, generates a Power BI report refresh, and posts a summary to a Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Daily Construction Progress Reporter"
description: "Aggregates daily construction progress from Autodesk BIM 360 field data, updates the project cost tracker in Oracle EBS, generates a Power BI report refresh, and posts a summary to a Microsoft Teams channel."
tags:
- construction
- autodesk
- oracle-e-business-suite
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: construction-reporting
port: 8080
tools:
- name: generate-daily-report
description: "Collect daily field data, update costs, refresh BI report, and post summary to the project Teams channel."
inputParameters:
- name: bim360_project_id
in: body
type: string
description: "The BIM 360 project identifier."
- name: oracle_project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: powerbi_dataset_id
in: body
type: string
description: "The Power BI dataset identifier."
- name: teams_channel_id
in: body
type: string
description: "The Microsoft Teams channel ID for posting."
steps:
- name: get-field-data
type: call
call: "autodesk.get-daily-log"
with:
project_id: "{{bim360_project_id}}"
- name: update-costs
type: call
call: "oracle-ebs.update-project-costs"
with:
project_number: "{{oracle_project_number}}"
labor_hours: "{{get-field-data.total_labor_hours}}"
equipment_hours: "{{get-field-data.equipment_hours}}"
- name: refresh-report
type: call
call: "powerbi.trigger-refresh"
with:
dataset_id: "{{powerbi_dataset_id}}"
- name: post-summary
type: call
call: "msteams.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
text: "Daily Progress: {{get-field-data.percent_complete}}% complete. Labor: {{get-field-data.total_labor_hours}} hrs. Weather: {{get-field-data.weather_conditions}}. Issues: {{get-field-data.open_issues_count}}."
consumes:
- type: http
namespace: autodesk
baseUri: "https://developer.api.autodesk.com/bim360/docs/v1/projects"
authentication:
type: bearer
token: "$secrets.autodesk_token"
resources:
- name: daily-logs
path: "/{{project_id}}/daily-logs"
inputParameters:
- name: project_id
in: path
operations:
- name: get-daily-log
method: GET
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: update-project-costs
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: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
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 Datadog monitor status for AECOM infrastructure.
naftiko: "0.5"
info:
label: "Datadog Monitor Status"
description: "Retrieves Datadog monitor status for AECOM infrastructure."
tags:
- monitoring
- datadog
- alerting
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: get-monitor
description: "Check monitor at AECOM."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The monitor_id to look up."
call: "datadog.get-monitor_id"
with:
monitor_id: "{{monitor_id}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
header: "DD-API-KEY"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: datadog_monitor_status
method: GET
Runs BIM clash detection, logs findings in Jira, tracks resolution progress, updates Confluence reports, and notifies design leads.
naftiko: "0.5"
info:
label: "Design Clash Detection Pipeline"
description: "Runs BIM clash detection, logs findings in Jira, tracks resolution progress, updates Confluence reports, and notifies design leads."
tags:
- engineering
- jira
- confluence
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: design_clash_detection_pipeline
description: "Orchestrate design clash detection pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-confluence
type: call
call: "confluence.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Assembles design package from Confluence, routes for client review in Jira, tracks comments, creates revisions, and notifies design leads.
naftiko: "0.5"
info:
label: "Design Review Submission Pipeline"
description: "Assembles design package from Confluence, routes for client review in Jira, tracks comments, creates revisions, and notifies design leads."
tags:
- engineering
- confluence
- jira
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: design_review_submission_pipeline
description: "Orchestrate design review submission pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-confluence
type: call
call: "confluence.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-jira
type: call
call: "jira.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
When an engineering design review is initiated, retrieves the drawing from Autodesk BIM 360, creates a Confluence review page, assigns review tasks in Jira, and sends calendar invites via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Design Review Workflow"
description: "When an engineering design review is initiated, retrieves the drawing from Autodesk BIM 360, creates a Confluence review page, assigns review tasks in Jira, and sends calendar invites via Microsoft Outlook."
tags:
- engineering
- autodesk
- confluence
- jira
- microsoft-outlook
- design-review
capability:
exposes:
- type: mcp
namespace: design-review
port: 8080
tools:
- name: initiate-design-review
description: "Start a design review workflow by pulling the drawing, creating a Confluence page, assigning Jira tasks, and scheduling the review meeting."
inputParameters:
- name: bim360_project_id
in: body
type: string
description: "The BIM 360 project identifier."
- name: drawing_item_id
in: body
type: string
description: "The BIM 360 drawing item ID."
- name: reviewer_emails
in: body
type: string
description: "Comma-separated list of reviewer email addresses."
- name: review_date
in: body
type: string
description: "The scheduled review date in YYYY-MM-DD format."
steps:
- name: get-drawing
type: call
call: "autodesk.get-item"
with:
project_id: "{{bim360_project_id}}"
item_id: "{{drawing_item_id}}"
- name: create-review-page
type: call
call: "confluence.create-page"
with:
space_key: "ENGR"
title: "Design Review: {{get-drawing.name}} - {{review_date}}"
body: "Drawing: {{get-drawing.name}} (Rev {{get-drawing.version}}). Download: {{get-drawing.download_url}}. Reviewers: {{reviewer_emails}}."
- name: create-review-task
type: call
call: "jira.create-issue"
with:
project_key: "ENGR"
summary: "Design Review: {{get-drawing.name}}"
description: "Complete review by {{review_date}}. Confluence: {{create-review-page.url}}"
issue_type: "Task"
- name: send-invite
type: call
call: "outlook.create-event"
with:
subject: "Design Review: {{get-drawing.name}}"
start_date: "{{review_date}}"
attendees: "{{reviewer_emails}}"
body: "Please review the design at {{create-review-page.url}}. Jira: {{create-review-task.key}}"
consumes:
- type: http
namespace: autodesk
baseUri: "https://developer.api.autodesk.com/data/v1/projects"
authentication:
type: bearer
token: "$secrets.autodesk_token"
resources:
- name: items
path: "/{{project_id}}/items/{{item_id}}"
inputParameters:
- name: project_id
in: path
- name: item_id
in: path
operations:
- name: get-item
method: GET
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.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: events
path: "/events"
operations:
- name: create-event
method: POST
Searches Elasticsearch indexes for AECOM.
naftiko: "0.5"
info:
label: "Elasticsearch Log Query"
description: "Searches Elasticsearch indexes for AECOM."
tags:
- data
- elasticsearch
- search
capability:
exposes:
- type: mcp
namespace: search
port: 8080
tools:
- name: search-logs
description: "Search ES logs at AECOM."
inputParameters:
- name: query
in: body
type: string
description: "The query to look up."
call: "elasticsearch.get-query"
with:
query: "{{query}}"
consumes:
- type: http
namespace: elasticsearch
baseUri: "https://aecom-es.com:9200"
authentication:
type: bearer
token: "$secrets.elasticsearch_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: elasticsearch_log_query
method: GET
Retrieves employee training records from Workday, checks certification expirations, creates Jira tasks for overdue trainings, and sends reminders via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Employee Training Compliance Tracker"
description: "Retrieves employee training records from Workday, checks certification expirations, creates Jira tasks for overdue trainings, and sends reminders via Microsoft Outlook."
tags:
- hr
- workday
- jira
- microsoft-outlook
- compliance
- training
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-training-compliance
description: "Check an employee training compliance status, create tasks for overdue items, and send reminders."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker identifier."
- name: certification_type
in: body
type: string
description: "The certification type to check (e.g., OSHA-30, PE-License)."
steps:
- name: get-training-record
type: call
call: "workday.get-training-records"
with:
worker_id: "{{worker_id}}"
certification: "{{certification_type}}"
- name: create-renewal-task
type: call
call: "jira.create-issue"
with:
project_key: "HR"
summary: "Training renewal: {{certification_type}} for {{get-training-record.employee_name}}"
description: "Certification {{certification_type}} expires on {{get-training-record.expiry_date}}. Employee: {{get-training-record.employee_name}}."
issue_type: "Task"
- name: send-reminder
type: call
call: "outlook.send-mail"
with:
to: "{{get-training-record.employee_email}}"
subject: "Training Renewal Required: {{certification_type}}"
body: "Your {{certification_type}} certification expires on {{get-training-record.expiry_date}}. Please complete renewal. Tracking: {{create-renewal-task.key}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/workers/{{worker_id}}/training?certification={{certification}}"
inputParameters:
- name: worker_id
in: path
- name: certification
in: query
operations:
- name: get-training-records
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.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
Routes AutoCAD drawings for review, tracks approvals in Jira, stores final versions in SharePoint, logs in ServiceNow, and notifies design team.
naftiko: "0.5"
info:
label: "Engineering Drawing Approval Workflow"
description: "Routes AutoCAD drawings for review, tracks approvals in Jira, stores final versions in SharePoint, logs in ServiceNow, and notifies design team."
tags:
- engineering
- jira
- servicenow
- confluence
- slack
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: engineering_drawing_approval_workflow
description: "Orchestrate engineering drawing approval workflow workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-confluence
type: call
call: "confluence.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Monitors RFI aging in Jira, escalates overdue items, notifies design leads, creates ServiceNow escalation tickets, and tracks resolution.
naftiko: "0.5"
info:
label: "Engineering RFI Escalation Pipeline"
description: "Monitors RFI aging in Jira, escalates overdue items, notifies design leads, creates ServiceNow escalation tickets, and tracks resolution."
tags:
- engineering
- jira
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: engineering_rfi_escalation_pipeline
description: "Orchestrate engineering rfi escalation pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
When an RFI is created in Autodesk BIM 360, logs a Jira issue for engineering review, uploads reference documents to SharePoint, and notifies the design lead in Microsoft Teams.
naftiko: "0.5"
info:
label: "Engineering RFI Orchestrator"
description: "When an RFI is created in Autodesk BIM 360, logs a Jira issue for engineering review, uploads reference documents to SharePoint, and notifies the design lead in Microsoft Teams."
tags:
- engineering
- autodesk
- jira
- sharepoint
- microsoft-teams
- rfi
capability:
exposes:
- type: mcp
namespace: rfi-management
port: 8080
tools:
- name: process-rfi
description: "Given an RFI from BIM 360, create a Jira tracking issue, upload reference docs to SharePoint, and notify the design lead via Teams."
inputParameters:
- name: bim360_project_id
in: body
type: string
description: "The BIM 360 project identifier."
- name: rfi_id
in: body
type: string
description: "The BIM 360 RFI identifier."
- name: design_lead_email
in: body
type: string
description: "The email of the design lead to notify."
steps:
- name: get-rfi
type: call
call: "autodesk.get-rfi"
with:
project_id: "{{bim360_project_id}}"
rfi_id: "{{rfi_id}}"
- name: create-jira-issue
type: call
call: "jira.create-issue"
with:
project_key: "ENGR"
summary: "RFI: {{get-rfi.title}}"
description: "RFI from BIM 360: {{get-rfi.description}}. Due: {{get-rfi.due_date}}"
issue_type: "Task"
- name: upload-reference
type: call
call: "sharepoint.upload-file"
with:
site_id: "engineering_rfi_site"
folder_path: "RFIs/{{get-rfi.rfi_number}}"
file_name: "{{get-rfi.attachment_name}}"
- name: notify-lead
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{design_lead_email}}"
text: "New RFI requires review: {{get-rfi.title}} ({{get-rfi.rfi_number}}). Jira: {{create-jira-issue.key}}. Docs: {{upload-reference.url}}"
consumes:
- type: http
namespace: autodesk
baseUri: "https://developer.api.autodesk.com/bim360/rfis/v2/containers"
authentication:
type: bearer
token: "$secrets.autodesk_token"
resources:
- name: rfis
path: "/{{project_id}}/rfis/{{rfi_id}}"
inputParameters:
- name: project_id
in: path
- name: rfi_id
in: path
operations:
- name: get-rfi
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.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: drive-items
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: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
For a given project site, geocodes the address via Google Maps, runs an environmental data query against the EPA API, logs findings to Confluence, and creates a Jira task for the environmental team.
naftiko: "0.5"
info:
label: "Environmental Compliance Assessment Orchestrator"
description: "For a given project site, geocodes the address via Google Maps, runs an environmental data query against the EPA API, logs findings to Confluence, and creates a Jira task for the environmental team."
tags:
- environmental
- google-maps
- confluence
- jira
- compliance
capability:
exposes:
- type: mcp
namespace: environmental-compliance
port: 8080
tools:
- name: assess-site-compliance
description: "Given a site address, geocode it, query EPA environmental data, document findings in Confluence, and create a Jira task for review."
inputParameters:
- name: site_address
in: body
type: string
description: "The street address of the project site."
- name: project_code
in: body
type: string
description: "The internal AECOM project code."
steps:
- name: geocode-site
type: call
call: "googlemaps.geocode"
with:
address: "{{site_address}}"
- name: query-epa
type: call
call: "epa.get-facility-info"
with:
latitude: "{{geocode-site.latitude}}"
longitude: "{{geocode-site.longitude}}"
- name: create-findings-page
type: call
call: "confluence.create-page"
with:
space_key: "ENV"
title: "Environmental Assessment: {{project_code}} - {{site_address}}"
body: "Site coordinates: {{geocode-site.latitude}}, {{geocode-site.longitude}}. EPA facilities within radius: {{query-epa.facility_count}}. Nearest regulated site: {{query-epa.nearest_facility_name}}."
- name: create-review-task
type: call
call: "jira.create-issue"
with:
project_key: "ENV"
summary: "Environmental review: {{project_code}}"
description: "Review EPA findings for {{site_address}}. Confluence page: {{create-findings-page.url}}. Facilities found: {{query-epa.facility_count}}."
issue_type: "Task"
consumes:
- type: http
namespace: googlemaps
baseUri: "https://maps.googleapis.com/maps/api"
authentication:
type: apiKey
name: key
in: query
value: "$secrets.google_maps_api_key"
resources:
- name: geocode
path: "/geocode/json?address={{address}}"
inputParameters:
- name: address
in: query
operations:
- name: geocode
method: GET
- type: http
namespace: epa
baseUri: "https://enviro.epa.gov/enviro/efservice"
authentication:
type: apiKey
name: api_key
in: query
value: "$secrets.epa_api_key"
resources:
- name: facilities
path: "/FACILITY_SEARCH/LATITUDE/{{latitude}}/LONGITUDE/{{longitude}}/JSON"
inputParameters:
- name: latitude
in: path
- name: longitude
in: path
operations:
- name: get-facility-info
method: GET
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.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
Collects environmental data, runs impact models in Snowflake, generates reports in Power BI, creates regulatory filings, and notifies EHS.
naftiko: "0.5"
info:
label: "Environmental Impact Assessment Pipeline"
description: "Collects environmental data, runs impact models in Snowflake, generates reports in Power BI, creates regulatory filings, and notifies EHS."
tags:
- environmental
- snowflake
- powerbi
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: environmental
port: 8080
tools:
- name: environmental_impact_assessment_pipeline
description: "Orchestrate environmental impact assessment pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-snowflake
type: call
call: "snowflake.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Schedules preventive maintenance for construction equipment by retrieving asset data from ServiceNow CMDB, creating a maintenance work order, assigning to a technician via Jira, and notifying the field supervisor via Microsoft Teams.
naftiko: "0.5"
info:
label: "Equipment Maintenance Scheduler"
description: "Schedules preventive maintenance for construction equipment by retrieving asset data from ServiceNow CMDB, creating a maintenance work order, assigning to a technician via Jira, and notifying the field supervisor via Microsoft Teams."
tags:
- construction
- servicenow
- jira
- microsoft-teams
- maintenance
- equipment
capability:
exposes:
- type: mcp
namespace: equipment-maintenance
port: 8080
tools:
- name: schedule-maintenance
description: "Retrieve equipment data, create a maintenance work order, assign to a technician, and notify the supervisor."
inputParameters:
- name: asset_id
in: body
type: string
description: "The ServiceNow CMDB asset identifier."
- name: maintenance_type
in: body
type: string
description: "The type of maintenance (preventive, corrective, inspection)."
- name: supervisor_email
in: body
type: string
description: "The field supervisor email."
steps:
- name: get-asset
type: call
call: "servicenow.get-asset"
with:
asset_id: "{{asset_id}}"
- name: create-work-order
type: call
call: "servicenow.create-work-order"
with:
asset_id: "{{asset_id}}"
description: "{{maintenance_type}} maintenance for {{get-asset.name}} ({{get-asset.model}})"
priority: "medium"
- name: create-task
type: call
call: "jira.create-issue"
with:
project_key: "MAINT"
summary: "{{maintenance_type}}: {{get-asset.name}}"
description: "Work Order: {{create-work-order.number}}. Asset: {{get-asset.name}} ({{get-asset.serial_number}}). Location: {{get-asset.location}}."
issue_type: "Task"
- name: notify-supervisor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{supervisor_email}}"
text: "Maintenance scheduled: {{maintenance_type}} for {{get-asset.name}}. Work Order: {{create-work-order.number}}. Jira: {{create-task.key}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: assets
path: "/table/cmdb_ci/{{asset_id}}"
inputParameters:
- name: asset_id
in: path
operations:
- name: get-asset
method: GET
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.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
Monitors equipment locations and usage from SAP, analyzes utilization in Snowflake, creates maintenance tasks in ServiceNow, and notifies ops.
naftiko: "0.5"
info:
label: "Field Equipment Tracking Pipeline"
description: "Monitors equipment locations and usage from SAP, analyzes utilization in Snowflake, creates maintenance tasks in ServiceNow, and notifies ops."
tags:
- equipment
- sap
- snowflake
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: equipment
port: 8080
tools:
- name: field_equipment_tracking_pipeline
description: "Orchestrate field equipment tracking pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-sap
type: call
call: "sap.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Exports a Figma design file as an image, uploads it to SharePoint for engineering reference, and posts the link to a Slack channel.
naftiko: "0.5"
info:
label: "Figma Design Asset Export"
description: "Exports a Figma design file as an image, uploads it to SharePoint for engineering reference, and posts the link to a Slack channel."
tags:
- design
- figma
- sharepoint
- slack
capability:
exposes:
- type: mcp
namespace: design-assets
port: 8080
tools:
- name: export-figma-design
description: "Export a Figma file image, upload to SharePoint, and notify via Slack."
inputParameters:
- name: file_key
in: body
type: string
description: "The Figma file key."
- name: node_id
in: body
type: string
description: "The specific node ID to export."
- name: project_code
in: body
type: string
description: "The AECOM project code."
steps:
- name: export-image
type: call
call: "figma.get-image"
with:
file_key: "{{file_key}}"
node_id: "{{node_id}}"
- name: upload-to-sharepoint
type: call
call: "sharepoint.upload-file"
with:
site_id: "design_assets"
folder_path: "Exports/{{project_code}}"
file_name: "{{node_id}}.png"
- name: notify-team
type: call
call: "slack.send-message"
with:
channel: "design-reviews"
text: "Figma design exported for {{project_code}}. Image: {{export-image.image_url}}. SharePoint: {{upload-to-sharepoint.url}}"
consumes:
- type: http
namespace: figma
baseUri: "https://api.figma.com/v1"
authentication:
type: bearer
token: "$secrets.figma_token"
resources:
- name: images
path: "/images/{{file_key}}?ids={{node_id}}"
inputParameters:
- name: file_key
in: path
- name: node_id
in: query
operations:
- name: get-image
method: GET
- 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}}/{{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: send-message
method: POST
Tracks vehicle fleet from SAP, monitors fuel consumption, schedules maintenance in ServiceNow, analyzes utilization in Snowflake, and notifies fleet ops.
naftiko: "0.5"
info:
label: "Fleet Management Pipeline"
description: "Tracks vehicle fleet from SAP, monitors fuel consumption, schedules maintenance in ServiceNow, analyzes utilization in Snowflake, and notifies fleet ops."
tags:
- fleet
- sap
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: fleet
port: 8080
tools:
- name: fleet_management_pipeline
description: "Orchestrate fleet management pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-sap
type: call
call: "sap.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Ingests GIS survey data, processes in Snowflake, generates maps, stores in SharePoint, creates Jira review tasks, and notifies GIS team.
naftiko: "0.5"
info:
label: "Geospatial Data Processing Pipeline"
description: "Ingests GIS survey data, processes in Snowflake, generates maps, stores in SharePoint, creates Jira review tasks, and notifies GIS team."
tags:
- gis
- snowflake
- jira
- confluence
- slack
capability:
exposes:
- type: mcp
namespace: gis
port: 8080
tools:
- name: geospatial_data_processing_pipeline
description: "Orchestrate geospatial data processing pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-snowflake
type: call
call: "snowflake.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-jira
type: call
call: "jira.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-confluence
type: call
call: "confluence.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Collects spatial field data from an ArcGIS feature service, geocodes reference points via Google Maps, stores processed data in PostgreSQL, and publishes a summary to Confluence.
naftiko: "0.5"
info:
label: "GIS Data Collection Pipeline"
description: "Collects spatial field data from an ArcGIS feature service, geocodes reference points via Google Maps, stores processed data in PostgreSQL, and publishes a summary to Confluence."
tags:
- geospatial
- google-maps
- confluence
- environmental
capability:
exposes:
- type: mcp
namespace: gis-data-collection
port: 8080
tools:
- name: collect-gis-data
description: "Retrieve spatial data from ArcGIS, geocode reference points, store results in PostgreSQL, and publish a summary."
inputParameters:
- name: feature_service_url
in: body
type: string
description: "The ArcGIS feature service endpoint URL."
- name: reference_address
in: body
type: string
description: "A reference address to geocode for spatial context."
- name: project_code
in: body
type: string
description: "The AECOM project code."
steps:
- name: query-features
type: call
call: "arcgis.query-features"
with:
service_url: "{{feature_service_url}}"
- name: geocode-reference
type: call
call: "googlemaps.geocode"
with:
address: "{{reference_address}}"
- name: store-data
type: call
call: "postgresql.insert-spatial-data"
with:
project_code: "{{project_code}}"
feature_count: "{{query-features.feature_count}}"
ref_lat: "{{geocode-reference.latitude}}"
ref_lng: "{{geocode-reference.longitude}}"
- name: publish-summary
type: call
call: "confluence.create-page"
with:
space_key: "GIS"
title: "GIS Data Collection: {{project_code}}"
body: "Features collected: {{query-features.feature_count}}. Reference point: {{geocode-reference.formatted_address}} ({{geocode-reference.latitude}}, {{geocode-reference.longitude}})."
consumes:
- type: http
namespace: arcgis
baseUri: "https://services.arcgis.com/aecom"
authentication:
type: bearer
token: "$secrets.arcgis_token"
resources:
- name: features
path: "/{{service_url}}/query?where=1=1&outFields=*&f=json"
inputParameters:
- name: service_url
in: path
operations:
- name: query-features
method: GET
- type: http
namespace: googlemaps
baseUri: "https://maps.googleapis.com/maps/api"
authentication:
type: apiKey
name: key
in: query
value: "$secrets.google_maps_api_key"
resources:
- name: geocode
path: "/geocode/json?address={{address}}"
inputParameters:
- name: address
in: query
operations:
- name: geocode
method: GET
- type: http
namespace: postgresql
baseUri: "https://aecom-gis-api.azurewebsites.net/api/v1"
authentication:
type: bearer
token: "$secrets.gis_api_token"
resources:
- name: spatial-data
path: "/spatial-data"
operations:
- name: insert-spatial-data
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
Retrieves GitHub repository metadata for AECOM.
naftiko: "0.5"
info:
label: "GitHub Repository Lookup"
description: "Retrieves GitHub repository metadata for AECOM."
tags:
- devops
- github
- source-control
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: get-repo
description: "Look up repo at AECOM."
inputParameters:
- name: repo_name
in: body
type: string
description: "The repo_name to look up."
call: "github.get-repo_name"
with:
repo_name: "{{repo_name}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: github_repository_lookup
method: GET
Archives completed engineering drawings by moving them from active Google Drive folders to an archive folder, updating metadata, and logging the action in Confluence.
naftiko: "0.5"
info:
label: "Google Drive Drawing Archive"
description: "Archives completed engineering drawings by moving them from active Google Drive folders to an archive folder, updating metadata, and logging the action in Confluence."
tags:
- document-management
- google-drive
- confluence
- engineering
capability:
exposes:
- type: mcp
namespace: drawing-archive
port: 8080
tools:
- name: archive-drawing
description: "Move a drawing to the archive folder in Google Drive and log the action in Confluence."
inputParameters:
- name: file_id
in: body
type: string
description: "The Google Drive file identifier."
- name: archive_folder_id
in: body
type: string
description: "The destination archive folder ID."
- name: project_code
in: body
type: string
description: "The project code for the Confluence log."
steps:
- name: get-file
type: call
call: "googledrive.get-file"
with:
file_id: "{{file_id}}"
- name: move-file
type: call
call: "googledrive.move-file"
with:
file_id: "{{file_id}}"
new_parent: "{{archive_folder_id}}"
- name: log-archive
type: call
call: "confluence.create-page"
with:
space_key: "ENGR"
title: "Archived: {{get-file.name}}"
body: "Drawing {{get-file.name}} archived from project {{project_code}} on {{move-file.modified_date}}. Original location: {{get-file.parents}}."
consumes:
- type: http
namespace: googledrive
baseUri: "https://www.googleapis.com/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files/{{file_id}}"
inputParameters:
- name: file_id
in: path
operations:
- name: get-file
method: GET
- name: move-file
method: PATCH
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
Geocodes a project site address using Google Maps API, returning latitude, longitude, and formatted address for use in GIS and environmental assessments.
naftiko: "0.5"
info:
label: "Google Maps Geocoding Lookup"
description: "Geocodes a project site address using Google Maps API, returning latitude, longitude, and formatted address for use in GIS and environmental assessments."
tags:
- geospatial
- google-maps
- environmental
capability:
exposes:
- type: mcp
namespace: geospatial
port: 8080
tools:
- name: geocode-address
description: "Geocode a project site address and return coordinates."
inputParameters:
- name: address
in: body
type: string
description: "The street address of the project site."
call: "googlemaps.geocode"
with:
address: "{{address}}"
outputParameters:
- name: latitude
type: string
mapping: "$.results[0].geometry.location.lat"
- name: longitude
type: string
mapping: "$.results[0].geometry.location.lng"
- name: formatted_address
type: string
mapping: "$.results[0].formatted_address"
consumes:
- type: http
namespace: googlemaps
baseUri: "https://maps.googleapis.com/maps/api"
authentication:
type: apiKey
name: key
in: query
value: "$secrets.google_maps_api_key"
resources:
- name: geocode
path: "/geocode/json?address={{address}}"
inputParameters:
- name: address
in: query
operations:
- name: geocode
method: GET
When a Grafana alert fires for infrastructure monitoring, creates a ServiceNow incident and notifies the on-call engineer via Slack with alert details and dashboard link.
naftiko: "0.5"
info:
label: "Grafana Alert Integration"
description: "When a Grafana alert fires for infrastructure monitoring, creates a ServiceNow incident and notifies the on-call engineer via Slack with alert details and dashboard link."
tags:
- monitoring
- grafana
- servicenow
- slack
- infrastructure
capability:
exposes:
- type: mcp
namespace: alert-management
port: 8080
tools:
- name: process-grafana-alert
description: "Process a Grafana alert by creating a ServiceNow incident and notifying the on-call engineer."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Grafana alert rule identifier."
- name: dashboard_uid
in: body
type: string
description: "The Grafana dashboard UID."
- name: oncall_channel
in: body
type: string
description: "The Slack on-call channel name."
steps:
- name: get-alert
type: call
call: "grafana.get-alert"
with:
alert_id: "{{alert_id}}"
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Grafana Alert: {{get-alert.name}}"
category: "infrastructure_monitoring"
priority: "{{get-alert.severity}}"
description: "Alert: {{get-alert.name}}. State: {{get-alert.state}}. Dashboard: https://aecom-grafana.azurewebsites.net/d/{{dashboard_uid}}"
- name: notify-oncall
type: call
call: "slack.send-message"
with:
channel: "{{oncall_channel}}"
text: "ALERT [{{get-alert.severity}}]: {{get-alert.name}}. State: {{get-alert.state}}. ServiceNow: {{create-incident.number}}. Dashboard: https://aecom-grafana.azurewebsites.net/d/{{dashboard_uid}}"
consumes:
- type: http
namespace: grafana
baseUri: "https://aecom-grafana.azurewebsites.net/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: alerts
path: "/v1/provisioning/alert-rules/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-alert
method: GET
- type: http
namespace: servicenow
baseUri: "https://aecom.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: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: send-message
method: POST
Queries Grafana dashboard data for AECOM monitoring.
naftiko: "0.5"
info:
label: "Grafana Dashboard Query"
description: "Queries Grafana dashboard data for AECOM monitoring."
tags:
- monitoring
- grafana
- dashboards
capability:
exposes:
- type: mcp
namespace: monitoring
port: 8080
tools:
- name: get-dashboard
description: "Query dashboard at AECOM."
inputParameters:
- name: dashboard_uid
in: body
type: string
description: "The dashboard_uid to look up."
call: "grafana.get-dashboard_uid"
with:
dashboard_uid: "{{dashboard_uid}}"
consumes:
- type: http
namespace: grafana
baseUri: "https://aecom-grafana.com/api"
authentication:
type: bearer
token: "$secrets.grafana_api_key"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: grafana_dashboard_query
method: GET
When a qualified lead arrives in HubSpot, retrieves the contact details, creates a Salesforce opportunity, and notifies the business development team via Microsoft Teams.
naftiko: "0.5"
info:
label: "HubSpot Lead to Salesforce Opportunity Sync"
description: "When a qualified lead arrives in HubSpot, retrieves the contact details, creates a Salesforce opportunity, and notifies the business development team via Microsoft Teams."
tags:
- business-development
- hubspot
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: lead-management
port: 8080
tools:
- name: sync-lead-to-opportunity
description: "Pull a HubSpot contact, create a Salesforce opportunity, and notify BD via Teams."
inputParameters:
- name: contact_id
in: body
type: string
description: "The HubSpot contact ID."
- name: deal_amount
in: body
type: number
description: "The estimated deal amount."
- name: bd_channel_id
in: body
type: string
description: "The Teams channel ID for business development."
steps:
- name: get-contact
type: call
call: "hubspot.get-contact"
with:
contact_id: "{{contact_id}}"
- name: create-opportunity
type: call
call: "salesforce.create-opportunity"
with:
name: "{{get-contact.company}} - Infrastructure Project"
amount: "{{deal_amount}}"
stage: "Prospecting"
contact_name: "{{get-contact.firstname}} {{get-contact.lastname}}"
- name: notify-bd
type: call
call: "msteams.post-channel-message"
with:
channel_id: "{{bd_channel_id}}"
text: "New opportunity from HubSpot lead: {{get-contact.company}} (${{deal_amount}}). Contact: {{get-contact.firstname}} {{get-contact.lastname}}. Salesforce: {{create-opportunity.url}}"
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/{{contact_id}}"
inputParameters:
- name: contact_id
in: path
operations:
- name: get-contact
method: GET
- type: http
namespace: salesforce
baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity"
operations:
- name: create-opportunity
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
Collects inspection data, assesses condition ratings in Snowflake, prioritizes maintenance in Jira, updates asset registry, and notifies ops.
naftiko: "0.5"
info:
label: "Infrastructure Asset Condition Pipeline"
description: "Collects inspection data, assesses condition ratings in Snowflake, prioritizes maintenance in Jira, updates asset registry, and notifies ops."
tags:
- asset-management
- snowflake
- jira
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: asset-management
port: 8080
tools:
- name: infrastructure_asset_condition_pipeline
description: "Orchestrate infrastructure asset condition pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-snowflake
type: call
call: "snowflake.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-jira
type: call
call: "jira.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Triggers a Terraform deployment through Azure DevOps, monitors the pipeline run, logs the result in ServiceNow as a change record, and notifies the DevOps team in Slack.
naftiko: "0.5"
info:
label: "Infrastructure Terraform Deployment Pipeline"
description: "Triggers a Terraform deployment through Azure DevOps, monitors the pipeline run, logs the result in ServiceNow as a change record, and notifies the DevOps team in Slack."
tags:
- infrastructure
- azure-devops
- servicenow
- slack
- terraform
capability:
exposes:
- type: mcp
namespace: infra-deployment
port: 8080
tools:
- name: deploy-infrastructure
description: "Trigger a Terraform deployment via Azure DevOps, log the change in ServiceNow, and notify the team."
inputParameters:
- name: pipeline_id
in: body
type: string
description: "The Azure DevOps pipeline definition ID."
- name: environment
in: body
type: string
description: "Target environment (dev, staging, production)."
- name: change_description
in: body
type: string
description: "Description of the infrastructure change."
steps:
- name: trigger-pipeline
type: call
call: "azuredevops.queue-build"
with:
definition_id: "{{pipeline_id}}"
parameters: "{\"environment\": \"{{environment}}\"}"
- name: create-change-record
type: call
call: "servicenow.create-change"
with:
short_description: "Terraform deployment: {{change_description}}"
category: "infrastructure"
environment: "{{environment}}"
build_id: "{{trigger-pipeline.build_id}}"
- name: notify-devops
type: call
call: "slack.send-message"
with:
channel: "infra-deployments"
text: "Terraform deployment triggered for {{environment}}. Build: {{trigger-pipeline.build_number}}. Change: {{create-change-record.number}}. Description: {{change_description}}"
consumes:
- type: http
namespace: azuredevops
baseUri: "https://dev.azure.com/aecom"
authentication:
type: basic
username: "$secrets.azdo_user"
password: "$secrets.azdo_pat"
resources:
- name: builds
path: "/infrastructure/_apis/build/builds?api-version=7.0"
operations:
- name: queue-build
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: send-message
method: POST
Looks up a Jira issue by key and returns its current status, assignee, priority, and linked epic for engineering task tracking.
naftiko: "0.5"
info:
label: "Jira Engineering Issue Status"
description: "Looks up a Jira issue by key and returns its current status, assignee, priority, and linked epic for engineering task tracking."
tags:
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: issue-tracking
port: 8080
tools:
- name: get-issue-status
description: "Retrieve a Jira issue by key and return its status, assignee, priority, and epic link."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g. INFRA-1234)."
call: "jira.get-issue"
with:
issue_key: "{{issue_key}}"
outputParameters:
- 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://aecom.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
Retrieves Jira issue status for AECOM engineering teams.
naftiko: "0.5"
info:
label: "Jira Issue Status"
description: "Retrieves Jira issue status for AECOM engineering teams."
tags:
- devops
- jira
- project-management
capability:
exposes:
- type: mcp
namespace: engineering
port: 8080
tools:
- name: get-issue
description: "Look up Jira issue at AECOM."
inputParameters:
- name: issue_key
in: body
type: string
description: "The issue_key to look up."
call: "jira.get-issue_key"
with:
issue_key: "{{issue_key}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira_issue_status
method: GET
Consolidates JV financial data from Oracle, allocates costs in Snowflake, generates partner reports in Power BI, and notifies JV management.
naftiko: "0.5"
info:
label: "Joint Venture Reporting Pipeline"
description: "Consolidates JV financial data from Oracle, allocates costs in Snowflake, generates partner reports in Power BI, and notifies JV management."
tags:
- finance
- oracle
- snowflake
- powerbi
- slack
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: joint_venture_reporting_pipeline
description: "Orchestrate joint venture reporting pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-servicenow
type: call
call: "servicenow.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
Creates purchase requisitions in SAP, tracks approvals, monitors delivery in Oracle, updates project schedule, and notifies procurement.
naftiko: "0.5"
info:
label: "Material Procurement Pipeline"
description: "Creates purchase requisitions in SAP, tracks approvals, monitors delivery in Oracle, updates project schedule, and notifies procurement."
tags:
- procurement
- sap
- oracle
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: material_procurement_pipeline
description: "Orchestrate material procurement pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-sap
type: call
call: "sap.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-oracle
type: call
call: "oracle.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Retrieves MATLAB simulation output from Amazon S3, creates a summary page in Confluence, uploads the raw data to SharePoint, and notifies the engineering team via Slack.
naftiko: "0.5"
info:
label: "MATLAB Simulation Results Publisher"
description: "Retrieves MATLAB simulation output from Amazon S3, creates a summary page in Confluence, uploads the raw data to SharePoint, and notifies the engineering team via Slack."
tags:
- engineering
- matlab
- amazon-s3
- confluence
- sharepoint
- slack
capability:
exposes:
- type: mcp
namespace: simulation-publishing
port: 8080
tools:
- name: publish-simulation-results
description: "Retrieve MATLAB results from S3, create a Confluence summary, archive to SharePoint, and notify the team."
inputParameters:
- name: s3_bucket
in: body
type: string
description: "The S3 bucket name."
- name: s3_key
in: body
type: string
description: "The S3 object key for the results file."
- name: project_code
in: body
type: string
description: "The AECOM project code."
steps:
- name: get-results
type: call
call: "s3.get-object"
with:
bucket: "{{s3_bucket}}"
key: "{{s3_key}}"
- name: create-summary
type: call
call: "confluence.create-page"
with:
space_key: "ENGR"
title: "Simulation Results: {{project_code}} - {{s3_key}}"
body: "MATLAB simulation completed. File: {{s3_key}}. Size: {{get-results.content_length}}. Last modified: {{get-results.last_modified}}."
- name: archive-to-sharepoint
type: call
call: "sharepoint.upload-file"
with:
site_id: "engineering_archive"
folder_path: "Simulations/{{project_code}}"
file_name: "{{s3_key}}"
- name: notify-team
type: call
call: "slack.send-message"
with:
channel: "engineering-simulations"
text: "MATLAB simulation results published for {{project_code}}. Confluence: {{create-summary.url}}. Archive: {{archive-to-sharepoint.url}}"
consumes:
- type: http
namespace: s3
baseUri: "https://s3.amazonaws.com"
authentication:
type: aws-sigv4
accessKeyId: "$secrets.aws_access_key"
secretAccessKey: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: get-object
method: GET
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
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}}/{{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: send-message
method: POST
Generates a project cost report by pulling data from Oracle EBS, writing to a Google Sheets workbook, exporting as Excel, uploading to SharePoint, and emailing via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Microsoft Excel Cost Report Generator"
description: "Generates a project cost report by pulling data from Oracle EBS, writing to a Google Sheets workbook, exporting as Excel, uploading to SharePoint, and emailing via Microsoft Outlook."
tags:
- finance
- oracle-e-business-suite
- google-sheets
- sharepoint
- microsoft-outlook
- microsoft-excel
- reporting
capability:
exposes:
- type: mcp
namespace: cost-reporting
port: 8080
tools:
- name: generate-cost-report
description: "Pull cost data from Oracle EBS, write to Google Sheets, upload to SharePoint, and email the report."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: spreadsheet_id
in: body
type: string
description: "The Google Sheets spreadsheet ID for the template."
- name: recipient_email
in: body
type: string
description: "The email address to send the report to."
steps:
- name: get-costs
type: call
call: "oracle-ebs.get-project-costs"
with:
project_number: "{{project_number}}"
- name: update-sheet
type: call
call: "googlesheets.update-cells"
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "CostReport!A2:E2"
values: "[[\"{{project_number}}\", \"{{get-costs.budget_amount}}\", \"{{get-costs.actual_costs}}\", \"{{get-costs.committed_costs}}\", \"{{get-costs.variance_percent}}\"]]"
- name: upload-report
type: call
call: "sharepoint.upload-file"
with:
site_id: "finance_reports"
folder_path: "CostReports/{{project_number}}"
file_name: "cost_report_{{project_number}}.xlsx"
- name: send-report
type: call
call: "outlook.send-mail"
with:
to: "{{recipient_email}}"
subject: "Cost Report: Project {{project_number}}"
body: "Budget: ${{get-costs.budget_amount}}. Actuals: ${{get-costs.actual_costs}}. Variance: {{get-costs.variance_percent}}%. Report: {{upload-report.url}}"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
- type: http
namespace: googlesheets
baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/{{spreadsheet_id}}/values/{{range}}"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: update-cells
method: PUT
- 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}}/{{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
Synchronizes a Microsoft Planner task to Jira by reading the Planner task details, creating a corresponding Jira issue, and posting a link back to the Planner task via Microsoft Teams.
naftiko: "0.5"
info:
label: "Microsoft Planner Task Sync to Jira"
description: "Synchronizes a Microsoft Planner task to Jira by reading the Planner task details, creating a corresponding Jira issue, and posting a link back to the Planner task via Microsoft Teams."
tags:
- project-management
- microsoft-planner
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: task-sync
port: 8080
tools:
- name: sync-planner-to-jira
description: "Read a Planner task, create a Jira issue, and post the cross-reference link to Teams."
inputParameters:
- name: planner_task_id
in: body
type: string
description: "The Microsoft Planner task identifier."
- name: jira_project_key
in: body
type: string
description: "The target Jira project key."
- name: notify_email
in: body
type: string
description: "The email to notify via Teams."
steps:
- name: get-planner-task
type: call
call: "planner.get-task"
with:
task_id: "{{planner_task_id}}"
- name: create-jira-issue
type: call
call: "jira.create-issue"
with:
project_key: "{{jira_project_key}}"
summary: "{{get-planner-task.title}}"
description: "Synced from Planner. Due: {{get-planner-task.due_date}}. Assigned: {{get-planner-task.assignee}}."
issue_type: "Task"
- name: notify-user
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{notify_email}}"
text: "Planner task '{{get-planner-task.title}}' synced to Jira as {{create-jira-issue.key}}."
consumes:
- type: http
namespace: planner
baseUri: "https://graph.microsoft.com/v1.0/planner"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "/tasks/{{task_id}}"
inputParameters:
- name: task_id
in: path
operations:
- name: get-task
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.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
Syncs project milestone data from Microsoft Project into a Notion database page, keeping the project wiki current for stakeholder access.
naftiko: "0.5"
info:
label: "Notion Project Wiki Sync"
description: "Syncs project milestone data from Microsoft Project into a Notion database page, keeping the project wiki current for stakeholder access."
tags:
- project-management
- notion
- microsoft-project
capability:
exposes:
- type: mcp
namespace: wiki-sync
port: 8080
tools:
- name: sync-milestones-to-notion
description: "Pull milestones from Microsoft Project and update a Notion database page."
inputParameters:
- name: project_id
in: body
type: string
description: "The Microsoft Project GUID."
- name: notion_database_id
in: body
type: string
description: "The Notion database identifier."
steps:
- name: get-milestones
type: call
call: "msproject.get-tasks"
with:
project_id: "{{project_id}}"
filter: "milestone"
- name: update-notion
type: call
call: "notion.create-page"
with:
database_id: "{{notion_database_id}}"
title: "Project Milestones Update"
properties: "{\"Next Milestone\": \"{{get-milestones.next_milestone_name}}\", \"Due Date\": \"{{get-milestones.next_milestone_date}}\", \"Percent Complete\": \"{{get-milestones.overall_percent}}\"}"
consumes:
- type: http
namespace: msproject
baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "('{{project_id}}')/Tasks?$filter={{filter}}"
inputParameters:
- name: project_id
in: path
- name: filter
in: query
operations:
- name: get-tasks
method: GET
- type: http
namespace: notion
baseUri: "https://api.notion.com/v1"
authentication:
type: bearer
token: "$secrets.notion_token"
resources:
- name: pages
path: "/pages"
operations:
- name: create-page
method: POST
Retrieves Okta user profile for AECOM identity management.
naftiko: "0.5"
info:
label: "Okta User Profile Lookup"
description: "Retrieves Okta user profile for AECOM identity management."
tags:
- security
- okta
- identity
capability:
exposes:
- type: mcp
namespace: identity
port: 8080
tools:
- name: get-user
description: "Look up user at AECOM."
inputParameters:
- name: user_email
in: body
type: string
description: "The user_email to look up."
call: "okta.get-user_email"
with:
user_email: "{{user_email}}"
consumes:
- type: http
namespace: okta
baseUri: "https://aecom.okta.com/api/v1"
authentication:
type: apiKey
key: "$secrets.okta_api_token"
header: "Authorization"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: okta_user_profile_lookup
method: GET
Retrieves a document from SharePoint, sends the content to OpenAI for summarization, posts the summary to a Confluence page, and notifies the requestor via Slack.
naftiko: "0.5"
info:
label: "OpenAI Document Summarizer"
description: "Retrieves a document from SharePoint, sends the content to OpenAI for summarization, posts the summary to a Confluence page, and notifies the requestor via Slack."
tags:
- artificial-intelligence
- openai
- sharepoint
- confluence
- slack
capability:
exposes:
- type: mcp
namespace: ai-document-processing
port: 8080
tools:
- name: summarize-document
description: "Retrieve a document from SharePoint, summarize via OpenAI, publish to Confluence, and notify."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site identifier."
- name: file_path
in: body
type: string
description: "The path to the document."
- name: requestor_email
in: body
type: string
description: "The requestor Slack email."
steps:
- name: get-document
type: call
call: "sharepoint.get-file-content"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
- name: summarize
type: call
call: "openai.create-completion"
with:
model: "gpt-4"
prompt: "Summarize the following engineering document in 3-5 bullet points: {{get-document.content}}"
- name: publish-summary
type: call
call: "confluence.create-page"
with:
space_key: "DOCS"
title: "Summary: {{file_path}}"
body: "{{summarize.text}}"
- name: notify-requestor
type: call
call: "slack.send-message"
with:
channel: "document-summaries"
text: "Document summarized: {{file_path}}. Summary: {{publish-summary.url}}"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: file-content
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file-content
method: GET
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
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: send-message
method: POST
Retrieves project cost summary from Oracle E-Business Suite for a given project number, returning budget, actuals, and committed costs.
naftiko: "0.5"
info:
label: "Oracle EBS Project Cost Lookup"
description: "Retrieves project cost summary from Oracle E-Business Suite for a given project number, returning budget, actuals, and committed costs."
tags:
- finance
- oracle
- oracle-e-business-suite
- cost-management
capability:
exposes:
- type: mcp
namespace: project-finance
port: 8080
tools:
- name: get-project-costs
description: "Look up project cost data from Oracle EBS by project number."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle project number."
call: "oracle-ebs.get-project-costs"
with:
project_number: "{{project_number}}"
outputParameters:
- name: budget_amount
type: string
mapping: "$.BudgetAmount"
- name: actual_costs
type: string
mapping: "$.ActualCosts"
- name: committed_costs
type: string
mapping: "$.CommittedCosts"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
Retrieves PagerDuty incident details for AECOM on-call teams.
naftiko: "0.5"
info:
label: "PagerDuty Incident Details"
description: "Retrieves PagerDuty incident details for AECOM on-call teams."
tags:
- devops
- pagerduty
- on-call
capability:
exposes:
- type: mcp
namespace: incident-mgmt
port: 8080
tools:
- name: get-incident
description: "Look up incident at AECOM."
inputParameters:
- name: incident_id
in: body
type: string
description: "The incident_id to look up."
call: "pagerduty.get-incident_id"
with:
incident_id: "{{incident_id}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: pagerduty_incident_details
method: GET
Orchestrates a permit application workflow by compiling project data from Oracle EBS, generating the application document in Google Docs, uploading to SharePoint, and tracking in Jira.
naftiko: "0.5"
info:
label: "Permit Application Orchestrator"
description: "Orchestrates a permit application workflow by compiling project data from Oracle EBS, generating the application document in Google Docs, uploading to SharePoint, and tracking in Jira."
tags:
- compliance
- oracle-e-business-suite
- google-docs
- sharepoint
- jira
- permits
capability:
exposes:
- type: mcp
namespace: permit-management
port: 8080
tools:
- name: prepare-permit-application
description: "Compile project data, generate application document, upload to SharePoint, and create a Jira tracking issue."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: permit_type
in: body
type: string
description: "The type of permit (e.g., environmental, building, land-use)."
- name: site_address
in: body
type: string
description: "The project site address."
steps:
- name: get-project-data
type: call
call: "oracle-ebs.get-project"
with:
project_number: "{{project_number}}"
- name: create-application
type: call
call: "googledocs.create-document"
with:
title: "Permit Application: {{permit_type}} - {{get-project-data.project_name}}"
body: "Project: {{get-project-data.project_name}}. Address: {{site_address}}. Type: {{permit_type}}. Client: {{get-project-data.client_name}}."
- name: upload-to-sharepoint
type: call
call: "sharepoint.upload-file"
with:
site_id: "permits_site"
folder_path: "Applications/{{project_number}}"
file_name: "{{permit_type}}_application.docx"
- name: create-tracking-issue
type: call
call: "jira.create-issue"
with:
project_key: "PERMIT"
summary: "{{permit_type}} permit: {{get-project-data.project_name}}"
description: "Permit application prepared. Document: {{upload-to-sharepoint.url}}. Address: {{site_address}}."
issue_type: "Task"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: projects
path: "/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project
method: GET
- type: http
namespace: googledocs
baseUri: "https://docs.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_docs_token"
resources:
- name: documents
path: "/documents"
operations:
- name: create-document
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}}/{{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://aecom.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
Tracks permit applications and approvals, monitors deadlines in Jira, creates escalations in ServiceNow, and notifies project compliance team.
naftiko: "0.5"
info:
label: "Permit Tracking Orchestrator"
description: "Tracks permit applications and approvals, monitors deadlines in Jira, creates escalations in ServiceNow, and notifies project compliance team."
tags:
- permits
- jira
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: permits
port: 8080
tools:
- name: permit_tracking_orchestrator
description: "Orchestrate permit tracking orchestrator workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Triggers Power BI dataset refresh for AECOM reporting.
naftiko: "0.5"
info:
label: "Power BI Refresh Trigger"
description: "Triggers Power BI dataset refresh for AECOM reporting."
tags:
- analytics
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: trigger-refresh
description: "Trigger refresh at AECOM."
inputParameters:
- name: dataset_id
in: body
type: string
description: "The dataset_id to look up."
call: "powerbi.get-dataset_id"
with:
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: resources
path: "/resources/{{resource_id}}"
operations:
- name: power_bi_refresh_trigger
method: GET
Retrieves budget and actual costs from Oracle EBS, compares variances, updates a Google Sheets tracker, and alerts the project controller via Microsoft Outlook if variance exceeds threshold.
naftiko: "0.5"
info:
label: "Project Budget Variance Reporter"
description: "Retrieves budget and actual costs from Oracle EBS, compares variances, updates a Google Sheets tracker, and alerts the project controller via Microsoft Outlook if variance exceeds threshold."
tags:
- finance
- oracle-e-business-suite
- google-sheets
- microsoft-outlook
- cost-management
capability:
exposes:
- type: mcp
namespace: budget-variance
port: 8080
tools:
- name: check-budget-variance
description: "Compare budget vs actuals from Oracle EBS, update the Google Sheets tracker, and alert the controller if variance exceeds threshold."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: spreadsheet_id
in: body
type: string
description: "The Google Sheets spreadsheet ID."
- name: variance_threshold
in: body
type: number
description: "The variance percentage threshold to trigger an alert."
- name: controller_email
in: body
type: string
description: "The project controller email."
steps:
- name: get-costs
type: call
call: "oracle-ebs.get-project-costs"
with:
project_number: "{{project_number}}"
- name: update-tracker
type: call
call: "googlesheets.update-cells"
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "Budget!A2:D2"
values: "[[\"{{project_number}}\", \"{{get-costs.budget_amount}}\", \"{{get-costs.actual_costs}}\", \"{{get-costs.variance_percent}}\"]]"
- name: send-alert
type: call
call: "outlook.send-mail"
with:
to: "{{controller_email}}"
subject: "Budget Variance Alert: Project {{project_number}}"
body: "Project {{project_number}} has a budget variance of {{get-costs.variance_percent}}%. Budget: ${{get-costs.budget_amount}}. Actuals: ${{get-costs.actual_costs}}. Committed: ${{get-costs.committed_costs}}."
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
- type: http
namespace: googlesheets
baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/{{spreadsheet_id}}/values/{{range}}"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: update-cells
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
Validates closeout requirements in Jira, confirms financial settlement in Oracle, archives documents, logs in ServiceNow, and notifies team.
naftiko: "0.5"
info:
label: "Project Closeout Checklist Pipeline"
description: "Validates closeout requirements in Jira, confirms financial settlement in Oracle, archives documents, logs in ServiceNow, and notifies team."
tags:
- closeout
- jira
- oracle
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: closeout
port: 8080
tools:
- name: project_closeout_checklist_pipeline
description: "Orchestrate project closeout checklist pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-oracle
type: call
call: "oracle.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Orchestrates project closeout by archiving project documents in Box, closing the Oracle EBS project, updating the Salesforce opportunity to Closed Won, notifying stakeholders via Microsoft Teams, and creating a Confluence lessons-learned page.
naftiko: "0.5"
info:
label: "Project Closeout Orchestrator"
description: "Orchestrates project closeout by archiving project documents in Box, closing the Oracle EBS project, updating the Salesforce opportunity to Closed Won, notifying stakeholders via Microsoft Teams, and creating a Confluence lessons-learned page."
tags:
- project-management
- box
- oracle-e-business-suite
- salesforce
- microsoft-teams
- confluence
- project-closeout
capability:
exposes:
- type: mcp
namespace: project-closeout
port: 8080
tools:
- name: close-project
description: "Execute the project closeout workflow across document archival, financial close, CRM update, notification, and knowledge capture."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID."
- name: box_folder_id
in: body
type: string
description: "The Box folder ID for archival."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel for notification."
steps:
- name: archive-docs
type: call
call: "box.lock-folder"
with:
folder_id: "{{box_folder_id}}"
lock_type: "archive"
- name: close-oracle-project
type: call
call: "oracle-ebs.close-project"
with:
project_number: "{{project_number}}"
- name: update-salesforce
type: call
call: "salesforce.update-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
stage: "Closed Won"
- name: create-lessons-page
type: call
call: "confluence.create-page"
with:
space_key: "PM"
title: "Lessons Learned: Project {{project_number}}"
body: "Project {{project_number}} closed on {{close-oracle-project.close_date}}. Final cost: ${{close-oracle-project.final_cost}}. Template for team retrospective."
- name: notify-stakeholders
type: call
call: "msteams.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
text: "Project {{project_number}} closed. Documents archived. Lessons learned: {{create-lessons-page.url}}"
consumes:
- 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}}"
inputParameters:
- name: folder_id
in: path
operations:
- name: lock-folder
method: PUT
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: projects
path: "/{{project_number}}/close"
inputParameters:
- name: project_number
in: path
operations:
- name: close-project
method: POST
- type: http
namespace: salesforce
baseUri: "https://aecom.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: update-opportunity
method: PATCH
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
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 updates from Jira, ServiceNow, and Confluence, generates weekly digest in Power BI, and distributes to project stakeholders.
naftiko: "0.5"
info:
label: "Project Communication Digest"
description: "Aggregates updates from Jira, ServiceNow, and Confluence, generates weekly digest in Power BI, and distributes to project stakeholders."
tags:
- communications
- jira
- servicenow
- confluence
- powerbi
capability:
exposes:
- type: mcp
namespace: communications
port: 8080
tools:
- name: project_communication_digest
description: "Orchestrate project communication digest workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-confluence
type: call
call: "confluence.create-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
Monitors project costs in Oracle EBS, detects overruns in Snowflake, creates alerts in Jira, updates Power BI dashboards, and notifies project managers.
naftiko: "0.5"
info:
label: "Project Cost Overrun Detector"
description: "Monitors project costs in Oracle EBS, detects overruns in Snowflake, creates alerts in Jira, updates Power BI dashboards, and notifies project managers."
tags:
- project-management
- oracle
- snowflake
- jira
- powerbi
capability:
exposes:
- type: mcp
namespace: project-management
port: 8080
tools:
- name: project_cost_overrun_detector
description: "Orchestrate project cost overrun detector workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-jira
type: call
call: "jira.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-servicenow
type: call
call: "servicenow.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
Manages document revisions in SharePoint, tracks review status in Jira, ensures compliance, logs transmittals in ServiceNow, and notifies teams.
naftiko: "0.5"
info:
label: "Project Document Control Pipeline"
description: "Manages document revisions in SharePoint, tracks review status in Jira, ensures compliance, logs transmittals in ServiceNow, and notifies teams."
tags:
- document-control
- jira
- servicenow
- confluence
- slack
capability:
exposes:
- type: mcp
namespace: document-control
port: 8080
tools:
- name: project_document_control_pipeline
description: "Orchestrate project document control pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-confluence
type: call
call: "confluence.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: confluence-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Calculates earned value metrics from Oracle project actuals, compares against baseline, generates EVM reports in Power BI, and notifies project controls.
naftiko: "0.5"
info:
label: "Project Earned Value Analysis"
description: "Calculates earned value metrics from Oracle project actuals, compares against baseline, generates EVM reports in Power BI, and notifies project controls."
tags:
- project-controls
- earned-value
- oracle
- power-bi
capability:
exposes:
- type: mcp
namespace: project-controls
port: 8080
tools:
- name: project_earned_value_analysis
description: "Orchestrate project earned value analysis workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: fetch-data
type: call
call: "primary.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-data
type: call
call: "processor.transform"
with:
input: "{{fetch-data.result}}"
- name: create-record
type: call
call: "servicenow.create-record"
with:
table: "records"
data: "{{process-data.output}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel: "operations"
text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://co.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/records"
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: messages
path: "/teams/{{channel}}/channels/general/messages"
operations:
- name: send-message
method: POST
Extracts actuals from Oracle, runs forecast models in Snowflake, updates Power BI projections, creates variance alerts, and notifies finance.
naftiko: "0.5"
info:
label: "Project Financial Forecasting Pipeline"
description: "Extracts actuals from Oracle, runs forecast models in Snowflake, updates Power BI projections, creates variance alerts, and notifies finance."
tags:
- finance
- oracle
- snowflake
- powerbi
- slack
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: project_financial_forecasting_pipeline
description: "Orchestrate project financial forecasting pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-servicenow
type: call
call: "servicenow.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
Analyzes resource needs from Jira, checks availability in Workday, creates staffing requests, updates project plans, and notifies managers.
naftiko: "0.5"
info:
label: "Project Resource Planning Pipeline"
description: "Analyzes resource needs from Jira, checks availability in Workday, creates staffing requests, updates project plans, and notifies managers."
tags:
- resource-planning
- jira
- workday
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: resource-planning
port: 8080
tools:
- name: project_resource_planning_pipeline
description: "Orchestrate project resource planning pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-workday
type: call
call: "workday.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/aecom"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: workday-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Collects risks from Jira, scores in Snowflake, updates risk matrix in Power BI, creates mitigation tasks, and notifies project leadership.
naftiko: "0.5"
info:
label: "Project Risk Register Pipeline"
description: "Collects risks from Jira, scores in Snowflake, updates risk matrix in Power BI, creates mitigation tasks, and notifies project leadership."
tags:
- risk
- jira
- snowflake
- powerbi
- slack
capability:
exposes:
- type: mcp
namespace: risk
port: 8080
tools:
- name: project_risk_register_pipeline
description: "Orchestrate project risk register pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-snowflake
type: call
call: "snowflake.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-servicenow
type: call
call: "servicenow.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
Retrieves the current schedule status of an infrastructure project from Microsoft Project, returning milestone dates, percent complete, and critical path items.
naftiko: "0.5"
info:
label: "Project Schedule Status Lookup"
description: "Retrieves the current schedule status of an infrastructure project from Microsoft Project, returning milestone dates, percent complete, and critical path items."
tags:
- project-management
- microsoft-project
capability:
exposes:
- type: mcp
namespace: project-scheduling
port: 8080
tools:
- name: get-project-schedule
description: "Look up a Microsoft Project schedule by project ID and return milestone summary, percent complete, and next critical milestone."
inputParameters:
- name: project_id
in: body
type: string
description: "The Microsoft Project Online project GUID."
call: "msproject.get-project"
with:
project_id: "{{project_id}}"
outputParameters:
- name: project_name
type: string
mapping: "$.d.ProjectName"
- name: percent_complete
type: string
mapping: "$.d.PercentComplete"
- name: finish_date
type: string
mapping: "$.d.FinishDate"
consumes:
- type: http
namespace: msproject
baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: projects
path: "('{{project_id}}')"
inputParameters:
- name: project_id
in: path
operations:
- name: get-project
method: GET
When a project needs additional staff, retrieves project details from Oracle EBS, searches Workday for available engineers, creates an Asana task for HR coordination, and notifies the resource manager via Slack.
naftiko: "0.5"
info:
label: "Project Staffing Request Pipeline"
description: "When a project needs additional staff, retrieves project details from Oracle EBS, searches Workday for available engineers, creates an Asana task for HR coordination, and notifies the resource manager via Slack."
tags:
- hr
- workday
- oracle-e-business-suite
- asana
- slack
- resource-management
capability:
exposes:
- type: mcp
namespace: resource-staffing
port: 8080
tools:
- name: request-project-staff
description: "Orchestrate a staffing request by pulling project data, searching for available engineers in Workday, creating an HR task, and notifying the resource manager."
inputParameters:
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: role_title
in: body
type: string
description: "The required role title (e.g., Senior Structural Engineer)."
- name: resource_manager_email
in: body
type: string
description: "The Slack email of the resource manager."
steps:
- name: get-project
type: call
call: "oracle-ebs.get-project"
with:
project_number: "{{project_number}}"
- name: search-engineers
type: call
call: "workday.search-workers"
with:
job_title: "{{role_title}}"
availability: "true"
- name: create-hr-task
type: call
call: "asana.create-task"
with:
project_gid: "staffing_requests"
name: "Staff request: {{role_title}} for {{get-project.project_name}}"
notes: "Project: {{get-project.project_name}} ({{project_number}}). Role: {{role_title}}. Available candidates: {{search-engineers.count}}."
- name: notify-manager
type: call
call: "slack.send-message"
with:
channel: "resource-management"
text: "Staffing request for {{role_title}} on {{get-project.project_name}}. {{search-engineers.count}} candidates available. Asana task: {{create-hr-task.url}}"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: projects
path: "/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers?jobTitle={{job_title}}&available={{availability}}"
inputParameters:
- name: job_title
in: query
- name: availability
in: query
operations:
- name: search-workers
method: GET
- type: http
namespace: asana
baseUri: "https://app.asana.com/api/1.0"
authentication:
type: bearer
token: "$secrets.asana_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
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: send-message
method: POST
Generates a project proposal by pulling opportunity data from Salesforce, retrieving past project references from Confluence, creating a draft in Google Docs, and notifying the proposal lead via Slack.
naftiko: "0.5"
info:
label: "Proposal Generation Workflow"
description: "Generates a project proposal by pulling opportunity data from Salesforce, retrieving past project references from Confluence, creating a draft in Google Docs, and notifying the proposal lead via Slack."
tags:
- business-development
- salesforce
- confluence
- google-docs
- slack
- proposal
capability:
exposes:
- type: mcp
namespace: proposal-management
port: 8080
tools:
- name: generate-proposal
description: "Orchestrate proposal generation by pulling CRM data, past project references, creating a draft document, and notifying the proposal lead."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID."
- name: reference_space_key
in: body
type: string
description: "The Confluence space key containing project references."
- name: proposal_lead_email
in: body
type: string
description: "The proposal lead email for Slack notification."
steps:
- name: get-opportunity
type: call
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: search-references
type: call
call: "confluence.search-content"
with:
space_key: "{{reference_space_key}}"
query: "{{get-opportunity.account_name}} {{get-opportunity.project_type}}"
- name: create-draft
type: call
call: "googledocs.create-document"
with:
title: "Proposal: {{get-opportunity.name}}"
body: "Client: {{get-opportunity.account_name}}. Value: ${{get-opportunity.amount}}. Scope: {{get-opportunity.description}}. References: {{search-references.results_summary}}."
- name: notify-lead
type: call
call: "slack.send-message"
with:
channel: "proposals"
text: "Proposal draft created for {{get-opportunity.name}} (${{get-opportunity.amount}}). Doc: {{create-draft.url}}. {{search-references.total_results}} reference projects found."
consumes:
- type: http
namespace: salesforce
baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: search
path: "/search?cql=space={{space_key}}+and+text~\"{{query}}\""
inputParameters:
- name: space_key
in: query
- name: query
in: query
operations:
- name: search-content
method: GET
- type: http
namespace: googledocs
baseUri: "https://docs.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_docs_token"
resources:
- name: documents
path: "/documents"
operations:
- name: create-document
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: send-message
method: POST
Schedules inspections from Jira, collects results, validates against specifications, creates NCRs in ServiceNow, and notifies quality team.
naftiko: "0.5"
info:
label: "Quality Inspection Orchestrator"
description: "Schedules inspections from Jira, collects results, validates against specifications, creates NCRs in ServiceNow, and notifies quality team."
tags:
- quality
- jira
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: quality
port: 8080
tools:
- name: quality_inspection_orchestrator
description: "Orchestrate quality inspection orchestrator workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
When a construction quality inspection is completed in the field, creates a ServiceNow record, updates the Jira quality tracking board, uploads inspection photos to Box, and notifies the QA manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Quality Inspection Workflow"
description: "When a construction quality inspection is completed in the field, creates a ServiceNow record, updates the Jira quality tracking board, uploads inspection photos to Box, and notifies the QA manager via Microsoft Teams."
tags:
- construction
- quality-assurance
- servicenow
- jira
- box
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: quality-management
port: 8080
tools:
- name: process-quality-inspection
description: "Record a quality inspection in ServiceNow, update Jira tracking, upload photos, and notify the QA manager."
inputParameters:
- name: inspection_type
in: body
type: string
description: "The type of inspection (e.g., concrete, structural, electrical)."
- name: result
in: body
type: string
description: "Inspection result (pass, fail, conditional)."
- name: project_number
in: body
type: string
description: "The project number."
- name: qa_manager_email
in: body
type: string
description: "The QA manager email."
steps:
- name: create-snow-record
type: call
call: "servicenow.create-record"
with:
table: "quality_inspection"
inspection_type: "{{inspection_type}}"
result: "{{result}}"
project: "{{project_number}}"
- name: update-jira
type: call
call: "jira.create-issue"
with:
project_key: "QA"
summary: "Inspection: {{inspection_type}} - {{result}}"
description: "Project: {{project_number}}. Result: {{result}}. ServiceNow: {{create-snow-record.number}}."
issue_type: "Task"
- name: create-photo-folder
type: call
call: "box.create-folder"
with:
parent_id: "inspection_photos"
name: "{{create-snow-record.number}}_{{inspection_type}}"
- name: notify-qa
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{qa_manager_email}}"
text: "Quality inspection [{{result}}]: {{inspection_type}} on project {{project_number}}. ServiceNow: {{create-snow-record.number}}. Jira: {{update-jira.key}}. Photos: {{create-photo-folder.url}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://aecom.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: jira
baseUri: "https://aecom.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: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: folders
path: "/folders"
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
Tracks regulatory submittals in Jira, monitors deadlines, creates escalations, logs status in ServiceNow, and notifies regulatory team.
naftiko: "0.5"
info:
label: "Regulatory Submittal Tracking Pipeline"
description: "Tracks regulatory submittals in Jira, monitors deadlines, creates escalations, logs status in ServiceNow, and notifies regulatory team."
tags:
- regulatory
- jira
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: regulatory
port: 8080
tools:
- name: regulatory_submittal_tracking_pipeline
description: "Orchestrate regulatory submittal tracking pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-jira
type: call
call: "jira.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: jira-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
When a safety incident is reported on site, creates a ServiceNow incident, logs the event in Oracle EBS, uploads documentation to SharePoint, and notifies the safety officer and project manager via Slack.
naftiko: "0.5"
info:
label: "Safety Incident Reporting Pipeline"
description: "When a safety incident is reported on site, creates a ServiceNow incident, logs the event in Oracle EBS, uploads documentation to SharePoint, and notifies the safety officer and project manager via Slack."
tags:
- safety
- servicenow
- oracle-e-business-suite
- sharepoint
- slack
- construction
capability:
exposes:
- type: mcp
namespace: safety-management
port: 8080
tools:
- name: report-safety-incident
description: "Process a safety incident by creating a ServiceNow ticket, logging in Oracle, uploading docs, and notifying key personnel."
inputParameters:
- name: incident_description
in: body
type: string
description: "Description of the safety incident."
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: severity
in: body
type: string
description: "Incident severity (critical, high, medium, low)."
- name: safety_officer_email
in: body
type: string
description: "The Slack email of the safety officer."
steps:
- name: create-snow-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Safety Incident: {{incident_description}}"
category: "safety"
priority: "{{severity}}"
assigned_group: "EHS_Safety"
- name: log-oracle-event
type: call
call: "oracle-ebs.create-safety-event"
with:
project_number: "{{project_number}}"
description: "{{incident_description}}"
severity: "{{severity}}"
- name: create-doc-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "safety_records"
folder_path: "Incidents/{{create-snow-incident.number}}"
- name: notify-safety-team
type: call
call: "slack.send-message"
with:
channel: "safety-alerts"
text: "SAFETY INCIDENT [{{severity}}]: {{incident_description}}. Project: {{project_number}}. ServiceNow: {{create-snow-incident.number}}. Docs: {{create-doc-folder.url}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://aecom.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: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: safety-events
path: "/safety-events"
operations:
- name: create-safety-event
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: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: send-message
method: POST
Monitors training completion from Workday, checks certifications, creates escalation tasks in ServiceNow, and notifies safety management.
naftiko: "0.5"
info:
label: "Safety Training Compliance Tracker"
description: "Monitors training completion from Workday, checks certifications, creates escalation tasks in ServiceNow, and notifies safety management."
tags:
- safety
- workday
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: safety
port: 8080
tools:
- name: safety_training_compliance_tracker
description: "Orchestrate safety training compliance tracker workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-workday
type: call
call: "workday.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/aecom"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: workday-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Retrieves Salesforce account details for AECOM sales teams.
naftiko: "0.5"
info:
label: "Salesforce Account Info"
description: "Retrieves Salesforce account details for AECOM sales teams."
tags:
- crm
- salesforce
- accounts
capability:
exposes:
- type: mcp
namespace: crm
port: 8080
tools:
- name: get-account
description: "Look up account at AECOM."
inputParameters:
- name: account_id
in: body
type: string
description: "The account_id to look up."
call: "salesforce.get-account_id"
with:
account_id: "{{account_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://aecom.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: salesforce_account_info
method: GET
Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for business development tracking of infrastructure projects.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Lookup"
description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name for business development tracking of infrastructure projects."
tags:
- business-development
- salesforce
capability:
exposes:
- type: mcp
namespace: crm
port: 8080
tools:
- name: get-opportunity
description: "Retrieve a Salesforce opportunity by ID for project pursuit tracking."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity record 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://aecom.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
Looks up a SAP Concur expense report by report ID and returns the approval status, total amount, and submission date for project travel expense tracking.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Status"
description: "Looks up a SAP Concur expense report by report ID and returns the approval status, total amount, and submission date for project travel expense tracking."
tags:
- finance
- sap-concur
- expense-management
capability:
exposes:
- type: mcp
namespace: expense-management
port: 8080
tools:
- name: get-expense-report
description: "Retrieve the status of a SAP Concur expense report by report ID."
inputParameters:
- name: report_id
in: body
type: string
description: "The Concur expense report identifier."
call: "concur.get-expense-report"
with:
report_id: "{{report_id}}"
outputParameters:
- name: approval_status
type: string
mapping: "$.ApprovalStatusName"
- name: total_amount
type: string
mapping: "$.Total"
- name: submit_date
type: string
mapping: "$.SubmitDate"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0/expense"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
When a SAP purchase order is created for construction materials, retrieves the PO details, looks up the approver in Workday, and sends an approval request via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Purchase Order Approval Pipeline"
description: "When a SAP purchase order is created for construction materials, retrieves the PO details, looks up the approver in Workday, and sends an approval request via Microsoft Teams."
tags:
- procurement
- sap
- workday
- microsoft-teams
- construction
capability:
exposes:
- type: mcp
namespace: procurement-approval
port: 8080
tools:
- name: route-po-approval
description: "Retrieve a SAP PO, resolve the approver from Workday, and send an approval notification via Teams."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number."
- name: requestor_id
in: body
type: string
description: "The Workday worker ID of the requestor."
steps:
- name: get-po
type: call
call: "sap.get-po"
with:
po_number: "{{po_number}}"
- name: get-requestor
type: call
call: "workday.get-worker"
with:
worker_id: "{{requestor_id}}"
- name: get-approver
type: call
call: "workday.get-worker"
with:
worker_id: "{{get-requestor.manager_id}}"
- name: send-approval-request
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-approver.work_email}}"
text: "PO Approval Required: PO {{po_number}} for ${{get-po.total_value}} from vendor {{get-po.vendor}}. Requested by {{get-requestor.full_name}}."
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: 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: 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 the details of a ServiceNow incident by number, returning current state, priority, assigned group, and short description for infrastructure IT support.
naftiko: "0.5"
info:
label: "ServiceNow Incident Lookup"
description: "Retrieves the details of a ServiceNow incident by number, returning current state, priority, assigned group, and short description for infrastructure IT support."
tags:
- it-support
- servicenow
capability:
exposes:
- type: mcp
namespace: it-service-management
port: 8080
tools:
- name: get-incident
description: "Look up a ServiceNow incident by number and return its details."
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"
consumes:
- type: http
namespace: servicenow
baseUri: "https://aecom.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: path
operations:
- name: get-incident
method: GET
Checks ServiceNow incident status for AECOM IT operations.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Check"
description: "Checks ServiceNow incident status for AECOM IT operations."
tags:
- itsm
- servicenow
- incident-management
capability:
exposes:
- type: mcp
namespace: itsm
port: 8080
tools:
- name: get-incident
description: "Look up incident at AECOM."
inputParameters:
- name: incident_id
in: body
type: string
description: "The incident_id to look up."
call: "servicenow.get-incident_id"
with:
incident_id: "{{incident_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow_incident_status_che
method: GET
Retrieves a document from a SharePoint project library by site and file path, returning the download URL, last modified date, and author.
naftiko: "0.5"
info:
label: "SharePoint Document Retrieval"
description: "Retrieves a document from a SharePoint project library by site and file path, returning the download URL, last modified date, and author."
tags:
- document-management
- sharepoint
capability:
exposes:
- type: mcp
namespace: document-management
port: 8080
tools:
- name: get-document
description: "Retrieve a document from SharePoint by site ID and file path."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site identifier."
- name: file_path
in: body
type: string
description: "The relative path to the file within the document library."
call: "sharepoint.get-file"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
outputParameters:
- 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
Plans site mobilization resources in Oracle, provisions equipment in SAP, creates logistics tasks in ServiceNow, and notifies project team.
naftiko: "0.5"
info:
label: "Site Mobilization Orchestrator"
description: "Plans site mobilization resources in Oracle, provisions equipment in SAP, creates logistics tasks in ServiceNow, and notifies project team."
tags:
- construction
- oracle
- sap
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: construction
port: 8080
tools:
- name: site_mobilization_orchestrator
description: "Orchestrate site mobilization orchestrator workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-oracle
type: call
call: "oracle.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-sap
type: call
call: "sap.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-servicenow
type: call
call: "servicenow.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://aecom.oraclecloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: oracle-op
method: POST
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Sends a message to a Slack channel for AECOM notifications.
naftiko: "0.5"
info:
label: "Slack Channel Post"
description: "Sends a message to a Slack channel for AECOM notifications."
tags:
- collaboration
- slack
- messaging
capability:
exposes:
- type: mcp
namespace: messaging
port: 8080
tools:
- name: send-message
description: "Post to Slack at AECOM."
inputParameters:
- name: channel
in: body
type: string
description: "The channel to look up."
call: "slack.get-channel"
with:
channel: "{{channel}}"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack_channel_post
method: GET
Creates a new Slack channel for a project, invites key team members retrieved from Workday, and posts an initial message with project links from SharePoint and Jira.
naftiko: "0.5"
info:
label: "Slack Project Channel Setup"
description: "Creates a new Slack channel for a project, invites key team members retrieved from Workday, and posts an initial message with project links from SharePoint and Jira."
tags:
- collaboration
- slack
- workday
- sharepoint
- jira
capability:
exposes:
- type: mcp
namespace: project-collaboration
port: 8080
tools:
- name: setup-project-channel
description: "Create a Slack project channel, invite team members from Workday, and post initial project links."
inputParameters:
- name: project_name
in: body
type: string
description: "The project name for the channel."
- name: project_lead_id
in: body
type: string
description: "The Workday worker ID of the project lead."
- name: sharepoint_url
in: body
type: string
description: "The SharePoint project site URL."
- name: jira_project_key
in: body
type: string
description: "The Jira project key."
steps:
- name: get-lead
type: call
call: "workday.get-worker"
with:
worker_id: "{{project_lead_id}}"
- name: create-channel
type: call
call: "slack.create-channel"
with:
name: "proj-{{project_name}}"
- name: invite-lead
type: call
call: "slack.invite-to-channel"
with:
channel_id: "{{create-channel.channel_id}}"
user_email: "{{get-lead.work_email}}"
- name: post-welcome
type: call
call: "slack.send-message"
with:
channel: "{{create-channel.channel_id}}"
text: "Welcome to {{project_name}}! Lead: {{get-lead.full_name}}. SharePoint: {{sharepoint_url}}. Jira: https://aecom.atlassian.net/browse/{{jira_project_key}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
- name: invitations
path: "/conversations.invite"
operations:
- name: invite-to-channel
method: POST
- name: messages
path: "/chat.postMessage"
operations:
- name: send-message
method: POST
Executes SQL queries against AECOM Snowflake warehouse.
naftiko: "0.5"
info:
label: "Snowflake Query Executor"
description: "Executes SQL queries against AECOM Snowflake warehouse."
tags:
- data
- snowflake
- analytics
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: run-query
description: "Run query at AECOM."
inputParameters:
- name: sql_query
in: body
type: string
description: "The sql_query to look up."
call: "snowflake.get-sql_query"
with:
sql_query: "{{sql_query}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake_query_executor
method: GET
Exports a Sparx Enterprise Architect model package as a document, uploads it to SharePoint, and logs the export event in Jira.
naftiko: "0.5"
info:
label: "Sparx Enterprise Architect Model Export"
description: "Exports a Sparx Enterprise Architect model package as a document, uploads it to SharePoint, and logs the export event in Jira."
tags:
- engineering
- sparx-enterprise-architect
- sharepoint
- jira
- systems-engineering
capability:
exposes:
- type: mcp
namespace: model-management
port: 8080
tools:
- name: export-ea-model
description: "Export a Sparx EA model, upload to SharePoint, and log in Jira."
inputParameters:
- name: model_id
in: body
type: string
description: "The Sparx EA model identifier."
- name: package_guid
in: body
type: string
description: "The package GUID to export."
- name: project_code
in: body
type: string
description: "The AECOM project code."
steps:
- name: export-model
type: call
call: "sparxea.export-package"
with:
model_id: "{{model_id}}"
package_guid: "{{package_guid}}"
- name: upload-export
type: call
call: "sharepoint.upload-file"
with:
site_id: "engineering_models"
folder_path: "Exports/{{project_code}}"
file_name: "{{export-model.file_name}}"
- name: log-export
type: call
call: "jira.create-issue"
with:
project_key: "ENGR"
summary: "Model export: {{export-model.package_name}}"
description: "Package {{package_guid}} exported. File: {{upload-export.url}}. Version: {{export-model.version}}."
issue_type: "Task"
consumes:
- type: http
namespace: sparxea
baseUri: "https://aecom-ea.azurewebsites.net/api/v1"
authentication:
type: bearer
token: "$secrets.sparxea_token"
resources:
- name: packages
path: "/models/{{model_id}}/packages/{{package_guid}}/export"
inputParameters:
- name: model_id
in: path
- name: package_guid
in: path
operations:
- name: export-package
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}}/{{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://aecom.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
Searches Splunk indexes for log entries at AECOM.
naftiko: "0.5"
info:
label: "Splunk Log Search"
description: "Searches Splunk indexes for log entries at AECOM."
tags:
- devops
- splunk
- logging
capability:
exposes:
- type: mcp
namespace: logging
port: 8080
tools:
- name: search-logs
description: "Search Splunk logs for AECOM."
inputParameters:
- name: query
in: body
type: string
description: "The query to look up."
call: "splunk.get-query"
with:
query: "{{query}}"
consumes:
- type: http
namespace: splunk
baseUri: "https://aecom-splunk.com/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: splunk_log_search
method: GET
Validates subcontractor certifications from SAP, checks insurance status, creates compliance records in ServiceNow, and notifies procurement.
naftiko: "0.5"
info:
label: "Subcontractor Compliance Monitor"
description: "Validates subcontractor certifications from SAP, checks insurance status, creates compliance records in ServiceNow, and notifies procurement."
tags:
- compliance
- sap
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: compliance
port: 8080
tools:
- name: subcontractor_compliance_monitor
description: "Orchestrate subcontractor compliance monitor workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-sap
type: call
call: "sap.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Onboards a new subcontractor by verifying insurance in Salesforce, creating a vendor record in Oracle EBS, provisioning access in Azure Active Directory, and notifying the contracts team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Subcontractor Onboarding Pipeline"
description: "Onboards a new subcontractor by verifying insurance in Salesforce, creating a vendor record in Oracle EBS, provisioning access in Azure Active Directory, and notifying the contracts team via Microsoft Teams."
tags:
- procurement
- salesforce
- oracle-e-business-suite
- azure-active-directory
- microsoft-teams
- subcontractor
capability:
exposes:
- type: mcp
namespace: subcontractor-onboarding
port: 8080
tools:
- name: onboard-subcontractor
description: "Onboard a subcontractor by verifying insurance, creating vendor record, provisioning access, and notifying the contracts team."
inputParameters:
- name: company_name
in: body
type: string
description: "The subcontractor company name."
- name: salesforce_account_id
in: body
type: string
description: "The Salesforce account ID for the subcontractor."
- name: contact_email
in: body
type: string
description: "The primary contact email."
steps:
- name: verify-insurance
type: call
call: "salesforce.get-account"
with:
account_id: "{{salesforce_account_id}}"
- name: create-vendor
type: call
call: "oracle-ebs.create-vendor"
with:
vendor_name: "{{company_name}}"
contact_email: "{{contact_email}}"
insurance_expiry: "{{verify-insurance.insurance_expiry_date}}"
- name: provision-access
type: call
call: "azuread.create-guest-user"
with:
email: "{{contact_email}}"
display_name: "{{company_name}} - External"
- name: notify-contracts
type: call
call: "msteams.send-message"
with:
recipient_upn: "contracts-team@aecom.com"
text: "Subcontractor onboarded: {{company_name}}. Vendor ID: {{create-vendor.vendor_id}}. Insurance expires: {{verify-insurance.insurance_expiry_date}}. Guest access provisioned for {{contact_email}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://aecom.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://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: vendors
path: "/vendors"
operations:
- name: create-vendor
method: POST
- type: http
namespace: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/invitations"
operations:
- name: create-guest-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
Collects energy consumption data from building management systems, calculates carbon footprint metrics, stores results in Azure Databricks, and publishes a sustainability report to Confluence.
naftiko: "0.5"
info:
label: "Sustainability Metrics Collector"
description: "Collects energy consumption data from building management systems, calculates carbon footprint metrics, stores results in Azure Databricks, and publishes a sustainability report to Confluence."
tags:
- sustainability
- azure-databricks
- confluence
- environmental
- energy-management
capability:
exposes:
- type: mcp
namespace: sustainability-reporting
port: 8080
tools:
- name: collect-sustainability-metrics
description: "Gather energy data, compute carbon metrics, store in Databricks, and publish report."
inputParameters:
- name: building_id
in: body
type: string
description: "The building management system identifier."
- name: reporting_period
in: body
type: string
description: "The reporting period (e.g., 2026-Q1)."
- name: project_code
in: body
type: string
description: "The AECOM project code."
steps:
- name: get-energy-data
type: call
call: "bms-api.get-consumption"
with:
building_id: "{{building_id}}"
period: "{{reporting_period}}"
- name: store-metrics
type: call
call: "databricks.run-notebook"
with:
notebook_path: "/sustainability/carbon_calculator"
parameters: "{\"energy_kwh\": \"{{get-energy-data.total_kwh}}\", \"building_id\": \"{{building_id}}\"}"
- name: publish-report
type: call
call: "confluence.create-page"
with:
space_key: "SUSTAIN"
title: "Sustainability Report: {{project_code}} - {{reporting_period}}"
body: "Building: {{building_id}}. Energy: {{get-energy-data.total_kwh}} kWh. Carbon: {{store-metrics.carbon_tonnes}} tonnes CO2e. Period: {{reporting_period}}."
consumes:
- type: http
namespace: bms-api
baseUri: "https://aecom-bms.azurewebsites.net/api/v1"
authentication:
type: bearer
token: "$secrets.bms_api_token"
resources:
- name: consumption
path: "/buildings/{{building_id}}/consumption?period={{period}}"
inputParameters:
- name: building_id
in: path
- name: period
in: query
operations:
- name: get-consumption
method: GET
- type: http
namespace: databricks
baseUri: "https://adb-aecom.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/runs/submit"
operations:
- name: run-notebook
method: POST
- type: http
namespace: confluence
baseUri: "https://aecom.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
Collects sustainability metrics from field operations, aggregates in Snowflake, generates ESG reports in Power BI, and notifies sustainability team.
naftiko: "0.5"
info:
label: "Sustainability Reporting Pipeline"
description: "Collects sustainability metrics from field operations, aggregates in Snowflake, generates ESG reports in Power BI, and notifies sustainability team."
tags:
- sustainability
- snowflake
- powerbi
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: sustainability
port: 8080
tools:
- name: sustainability_reporting_pipeline
description: "Orchestrate sustainability reporting pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-snowflake
type: call
call: "snowflake.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-slack
type: call
call: "slack.create-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Retrieves the status and URL of a Tableau project performance dashboard, returning the view name, last refresh time, and embed URL for sharing.
naftiko: "0.5"
info:
label: "Tableau Project Dashboard Lookup"
description: "Retrieves the status and URL of a Tableau project performance dashboard, returning the view name, last refresh time, and embed URL for sharing."
tags:
- analytics
- tableau
- reporting
capability:
exposes:
- type: mcp
namespace: analytics-dashboards
port: 8080
tools:
- name: get-tableau-view
description: "Retrieve a Tableau dashboard view by site and view ID."
inputParameters:
- name: site_id
in: body
type: string
description: "The Tableau site identifier."
- name: view_id
in: body
type: string
description: "The Tableau view identifier."
call: "tableau.get-view"
with:
site_id: "{{site_id}}"
view_id: "{{view_id}}"
outputParameters:
- name: view_name
type: string
mapping: "$.view.name"
- name: content_url
type: string
mapping: "$.view.contentUrl"
consumes:
- type: http
namespace: tableau
baseUri: "https://aecom-tableau.online.tableau.com/api/3.21/sites"
authentication:
type: bearer
token: "$secrets.tableau_token"
resources:
- name: views
path: "/{{site_id}}/views/{{view_id}}"
inputParameters:
- name: site_id
in: path
- name: view_id
in: path
operations:
- name: get-view
method: GET
Reconciles project travel expenses by retrieving reports from SAP Concur, matching against Oracle EBS project budgets, flagging discrepancies in a Jira task, and summarizing in a Microsoft Teams message.
naftiko: "0.5"
info:
label: "Travel Expense Reconciliation Orchestrator"
description: "Reconciles project travel expenses by retrieving reports from SAP Concur, matching against Oracle EBS project budgets, flagging discrepancies in a Jira task, and summarizing in a Microsoft Teams message."
tags:
- finance
- sap-concur
- oracle-e-business-suite
- jira
- microsoft-teams
- expense-management
capability:
exposes:
- type: mcp
namespace: expense-reconciliation
port: 8080
tools:
- name: reconcile-travel-expenses
description: "Pull Concur expenses, compare with Oracle EBS budgets, flag discrepancies, and notify the finance team."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: finance_channel
in: body
type: string
description: "The Teams channel ID for finance notifications."
steps:
- name: get-expense
type: call
call: "concur.get-expense-report"
with:
report_id: "{{report_id}}"
- name: get-budget
type: call
call: "oracle-ebs.get-project-costs"
with:
project_number: "{{project_number}}"
- name: create-discrepancy-task
type: call
call: "jira.create-issue"
with:
project_key: "FIN"
summary: "Expense reconciliation: Report {{report_id}} vs Project {{project_number}}"
description: "Expense total: ${{get-expense.total_amount}}. Project travel budget remaining: ${{get-budget.travel_budget_remaining}}. Status: {{get-expense.approval_status}}."
issue_type: "Task"
- name: notify-finance
type: call
call: "msteams.post-channel-message"
with:
channel_id: "{{finance_channel}}"
text: "Expense reconciliation complete for Project {{project_number}}. Report {{report_id}}: ${{get-expense.total_amount}}. Jira: {{create-discrepancy-task.key}}"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0/expense"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.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
Processes vendor invoices from SAP, matches against POs, creates payment batches, logs in ServiceNow, and notifies accounts payable.
naftiko: "0.5"
info:
label: "Vendor Payment Processing Pipeline"
description: "Processes vendor invoices from SAP, matches against POs, creates payment batches, logs in ServiceNow, and notifies accounts payable."
tags:
- finance
- sap
- servicenow
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: finance
port: 8080
tools:
- name: vendor_payment_processing_pipeline
description: "Orchestrate vendor payment processing pipeline workflow."
inputParameters:
- name: resource_id
in: body
type: string
description: "Primary resource identifier."
steps:
- name: get-sap
type: call
call: "sap.get-resource"
with:
resource_id: "{{resource_id}}"
- name: process-servicenow
type: call
call: "servicenow.process-resource"
with:
resource_id: "{{resource_id}}"
- name: create-snowflake
type: call
call: "snowflake.create-resource"
with:
resource_id: "{{resource_id}}"
- name: notify-slack
type: call
call: "slack.notify-resource"
with:
resource_id: "{{resource_id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://aecom-sap.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: sap-op
method: POST
- type: http
namespace: servicenow
baseUri: "https://aecom.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: servicenow-op
method: POST
- type: http
namespace: snowflake
baseUri: "https://aecom.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: snowflake-op
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: slack-op
method: POST
Retrieves a Microsoft Visio network diagram file from SharePoint and returns its metadata including version, author, and download URL for infrastructure network documentation.
naftiko: "0.5"
info:
label: "Visio Network Diagram Export"
description: "Retrieves a Microsoft Visio network diagram file from SharePoint and returns its metadata including version, author, and download URL for infrastructure network documentation."
tags:
- engineering
- microsoft-visio
- sharepoint
capability:
exposes:
- type: mcp
namespace: diagram-management
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 identifier."
- name: file_path
in: body
type: string
description: "The path to the Visio file in the document library."
call: "sharepoint.get-file"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
outputParameters:
- name: download_url
type: string
mapping: "$.['@microsoft.graph.downloadUrl']"
- name: last_modified_by
type: string
mapping: "$.lastModifiedBy.user.displayName"
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
Compiles a weekly project status report by pulling schedule data from Microsoft Project, cost data from Oracle EBS, open issues from Jira, and distributing the report via Microsoft Teams and Microsoft Outlook.
naftiko: "0.5"
info:
label: "Weekly Status Report Generator"
description: "Compiles a weekly project status report by pulling schedule data from Microsoft Project, cost data from Oracle EBS, open issues from Jira, and distributing the report via Microsoft Teams and Microsoft Outlook."
tags:
- project-management
- microsoft-project
- oracle-e-business-suite
- jira
- microsoft-teams
- microsoft-outlook
- reporting
capability:
exposes:
- type: mcp
namespace: status-reporting
port: 8080
tools:
- name: generate-weekly-status
description: "Aggregate schedule, cost, and issue data into a weekly status report and distribute to stakeholders."
inputParameters:
- name: project_id
in: body
type: string
description: "The Microsoft Project GUID."
- name: project_number
in: body
type: string
description: "The Oracle EBS project number."
- name: jira_project_key
in: body
type: string
description: "The Jira project key."
- name: stakeholder_emails
in: body
type: string
description: "Comma-separated stakeholder emails."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID."
steps:
- name: get-schedule
type: call
call: "msproject.get-project"
with:
project_id: "{{project_id}}"
- name: get-costs
type: call
call: "oracle-ebs.get-project-costs"
with:
project_number: "{{project_number}}"
- name: get-open-issues
type: call
call: "jira.search-issues"
with:
jql: "project={{jira_project_key}} AND status!=Done"
- name: post-to-teams
type: call
call: "msteams.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
text: "Weekly Status: Schedule {{get-schedule.percent_complete}}% complete. Budget: ${{get-costs.budget_amount}}, Actuals: ${{get-costs.actual_costs}}. Open issues: {{get-open-issues.total}}."
- name: email-stakeholders
type: call
call: "outlook.send-mail"
with:
to: "{{stakeholder_emails}}"
subject: "Weekly Status Report: Project {{project_number}}"
body: "Schedule: {{get-schedule.percent_complete}}% complete, finish {{get-schedule.finish_date}}. Budget variance: {{get-costs.variance_percent}}%. Open Jira issues: {{get-open-issues.total}}."
consumes:
- type: http
namespace: msproject
baseUri: "https://aecom.sharepoint.com/sites/pwa/_api/ProjectServer/Projects"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: projects
path: "('{{project_id}}')"
inputParameters:
- name: project_id
in: path
operations:
- name: get-project
method: GET
- type: http
namespace: oracle-ebs
baseUri: "https://aecom-ebs.oraclecloud.com/webservices/rest/project"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: project-costs
path: "/costs/{{project_number}}"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
- type: http
namespace: jira
baseUri: "https://aecom.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: search
path: "/search?jql={{jql}}"
inputParameters:
- name: jql
in: query
operations:
- name: search-issues
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: 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: 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 employee profile from Workday at AECOM.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Retrieves employee profile from Workday at AECOM."
tags:
- hr
- workday
- employee-data
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-employee
description: "Look up Workday employee at AECOM."
inputParameters:
- name: employee_id
in: body
type: string
description: "The employee_id to look up."
call: "workday.get-employee_id"
with:
employee_id: "{{employee_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/aecom"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: resources
path: "/resources/{{resource_id}}"
operations:
- name: workday_employee_lookup
method: GET