Deloitte Capabilities

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

Sort
Expand

Retrieves a ranked report from Adobe Analytics for page views and unique visitors for a specified date range and report suite.

naftiko: "0.5"
info:
  label: "Adobe Analytics Report Retrieval"
  description: "Retrieves a ranked report from Adobe Analytics for page views and unique visitors for a specified date range and report suite."
  tags:
    - marketing
    - analytics
    - adobe-analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing-adobe
      port: 8080
      tools:
        - name: get-report
          description: "Given a report suite ID and date range, retrieve page view and unique visitor metrics."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID."
            - name: start_date
              in: body
              type: string
              description: "Report start date."
            - name: end_date
              in: body
              type: string
              description: "Report end date."
          call: adobe.get-report
          with:
            rsid: "{{report_suite_id}}"
            start: "{{start_date}}"
            end: "{{end_date}}"
          outputParameters:
            - name: page_views
              type: integer
              mapping: "$.totalPages"
            - name: unique_visitors
              type: integer
              mapping: "$.totalVisitors"
  consumes:
    - type: http
      namespace: adobe
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{rsid}}/reports/ranked"
          inputParameters:
            - name: rsid
              in: path
          operations:
            - name: get-report
              method: POST

Lists objects in an S3 bucket with a given prefix, returning object keys, sizes, and last modified dates for data governance reviews.

naftiko: "0.5"
info:
  label: "Amazon S3 Bucket Inventory"
  description: "Lists objects in an S3 bucket with a given prefix, returning object keys, sizes, and last modified dates for data governance reviews."
  tags:
    - cloud
    - storage
    - amazon-s3
capability:
  exposes:
    - type: mcp
      namespace: cloud-storage
      port: 8080
      tools:
        - name: list-bucket-objects
          description: "Given an S3 bucket name and prefix, return the list of objects with size and modification date."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "S3 bucket name."
            - name: prefix
              in: body
              type: string
              description: "Object key prefix to filter."
          call: s3.list-objects
          with:
            bucket: "{{bucket_name}}"
            prefix: "{{prefix}}"
          outputParameters:
            - name: objects
              type: array
              mapping: "$.Contents"
            - name: count
              type: integer
              mapping: "$.KeyCount"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: objects
          path: "/?list-type=2&prefix={{prefix}}"
          inputParameters:
            - name: bucket
              in: host
            - name: prefix
              in: query
          operations:
            - name: list-objects
              method: GET

When Datadog detects API gateway rate limiting, fetches metrics, creates a ServiceNow incident, and notifies the platform team via Teams.

naftiko: "0.5"
info:
  label: "API Gateway Rate Limit Alert Handler"
  description: "When Datadog detects API gateway rate limiting, fetches metrics, creates a ServiceNow incident, and notifies the platform team via Teams."
  tags:
    - api-management
    - monitoring
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: api-alerts
      port: 8080
      tools:
        - name: handle-rate-limit-alert
          description: "Given a Datadog monitor ID for rate limiting, fetch metrics, create incident, and alert platform team."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that triggered the rate limit alert."
          steps:
            - name: get-monitor
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "API rate limiting detected: {{get-monitor.name}}"
                category: api_management
                priority: "2"
            - name: notify-platform
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.platform_team_id"
                channel_id: "$secrets.platform_alerts_channel_id"
                text: "API rate limit alert: {{get-monitor.name}}. Status: {{get-monitor.overall_state}}. SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        headerName: "DD-API-KEY"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the status of an Appian business process instance, including current step, assignee, and elapsed time.

naftiko: "0.5"
info:
  label: "Appian Process Status Lookup"
  description: "Retrieves the status of an Appian business process instance, including current step, assignee, and elapsed time."
  tags:
    - bpm
    - automation
    - appian
capability:
  exposes:
    - type: mcp
      namespace: bpm-processes
      port: 8080
      tools:
        - name: get-process-status
          description: "Given an Appian process instance ID, return the current step, assignee, and elapsed time."
          inputParameters:
            - name: process_id
              in: body
              type: string
              description: "Appian process instance ID."
          call: appian.get-process
          with:
            process_id: "{{process_id}}"
          outputParameters:
            - name: current_step
              type: string
              mapping: "$.status.currentStep"
            - name: assignee
              type: string
              mapping: "$.status.assignee"
            - name: elapsed_time
              type: string
              mapping: "$.status.elapsedTime"
  consumes:
    - type: http
      namespace: appian
      baseUri: "https://deloitte.appiancloud.com/suite/webapi"
      authentication:
        type: bearer
        token: "$secrets.appian_token"
      resources:
        - name: processes
          path: "/process/{{process_id}}"
          inputParameters:
            - name: process_id
              in: path
          operations:
            - name: get-process
              method: GET

When Azure Cost Management detects a spending anomaly, annotates Datadog, creates a ServiceNow review incident, and alerts the FinOps Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Response"
  description: "When Azure Cost Management detects a spending anomaly, annotates Datadog, creates a ServiceNow review incident, and alerts the FinOps Microsoft Teams channel."
  tags:
    - finops
    - cloud
    - azure
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-azure-cost-anomaly
          description: "Given an Azure cost anomaly alert with service and overage amount, annotate Datadog, open a ServiceNow review incident, and notify the FinOps Microsoft Teams channel."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "Azure cost anomaly ID."
            - name: azure_service
              in: body
              type: string
              description: "Azure service with the anomalous spend."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated overage in USD."
          steps:
            - name: annotate-dd
              type: call
              call: datadog.create-event
              with:
                title: "Azure Cost Anomaly: {{azure_service}}"
                text: "Anomaly {{anomaly_id}} — overage: ${{estimated_overage_usd}}"
                alert_type: warning
            - name: open-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                category: cloud_cost
                short_description: "Azure cost anomaly: {{azure_service}} — ${{estimated_overage_usd}}"
                assigned_group: FinOps
            - name: notify-finops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_finops_team_id"
                channel_id: "$secrets.teams_finops_channel_id"
                text: "Azure cost anomaly: {{azure_service}} | ${{estimated_overage_usd}} overage | SNOW: {{open-snow-incident.number}} | Datadog: {{annotate-dd.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: DD-API-KEY
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the latest build status for an Azure DevOps pipeline, including result, duration, and triggering branch.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status Lookup"
  description: "Retrieves the latest build status for an Azure DevOps pipeline, including result, duration, and triggering branch."
  tags:
    - engineering
    - ci-cd
    - azure-devops
capability:
  exposes:
    - type: mcp
      namespace: devops-builds
      port: 8080
      tools:
        - name: get-build-status
          description: "Given an Azure DevOps project and pipeline ID, return the latest build result, duration, and source branch."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline definition ID."
          call: azdevops.get-builds
          with:
            project: "{{project}}"
            definition_id: "{{pipeline_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: source_branch
              type: string
              mapping: "$.value[0].sourceBranch"
  consumes:
    - type: http
      namespace: azdevops
      baseUri: "https://dev.azure.com/deloitte"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azure_devops_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds?definitions={{definition_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: definition_id
              in: query
          operations:
            - name: get-builds
              method: GET

Retrieves the current month-to-date cost for a specified Azure resource group from Azure Cost Management.

naftiko: "0.5"
info:
  label: "Azure Resource Group Cost Lookup"
  description: "Retrieves the current month-to-date cost for a specified Azure resource group from Azure Cost Management."
  tags:
    - cloud
    - finops
    - microsoft-azure
capability:
  exposes:
    - type: mcp
      namespace: cloud-costs
      port: 8080
      tools:
        - name: get-resource-group-cost
          description: "Given an Azure resource group name, return the month-to-date spend and currency from Azure Cost Management."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
          call: azure.get-cost
          with:
            subscription: "{{subscription_id}}"
            rg: "{{resource_group}}"
          outputParameters:
            - name: total_cost
              type: string
              mapping: "$.properties.rows[0][0]"
            - name: currency
              type: string
              mapping: "$.properties.rows[0][1]"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription}}/resourceGroups/{{rg}}/providers/Microsoft.CostManagement/query?api-version=2023-03-01"
          inputParameters:
            - name: subscription
              in: path
            - name: rg
              in: path
          operations:
            - name: get-cost
              method: POST

Checks the execution status of a Boomi integration process, returning run status, document count, and any error messages.

naftiko: "0.5"
info:
  label: "Boomi Integration Monitoring"
  description: "Checks the execution status of a Boomi integration process, returning run status, document count, and any error messages."
  tags:
    - integration
    - monitoring
    - boomi
capability:
  exposes:
    - type: mcp
      namespace: integration-monitoring
      port: 8080
      tools:
        - name: get-integration-status
          description: "Given a Boomi process execution ID, return the execution status, document count, and errors."
          inputParameters:
            - name: execution_id
              in: body
              type: string
              description: "Boomi process execution ID."
          call: boomi.get-execution
          with:
            execution_id: "{{execution_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.executionStatus"
            - name: document_count
              type: integer
              mapping: "$.numberOfDocuments"
            - name: error_message
              type: string
              mapping: "$.errorMessage"
  consumes:
    - type: http
      namespace: boomi
      baseUri: "https://api.boomi.com/api/rest/v1"
      authentication:
        type: basic
        username: "$secrets.boomi_user"
        password: "$secrets.boomi_token"
      resources:
        - name: executions
          path: "/ExecutionRecord/{{execution_id}}"
          inputParameters:
            - name: execution_id
              in: path
          operations:
            - name: get-execution
              method: GET

Reconciles client billing by comparing Workday project costs against Salesforce contract amounts, identifying variances in Snowflake, and alerting finance via Teams.

naftiko: "0.5"
info:
  label: "Client Billing Reconciliation Workflow"
  description: "Reconciles client billing by comparing Workday project costs against Salesforce contract amounts, identifying variances in Snowflake, and alerting finance via Teams."
  tags:
    - finance
    - billing
    - workday
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-billing
      port: 8080
      tools:
        - name: reconcile-billing
          description: "Compare project costs and contract amounts to identify billing variances."
          inputParameters:
            - name: project_code
              in: body
              type: string
              description: "Project code to reconcile."
          steps:
            - name: get-project-costs
              type: call
              call: workday.get-project-financials
              with:
                project_id: "{{project_code}}"
            - name: get-contract
              type: call
              call: salesforce.get-contract
              with:
                project_code: "{{project_code}}"
            - name: run-variance
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT calculate_billing_variance('{{project_code}}', {{get-project-costs.total_cost}}, {{get-contract.Amount}})"
                warehouse: "FINANCE_WH"
            - name: alert-finance
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.finance_team_id"
                channel_id: "$secrets.billing_channel_id"
                text: "Billing reconciliation for {{project_code}}: Costs={{get-project-costs.total_cost}}, Contract={{get-contract.Amount}}, Variance analysis complete."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: project-financials
          path: "/projects/{{project_id}}/financials"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-financials
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/query?q=SELECT+Id,Amount+FROM+Contract+WHERE+Project_Code__c='{{project_code}}'"
          inputParameters:
            - name: project_code
              in: query
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a deliverable is uploaded to SharePoint, creates a Jira review task, sends approval request to the engagement manager via Teams, and updates Salesforce engagement status.

naftiko: "0.5"
info:
  label: "Client Deliverable Approval Workflow"
  description: "When a deliverable is uploaded to SharePoint, creates a Jira review task, sends approval request to the engagement manager via Teams, and updates Salesforce engagement status."
  tags:
    - consulting
    - delivery
    - sharepoint
    - jira
    - microsoft-teams
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: delivery-approval
      port: 8080
      tools:
        - name: submit-deliverable-for-approval
          description: "Given a SharePoint document URL and engagement ID, create a review task and request approval."
          inputParameters:
            - name: document_url
              in: body
              type: string
              description: "SharePoint URL of the deliverable."
            - name: engagement_id
              in: body
              type: string
              description: "Salesforce engagement opportunity ID."
            - name: approver_email
              in: body
              type: string
              description: "Email of the engagement manager."
          steps:
            - name: get-engagement
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{engagement_id}}"
            - name: create-review-task
              type: call
              call: jira.create-issue
              with:
                project: DELIVERY
                issuetype: Task
                summary: "Review deliverable for {{get-engagement.Name}}"
                description: "Document: {{document_url}}"
            - name: request-approval
              type: call
              call: msteams.send-chat-message
              with:
                user_id: "{{approver_email}}"
                text: "Deliverable ready for review: {{get-engagement.Name}}. Document: {{document_url}}. Jira: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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: chats
          path: "/users/{{user_id}}/chats/messages"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: send-chat-message
              method: POST

When a Salesforce client engagement opportunity reaches the Proposal stage, syncs the opportunity data to SAP for project code generation and notifies the engagement manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Client Engagement Opportunity Sync"
  description: "When a Salesforce client engagement opportunity reaches the Proposal stage, syncs the opportunity data to SAP for project code generation and notifies the engagement manager in Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - sap
    - engagement-management
capability:
  exposes:
    - type: mcp
      namespace: engagement-ops
      port: 8080
      tools:
        - name: sync-engagement-to-sap
          description: "Given a Salesforce opportunity ID that has reached the Proposal stage, create a SAP project code and update the Salesforce opportunity with the project reference, then notify the engagement manager in Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID at Proposal stage."
            - name: engagement_manager_upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the engagement manager."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-project-code
              type: call
              call: sap.create-project
              with:
                description: "{{get-opportunity.name}}"
                client: "{{get-opportunity.account_name}}"
                planned_start: "{{get-opportunity.close_date}}"
            - name: update-opportunity
              type: call
              call: salesforce-update.update-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
                sap_project_code: "{{create-project-code.project_id}}"
            - name: notify-em
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{engagement_manager_upn}}"
                text: "SAP project code created for {{get-opportunity.name}}: {{create-project-code.project_id}}. Opportunity updated in Salesforce."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.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: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/PS_PROJECT_MANAGEMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: projects
          path: "/A_Project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: salesforce-update
      baseUri: "https://deloitte.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new engagement is won in Salesforce, creates a Jira project, provisions a SharePoint site, creates a Teams channel, and notifies the engagement lead.

naftiko: "0.5"
info:
  label: "Client Project Kickoff Orchestration"
  description: "When a new engagement is won in Salesforce, creates a Jira project, provisions a SharePoint site, creates a Teams channel, and notifies the engagement lead."
  tags:
    - project-management
    - onboarding
    - salesforce
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: project-kickoff
      port: 8080
      tools:
        - name: kickoff-client-project
          description: "Given a Salesforce opportunity ID, create all project infrastructure including Jira project, SharePoint site, and Teams channel."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID for the won engagement."
            - name: project_lead_email
              in: body
              type: string
              description: "Email of the engagement lead."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{opportunity_id}}"
            - name: create-jira-project
              type: call
              call: jira.create-project
              with:
                name: "{{get-opportunity.Name}}"
                key: "{{get-opportunity.Project_Code__c}}"
                lead: "{{project_lead_email}}"
            - name: create-sharepoint-site
              type: call
              call: sharepoint.create-site
              with:
                displayName: "{{get-opportunity.Name}}"
                description: "Project site for {{get-opportunity.Account.Name}}"
            - name: create-teams-channel
              type: call
              call: msteams.create-channel
              with:
                team_id: "$secrets.consulting_team_id"
                displayName: "{{get-opportunity.Name}}"
                description: "Channel for {{get-opportunity.Account.Name}} engagement"
            - name: notify-lead
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.consulting_team_id"
                channel_id: "{{create-teams-channel.id}}"
                text: "Project infrastructure ready for {{get-opportunity.Name}}. Jira: {{create-jira-project.key}}, SharePoint: {{create-sharepoint-site.webUrl}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: projects
          path: "/project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sites
          path: "/sites"
          operations:
            - name: create-site
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: create-channel
              method: POST
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls active engagements from Salesforce, sends satisfaction surveys via email, records responses in Snowflake, and posts a summary digest to the leadership Teams channel.

naftiko: "0.5"
info:
  label: "Client Satisfaction Survey Orchestration"
  description: "Pulls active engagements from Salesforce, sends satisfaction surveys via email, records responses in Snowflake, and posts a summary digest to the leadership Teams channel."
  tags:
    - client-relations
    - feedback
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-satisfaction
      port: 8080
      tools:
        - name: run-satisfaction-survey
          description: "Initiate client satisfaction surveys for active engagements and compile results."
          inputParameters:
            - name: survey_period
              in: body
              type: string
              description: "Survey period identifier (e.g., 2026-Q1)."
          steps:
            - name: get-active-engagements
              type: call
              call: salesforce.query-engagements
              with:
                period: "{{survey_period}}"
            - name: store-survey-batch
              type: call
              call: snowflake.execute-query
              with:
                statement: "INSERT INTO surveys.batches (period, engagement_count) VALUES ('{{survey_period}}', {{get-active-engagements.totalSize}})"
                warehouse: "ANALYTICS_WH"
            - name: post-summary
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.leadership_team_id"
                channel_id: "$secrets.client_experience_channel_id"
                text: "Client satisfaction survey launched for {{survey_period}}: {{get-active-engagements.totalSize}} engagements surveyed."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: engagements
          path: "/query?q=SELECT+Id,Name,Account.Name+FROM+Opportunity+WHERE+StageName='Active'+AND+Survey_Period__c='{{period}}'"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: query-engagements
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a cloud resource request is approved in ServiceNow, provisions Azure resources via ARM template, updates the CMDB, and notifies the requester via Teams.

naftiko: "0.5"
info:
  label: "Cloud Resource Provisioning Workflow"
  description: "When a cloud resource request is approved in ServiceNow, provisions Azure resources via ARM template, updates the CMDB, and notifies the requester via Teams."
  tags:
    - cloud
    - infrastructure
    - servicenow
    - microsoft-azure
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-provisioning
      port: 8080
      tools:
        - name: provision-cloud-resources
          description: "Given a ServiceNow request ID, provision Azure resources, update CMDB, and notify the requester."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "ServiceNow request ID for the approved provisioning."
          steps:
            - name: get-request
              type: call
              call: servicenow.get-request
              with:
                request_id: "{{request_id}}"
            - name: deploy-resources
              type: call
              call: azure.create-deployment
              with:
                subscription_id: "{{get-request.subscription_id}}"
                resource_group: "{{get-request.resource_group}}"
                template: "{{get-request.arm_template}}"
            - name: update-cmdb
              type: call
              call: servicenow.update-ci
              with:
                name: "{{get-request.resource_group}}"
                environment: "{{get-request.environment}}"
                status: provisioned
            - name: notify-requester
              type: call
              call: msteams.send-chat-message
              with:
                user_id: "{{get-request.requested_by}}"
                text: "Your cloud resources have been provisioned. Resource group: {{get-request.resource_group}}, Status: {{deploy-resources.properties.provisioningState}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-request
              method: GET
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: update-ci
              method: POST
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: deployments
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Resources/deployments/{{resource_group}}-deploy?api-version=2023-07-01"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: create-deployment
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{user_id}}/chats/messages"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: send-chat-message
              method: POST

Collects audit evidence by pulling access logs from Okta, change records from ServiceNow, and data lineage from Snowflake, then compiles a summary in Confluence.

naftiko: "0.5"
info:
  label: "Compliance Audit Evidence Collection"
  description: "Collects audit evidence by pulling access logs from Okta, change records from ServiceNow, and data lineage from Snowflake, then compiles a summary in Confluence."
  tags:
    - compliance
    - audit
    - okta
    - servicenow
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: compliance-audit
      port: 8080
      tools:
        - name: collect-audit-evidence
          description: "Given an audit period and control ID, gather access logs, change records, and data lineage, then publish to Confluence."
          inputParameters:
            - name: control_id
              in: body
              type: string
              description: "Compliance control identifier."
            - name: start_date
              in: body
              type: string
              description: "Audit period start date."
            - name: end_date
              in: body
              type: string
              description: "Audit period end date."
          steps:
            - name: get-access-logs
              type: call
              call: okta.get-system-logs
              with:
                since: "{{start_date}}"
                until: "{{end_date}}"
                filter: "eventType eq \"user.session.start\""
            - name: get-change-records
              type: call
              call: servicenow.query-changes
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: get-data-lineage
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM audit.data_lineage WHERE control_id = '{{control_id}}' AND event_date BETWEEN '{{start_date}}' AND '{{end_date}}'"
                warehouse: "AUDIT_WH"
            - name: publish-evidence
              type: call
              call: confluence.create-page
              with:
                spaceKey: AUDIT
                title: "Evidence - {{control_id}} - {{start_date}} to {{end_date}}"
                body: "Access log entries: {{get-access-logs.length}}, Change records: {{get-change-records.count}}, Data lineage records: {{get-data-lineage.row_count}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://deloitte.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: logs
          path: "/logs?since={{since}}&until={{until}}&filter={{filter}}"
          inputParameters:
            - name: since
              in: query
            - name: until
              in: query
            - name: filter
              in: query
          operations:
            - name: get-system-logs
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=sys_created_onBETWEEN{{start_date}}@{{end_date}}"
          inputParameters:
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: query-changes
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://deloitte.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

Searches for a Confluence page by title and returns the page ID, space, last updated date, and URL.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Searches for a Confluence page by title and returns the page ID, space, last updated date, and URL."
  tags:
    - knowledge-management
    - documentation
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-pages
      port: 8080
      tools:
        - name: search-page-by-title
          description: "Given a Confluence page title, return the page ID, space key, last modified date, and direct URL."
          inputParameters:
            - name: page_title
              in: body
              type: string
              description: "Title of the Confluence page to find."
          call: confluence.search-page
          with:
            title: "{{page_title}}"
          outputParameters:
            - name: page_id
              type: string
              mapping: "$.results[0].id"
            - name: space_key
              type: string
              mapping: "$.results[0].space.key"
            - name: last_modified
              type: string
              mapping: "$.results[0].version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://deloitte.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content?title={{title}}&expand=space,version"
          inputParameters:
            - name: title
              in: query
          operations:
            - name: search-page
              method: GET

Monitors upcoming contract renewals in Salesforce, creates Jira tracking tickets, sends renewal reminders to account managers via Teams, and logs the outreach in Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Tracking Orchestration"
  description: "Monitors upcoming contract renewals in Salesforce, creates Jira tracking tickets, sends renewal reminders to account managers via Teams, and logs the outreach in Salesforce."
  tags:
    - sales
    - contract-management
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-renewals
      port: 8080
      tools:
        - name: process-upcoming-renewals
          description: "Find contracts expiring within 90 days, create tracking tickets, and notify account managers."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days ahead to look for renewals."
          steps:
            - name: get-expiring-contracts
              type: call
              call: salesforce.query-contracts
              with:
                days: "{{days_ahead}}"
            - name: create-tracking-tickets
              type: call
              call: jira.create-issue
              with:
                project: RENEWALS
                issuetype: Task
                summary: "Contract renewals due within {{days_ahead}} days: {{get-expiring-contracts.totalSize}} contracts"
            - name: notify-managers
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.sales_team_id"
                channel_id: "$secrets.renewals_channel_id"
                text: "{{get-expiring-contracts.totalSize}} contracts expiring within {{days_ahead}} days. Tracking ticket: {{create-tracking-tickets.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/query?q=SELECT+Id,Name,EndDate,Account.Name+FROM+Contract+WHERE+EndDate=NEXT_N_DAYS:{{days}}"
          inputParameters:
            - name: days
              in: query
          operations:
            - name: query-contracts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Analyzes client engagement data in Salesforce, enriches with ZoomInfo firmographics, identifies cross-sell opportunities in Snowflake, and creates Salesforce opportunities for the account team.

naftiko: "0.5"
info:
  label: "Cross-sell Opportunity Detection Workflow"
  description: "Analyzes client engagement data in Salesforce, enriches with ZoomInfo firmographics, identifies cross-sell opportunities in Snowflake, and creates Salesforce opportunities for the account team."
  tags:
    - sales
    - analytics
    - salesforce
    - zoominfo
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: sales-crosssell
      port: 8080
      tools:
        - name: detect-cross-sell
          description: "Given a Salesforce account ID, analyze data to identify cross-sell opportunities."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: enrich-firmographics
              type: call
              call: zoominfo.enrich-company
              with:
                domain: "{{get-account.Website}}"
            - name: analyze-opportunities
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM sales.cross_sell_model WHERE industry = '{{enrich-firmographics.industry}}' AND employee_range = '{{enrich-firmographics.employee_count}}'"
                warehouse: "SALES_WH"
            - name: create-opportunities
              type: call
              call: salesforce.create-opportunity
              with:
                AccountId: "{{account_id}}"
                Name: "Cross-sell: {{get-account.Name}}"
                StageName: "Prospecting"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.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
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/enrich/company"
          operations:
            - name: enrich-company
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a Databricks job fails, retrieves error details, creates a Jira bug ticket, notifies the data engineering team in Teams, and triggers a pipeline retry.

naftiko: "0.5"
info:
  label: "Data Pipeline Failure Recovery"
  description: "When a Databricks job fails, retrieves error details, creates a Jira bug ticket, notifies the data engineering team in Teams, and triggers a pipeline retry."
  tags:
    - data-engineering
    - incident-response
    - databricks
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-recovery
      port: 8080
      tools:
        - name: recover-failed-pipeline
          description: "Given a failed Databricks run ID, capture error details, create a Jira ticket, notify the team, and retry the job."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "Failed Databricks job run ID."
          steps:
            - name: get-run-details
              type: call
              call: databricks.get-run
              with:
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issuetype: Bug
                summary: "Pipeline failure: {{get-run-details.run_name}}"
                description: "Run {{run_id}} failed with state: {{get-run-details.state.result_state}}. Error: {{get-run-details.state.state_message}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.data_eng_team_id"
                channel_id: "$secrets.data_eng_alerts_channel_id"
                text: "Pipeline {{get-run-details.run_name}} failed. Jira: {{create-bug.key}}. Attempting retry..."
            - name: retry-run
              type: call
              call: databricks.rerun-job
              with:
                run_id: "{{run_id}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://deloitte.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/get?run_id={{run_id}}"
          inputParameters:
            - name: run_id
              in: query
          operations:
            - name: get-run
              method: GET
        - name: rerun
          path: "/jobs/runs/repair"
          operations:
            - name: rerun-job
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks the status of a Databricks job run by run ID, returning the current state, start time, and duration.

naftiko: "0.5"
info:
  label: "Databricks Job Run Status"
  description: "Checks the status of a Databricks job run by run ID, returning the current state, start time, and duration."
  tags:
    - data-engineering
    - analytics
    - databricks
capability:
  exposes:
    - type: mcp
      namespace: data-jobs
      port: 8080
      tools:
        - name: get-run-status
          description: "Given a Databricks run ID, return the run state, start time, and execution duration."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "Databricks job run ID."
          call: databricks.get-run
          with:
            run_id: "{{run_id}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state.life_cycle_state"
            - name: result_state
              type: string
              mapping: "$.state.result_state"
            - name: start_time
              type: string
              mapping: "$.start_time"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://deloitte.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/get?run_id={{run_id}}"
          inputParameters:
            - name: run_id
              in: query
          operations:
            - name: get-run
              method: GET

Deploys a registered MLflow model from Databricks to a serving endpoint, updates the model registry, creates a Jira deployment ticket, and notifies the ML team.

naftiko: "0.5"
info:
  label: "Databricks Model Deployment Orchestration"
  description: "Deploys a registered MLflow model from Databricks to a serving endpoint, updates the model registry, creates a Jira deployment ticket, and notifies the ML team."
  tags:
    - data-science
    - ml-ops
    - databricks
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ml-deployment
      port: 8080
      tools:
        - name: deploy-model
          description: "Given a Databricks model name and version, deploy to serving endpoint and track the deployment."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "MLflow registered model name."
            - name: model_version
              in: body
              type: string
              description: "Model version to deploy."
          steps:
            - name: create-endpoint
              type: call
              call: databricks.create-serving-endpoint
              with:
                name: "{{model_name}}-serving"
                model_name: "{{model_name}}"
                model_version: "{{model_version}}"
            - name: create-deployment-ticket
              type: call
              call: jira.create-issue
              with:
                project: MLOPS
                issuetype: Task
                summary: "Model deployment: {{model_name}} v{{model_version}}"
                description: "Endpoint: {{create-endpoint.name}}, Status: {{create-endpoint.state}}"
            - name: notify-ml-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.data_science_team_id"
                channel_id: "$secrets.mlops_channel_id"
                text: "Model {{model_name}} v{{model_version}} deployed. Endpoint: {{create-endpoint.name}}. Jira: {{create-deployment-ticket.key}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://deloitte.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: serving-endpoints
          path: "/serving-endpoints"
          operations:
            - name: create-serving-endpoint
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current status of all critical IT infrastructure monitors from Datadog and returns a structured health summary for the IT operations team.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Health Summary"
  description: "Retrieves the current status of all critical IT infrastructure monitors from Datadog and returns a structured health summary for the IT operations team."
  tags:
    - observability
    - monitoring
    - datadog
    - operations
capability:
  exposes:
    - type: mcp
      namespace: infra-health
      port: 8080
      tools:
        - name: get-infrastructure-health
          description: "Given a Datadog environment tag, retrieve all monitor statuses for the matching infrastructure and return a structured health summary. Use at the start of any IT incident investigation."
          inputParameters:
            - name: environment_tag
              in: body
              type: string
              description: "Datadog environment tag to filter monitors (e.g. env:production)."
          call: datadog.get-monitors
          with:
            monitor_tags: "{{environment_tag}}"
          outputParameters:
            - name: monitors
              type: array
              mapping: "$.monitors"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: DD-API-KEY
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          inputParameters:
            - name: monitor_tags
              in: query
          operations:
            - name: get-monitors
              method: GET

Checks the current health status of a specific service monitored in Datadog, returning overall status and active alert count.

naftiko: "0.5"
info:
  label: "Datadog Service Health Lookup"
  description: "Checks the current health status of a specific service monitored in Datadog, returning overall status and active alert count."
  tags:
    - monitoring
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: monitoring-health
      port: 8080
      tools:
        - name: get-service-health
          description: "Given a Datadog service name, return the current overall status and number of active alerts."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "Name of the service in Datadog."
          call: datadog.get-service-status
          with:
            service: "{{service_name}}"
          outputParameters:
            - name: overall_status
              type: string
              mapping: "$.data.attributes.overall_status"
            - name: active_alerts
              type: integer
              mapping: "$.data.attributes.active_alert_count"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        headerName: "DD-API-KEY"
      resources:
        - name: services
          path: "/services/definitions/{{service}}"
          inputParameters:
            - name: service
              in: path
          operations:
            - name: get-service-status
              method: GET

Retrieves customer account details from Microsoft Dynamics 365, including account name, primary contact, and annual revenue.

naftiko: "0.5"
info:
  label: "Dynamics 365 Customer Lookup"
  description: "Retrieves customer account details from Microsoft Dynamics 365, including account name, primary contact, and annual revenue."
  tags:
    - crm
    - sales
    - microsoft-dynamics-365
capability:
  exposes:
    - type: mcp
      namespace: crm-dynamics
      port: 8080
      tools:
        - name: get-customer
          description: "Given a Dynamics 365 account ID, return the account name, primary contact, and revenue."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Dynamics 365 account ID."
          call: dynamics.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: primary_contact
              type: string
              mapping: "$.primarycontactid.fullname"
            - name: revenue
              type: string
              mapping: "$.revenue"
  consumes:
    - type: http
      namespace: dynamics
      baseUri: "https://deloitte.crm.dynamics.com/api/data/v9.2"
      authentication:
        type: bearer
        token: "$secrets.dynamics_token"
      resources:
        - name: accounts
          path: "/accounts({{account_id}})"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

When Dynatrace detects a performance degradation, fetches problem details, creates a ServiceNow incident, and alerts the SRE team in Teams.

naftiko: "0.5"
info:
  label: "Dynatrace Performance Alert Handler"
  description: "When Dynatrace detects a performance degradation, fetches problem details, creates a ServiceNow incident, and alerts the SRE team in Teams."
  tags:
    - monitoring
    - performance
    - dynatrace
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: performance-alerts
      port: 8080
      tools:
        - name: handle-performance-alert
          description: "Given a Dynatrace problem ID, fetch details, create a ServiceNow incident, and notify SRE."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "Dynatrace problem ID."
          steps:
            - name: get-problem
              type: call
              call: dynatrace.get-problem
              with:
                problem_id: "{{problem_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Performance degradation: {{get-problem.title}}"
                category: performance
                description: "Impact: {{get-problem.impactLevel}}, Root cause: {{get-problem.rootCauseEntity.name}}"
            - name: notify-sre
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.sre_team_id"
                channel_id: "$secrets.sre_alerts_channel_id"
                text: "Performance alert: {{get-problem.title}}. Impact: {{get-problem.impactLevel}}. SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://deloitte.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an employee transfers to a new practice in Workday, updates Okta group memberships, reassigns Jira issues, and notifies both old and new managers via Teams.

naftiko: "0.5"
info:
  label: "Employee Role Transfer Orchestration"
  description: "When an employee transfers to a new practice in Workday, updates Okta group memberships, reassigns Jira issues, and notifies both old and new managers via Teams."
  tags:
    - hr
    - access-management
    - workday
    - okta
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-transfers
      port: 8080
      tools:
        - name: process-role-transfer
          description: "Given a Workday employee ID and new practice, update access groups, reassign work items, and notify managers."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: new_practice
              in: body
              type: string
              description: "Name of the new practice or department."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: update-okta-groups
              type: call
              call: okta.update-user-groups
              with:
                user_id: "{{get-employee.work_email}}"
                new_group: "{{new_practice}}"
                old_group: "{{get-employee.department}}"
            - name: reassign-jira-issues
              type: call
              call: jira.bulk-reassign
              with:
                current_assignee: "{{get-employee.work_email}}"
                project: "{{get-employee.department}}"
            - name: notify-managers
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.hr_team_id"
                channel_id: "$secrets.hr_transfers_channel_id"
                text: "{{get-employee.full_name}} transferring from {{get-employee.department}} to {{new_practice}}. Okta groups updated, Jira issues flagged for reassignment."
  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: okta
      baseUri: "https://deloitte.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: bulk-operations
          path: "/bulk/issues/reassign"
          operations:
            - name: bulk-reassign
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Closes out a consulting engagement by archiving the SharePoint site, closing Jira project, updating Salesforce opportunity stage, and notifying stakeholders via Teams.

naftiko: "0.5"
info:
  label: "Engagement Closeout Orchestration"
  description: "Closes out a consulting engagement by archiving the SharePoint site, closing Jira project, updating Salesforce opportunity stage, and notifying stakeholders via Teams."
  tags:
    - consulting
    - project-management
    - sharepoint
    - jira
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engagement-closeout
      port: 8080
      tools:
        - name: close-engagement
          description: "Given a Salesforce opportunity ID, perform all closeout activities across systems."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-engagement
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{opportunity_id}}"
            - name: update-salesforce
              type: call
              call: salesforce.update-opportunity
              with:
                opp_id: "{{opportunity_id}}"
                StageName: "Closed Won"
            - name: close-jira
              type: call
              call: jira.archive-project
              with:
                project_key: "{{get-engagement.Project_Code__c}}"
            - name: notify-stakeholders
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.consulting_team_id"
                channel_id: "$secrets.engagement_mgmt_channel_id"
                text: "Engagement {{get-engagement.Name}} closed out. Salesforce updated, Jira project archived."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: projects
          path: "/project/{{project_key}}/archive"
          inputParameters:
            - name: project_key
              in: path
          operations:
            - name: archive-project
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls engagement data from Salesforce, financial metrics from Workday, and project health from Jira to generate a risk assessment summary posted to the leadership Teams channel.

naftiko: "0.5"
info:
  label: "Engagement Risk Assessment Workflow"
  description: "Pulls engagement data from Salesforce, financial metrics from Workday, and project health from Jira to generate a risk assessment summary posted to the leadership Teams channel."
  tags:
    - risk-management
    - consulting
    - salesforce
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-assessment
      port: 8080
      tools:
        - name: assess-engagement-risk
          description: "Given a Salesforce opportunity ID, compile risk indicators from financial and project data and post an assessment."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID for the engagement."
          steps:
            - name: get-engagement
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{opportunity_id}}"
            - name: get-financials
              type: call
              call: workday.get-project-financials
              with:
                project_id: "{{get-engagement.Project_Code__c}}"
            - name: get-project-health
              type: call
              call: jira.get-board-metrics
              with:
                board_id: "{{get-engagement.Jira_Board_Id__c}}"
            - name: post-assessment
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.leadership_team_id"
                channel_id: "$secrets.risk_channel_id"
                text: "Risk Assessment - {{get-engagement.Name}}: Revenue at {{get-financials.revenue_utilization}}%, Sprint velocity {{get-project-health.velocity}}, Budget variance {{get-financials.budget_variance}}%"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: project-financials
          path: "/projects/{{project_id}}/financials"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-financials
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: boards
          path: "/board/{{board_id}}/velocity"
          inputParameters:
            - name: board_id
              in: path
          operations:
            - name: get-board-metrics
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When SAP Concur flags an expense policy violation, fetches details, creates a ServiceNow compliance ticket, and notifies the employee's manager via Teams.

naftiko: "0.5"
info:
  label: "Expense Policy Violation Handler"
  description: "When SAP Concur flags an expense policy violation, fetches details, creates a ServiceNow compliance ticket, and notifies the employee's manager via Teams."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-compliance
      port: 8080
      tools:
        - name: handle-expense-violation
          description: "Given a Concur expense report ID with a violation, create a compliance ticket and notify the manager."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: concur.get-expense-report
              with:
                report_id: "{{report_id}}"
            - name: create-compliance-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Expense policy violation: Report {{report_id}}"
                category: compliance
                description: "Employee: {{get-report.OwnerName}}, Amount: {{get-report.Total}} {{get-report.CurrencyCode}}, Violation: {{get-report.PolicyViolation}}"
            - name: notify-manager
              type: call
              call: msteams.send-chat-message
              with:
                user_id: "{{get-report.ApproverEmail}}"
                text: "Expense policy violation on report {{report_id}} by {{get-report.OwnerName}}: {{get-report.PolicyViolation}}. Amount: {{get-report.Total}} {{get-report.CurrencyCode}}. Compliance ticket: {{create-compliance-ticket.number}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{user_id}}/chats/messages"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: send-chat-message
              method: POST

Retrieves Google Cloud Platform billing summary by project for a specified billing period.

naftiko: "0.5"
info:
  label: "GCP Billing Export Summary"
  description: "Retrieves Google Cloud Platform billing summary by project for a specified billing period."
  tags:
    - cloud
    - finops
    - google-cloud-platform
capability:
  exposes:
    - type: mcp
      namespace: cloud-billing
      port: 8080
      tools:
        - name: get-gcp-billing
          description: "Given a GCP billing account and month, return project-level cost breakdown."
          inputParameters:
            - name: billing_account
              in: body
              type: string
              description: "GCP billing account ID."
            - name: month
              in: body
              type: string
              description: "Billing month (YYYY-MM)."
          call: gcp.get-billing
          with:
            account: "{{billing_account}}"
            month: "{{month}}"
          outputParameters:
            - name: total_cost
              type: string
              mapping: "$.costAmount"
            - name: currency
              type: string
              mapping: "$.currencyCode"
  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://cloudbilling.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: billing
          path: "/billingAccounts/{{account}}/costs?month={{month}}"
          inputParameters:
            - name: account
              in: path
            - name: month
              in: query
          operations:
            - name: get-billing
              method: GET

When a GitHub Actions pipeline fails on a core platform repository, creates a Datadog event and opens a Jira bug for the engineering team to investigate and remediate.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "When a GitHub Actions pipeline fails on a core platform repository, creates a Datadog event and opens a Jira bug for the engineering team to investigate and remediate."
  tags:
    - devops
    - cicd
    - github
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow failure, create a Datadog deployment event and open a Jira bug with full failure context for the platform engineering team."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository name where the failure occurred."
            - name: workflow_name
              in: body
              type: string
              description: "Name of the failed workflow."
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID."
            - name: commit_sha
              in: body
              type: string
              description: "Git commit SHA that triggered the failure."
            - name: branch
              in: body
              type: string
              description: "Git branch where the failure occurred."
          steps:
            - name: create-dd-event
              type: call
              call: datadog.create-event
              with:
                title: "CI failure: {{workflow_name}} on {{branch}}"
                text: "Run {{run_id}} failed at {{commit_sha}} in {{repo_name}}"
                alert_type: error
                tags: "env:ci,repo:{{repo_name}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: PLAT
                issuetype: Bug
                summary: "[CI Failure] {{repo_name}} / {{workflow_name}} on {{branch}}"
                description: "Run: {{run_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nDatadog: {{create-dd-event.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: DD-API-KEY
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When a pull request is opened in GitHub, assigns reviewers based on code ownership, creates a Jira sub-task for review tracking, and posts to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub PR Review Assignment Workflow"
  description: "When a pull request is opened in GitHub, assigns reviewers based on code ownership, creates a Jira sub-task for review tracking, and posts to the engineering Teams channel."
  tags:
    - engineering
    - code-review
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: code-review
      port: 8080
      tools:
        - name: assign-pr-reviewers
          description: "Given a GitHub PR number and repo, assign appropriate reviewers, create a Jira task, and notify the team."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in org/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "Pull request number."
          steps:
            - name: get-pr
              type: call
              call: github.get-pull-request
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: request-review
              type: call
              call: github.request-reviewers
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
                reviewers: "{{get-pr.suggested_reviewers}}"
            - name: create-review-task
              type: call
              call: jira.create-issue
              with:
                project: ENG
                issuetype: Sub-task
                summary: "Code review: PR #{{pr_number}} - {{get-pr.title}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.eng_team_id"
                channel_id: "$secrets.eng_pr_channel_id"
                text: "PR #{{pr_number}} in {{repo}}: {{get-pr.title}} by {{get-pr.user.login}}. Reviewers assigned. Jira: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
        - name: reviewers
          path: "/repos/{{repo}}/pulls/{{pr_number}}/requested_reviewers"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: request-reviewers
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the latest commit status and open pull request count for a given GitHub repository.

naftiko: "0.5"
info:
  label: "GitHub Repository Status Lookup"
  description: "Retrieves the latest commit status and open pull request count for a given GitHub repository."
  tags:
    - engineering
    - devops
    - github
capability:
  exposes:
    - type: mcp
      namespace: dev-repos
      port: 8080
      tools:
        - name: get-repo-status
          description: "Given a GitHub repository name, return the latest commit SHA, status, and count of open pull requests."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "Repository name in org/repo format."
          call: github.get-repo
          with:
            repo: "{{repo_name}}"
          outputParameters:
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: open_issues_count
              type: integer
              mapping: "$.open_issues_count"
            - name: updated_at
              type: string
              mapping: "$.updated_at"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-repo
              method: GET

When GitHub code scanning detects a critical vulnerability, creates a ServiceNow security incident and notifies the cybersecurity team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When GitHub code scanning detects a critical vulnerability, creates a ServiceNow security incident and notifies the cybersecurity team in Microsoft Teams."
  tags:
    - security
    - devops
    - github
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-triage
      port: 8080
      tools:
        - name: triage-security-vulnerability
          description: "Given a GitHub repository, CVE ID, and severity, create a ServiceNow security incident and alert the cybersecurity Microsoft Teams channel for immediate triage and remediation."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository containing the vulnerable dependency."
            - name: vulnerability_id
              in: body
              type: string
              description: "CVE or GitHub advisory ID for the vulnerability."
            - name: severity
              in: body
              type: string
              description: "Severity level: critical, high, medium, or low."
            - name: package_name
              in: body
              type: string
              description: "Affected dependency package name."
          steps:
            - name: create-security-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security_vulnerability
                impact: 1
                urgency: 1
                short_description: "{{severity}} vulnerability {{vulnerability_id}} in {{repo_name}}: {{package_name}}"
                assigned_group: Cybersecurity
            - name: alert-security-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "{{severity}} vulnerability: {{vulnerability_id}} in {{repo_name}} ({{package_name}}) | SNOW: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves website traffic summary from Google Analytics for a given date range, including sessions, page views, and bounce rate.

naftiko: "0.5"
info:
  label: "Google Analytics Traffic Summary"
  description: "Retrieves website traffic summary from Google Analytics for a given date range, including sessions, page views, and bounce rate."
  tags:
    - marketing
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: get-traffic-summary
          description: "Given a GA property ID and date range, return sessions, page views, and bounce rate."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "Google Analytics 4 property ID."
            - name: start_date
              in: body
              type: string
              description: "Report start date (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Report end date (YYYY-MM-DD)."
          call: ga.run-report
          with:
            property_id: "{{property_id}}"
            startDate: "{{start_date}}"
            endDate: "{{end_date}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: page_views
              type: string
              mapping: "$.rows[0].metricValues[1].value"
            - name: bounce_rate
              type: string
              mapping: "$.rows[0].metricValues[2].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

Retrieves deal details from HubSpot by deal ID, returning the deal name, stage, amount, and close date.

naftiko: "0.5"
info:
  label: "HubSpot Deal Lookup"
  description: "Retrieves deal details from HubSpot by deal ID, returning the deal name, stage, amount, and close date."
  tags:
    - sales
    - crm
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: crm-deals
      port: 8080
      tools:
        - name: get-deal
          description: "Given a HubSpot deal ID, return the deal name, pipeline stage, amount, and expected close date."
          inputParameters:
            - name: deal_id
              in: body
              type: string
              description: "HubSpot deal ID."
          call: hubspot.get-deal
          with:
            deal_id: "{{deal_id}}"
          outputParameters:
            - name: deal_name
              type: string
              mapping: "$.properties.dealname"
            - name: stage
              type: string
              mapping: "$.properties.dealstage"
            - name: amount
              type: string
              mapping: "$.properties.amount"
            - name: close_date
              type: string
              mapping: "$.properties.closedate"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: deals
          path: "/objects/deals/{{deal_id}}"
          inputParameters:
            - name: deal_id
              in: path
          operations:
            - name: get-deal
              method: GET

Monitors Informatica Cloud data integration pipeline runs, returning job status, row counts, and error details for failed or long-running tasks.

naftiko: "0.5"
info:
  label: "Informatica Data Pipeline Monitoring"
  description: "Monitors Informatica Cloud data integration pipeline runs, returning job status, row counts, and error details for failed or long-running tasks."
  tags:
    - data-integration
    - informatica
    - monitoring
    - etl
capability:
  exposes:
    - type: mcp
      namespace: informatica-pipeline
      port: 8080
      tools:
        - name: get-pipeline-run-status
          description: "Retrieve the latest run status for an Informatica Cloud data pipeline by task name."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Name of the Informatica Cloud task."
          call: "informatica.get-activity-log"
          with:
            task_name: "{{task_name}}"
          outputParameters:
            - name: run_status
              type: string
              mapping: "$.objects[0].state"
            - name: rows_processed
              type: number
              mapping: "$.objects[0].successRowsCount"
            - name: error_message
              type: string
              mapping: "$.objects[0].errorMsg"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: activity-log
          path: "/activity/activityLog?taskName={{task_name}}&rowLimit=1"
          inputParameters:
            - name: task_name
              in: query
          operations:
            - name: get-activity-log
              method: GET

Compares Azure resource configurations against Terraform state in GitHub, creates a Jira remediation ticket for any drift, and notifies the platform team in Teams.

naftiko: "0.5"
info:
  label: "Infrastructure Drift Detection Workflow"
  description: "Compares Azure resource configurations against Terraform state in GitHub, creates a Jira remediation ticket for any drift, and notifies the platform team in Teams."
  tags:
    - infrastructure
    - devops
    - microsoft-azure
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-drift
      port: 8080
      tools:
        - name: detect-infrastructure-drift
          description: "Compare Azure resource state with Terraform and handle any drift detected."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group to check."
            - name: terraform_repo
              in: body
              type: string
              description: "GitHub repo containing Terraform state."
          steps:
            - name: get-azure-resources
              type: call
              call: azure.list-resources
              with:
                resource_group: "{{resource_group}}"
            - name: get-terraform-state
              type: call
              call: github.get-file
              with:
                repo: "{{terraform_repo}}"
                path: "terraform.tfstate"
            - name: create-remediation
              type: call
              call: jira.create-issue
              with:
                project: PLATFORM
                issuetype: Bug
                summary: "Infrastructure drift detected in {{resource_group}}"
                description: "Azure resources: {{get-azure-resources.count}}, Terraform state resources compared."
            - name: notify-platform
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.platform_team_id"
                channel_id: "$secrets.platform_alerts_channel_id"
                text: "Drift detected in {{resource_group}}. Remediation ticket: {{create-remediation.key}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resources
          path: "/subscriptions/$secrets.azure_subscription_id/resourceGroups/{{resource_group}}/resources?api-version=2023-07-01"
          inputParameters:
            - name: resource_group
              in: path
          operations:
            - name: list-resources
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: contents
          path: "/repos/{{repo}}/contents/{{path}}"
          inputParameters:
            - name: repo
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Compares actual IT spend from Azure Cost Management and SAP against planned budget in Snowflake, generates a variance report in Confluence, and alerts finance leadership.

naftiko: "0.5"
info:
  label: "IT Budget Variance Analysis Orchestration"
  description: "Compares actual IT spend from Azure Cost Management and SAP against planned budget in Snowflake, generates a variance report in Confluence, and alerts finance leadership."
  tags:
    - finance
    - it
    - microsoft-azure
    - sap
    - snowflake
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-budgets
      port: 8080
      tools:
        - name: analyze-budget-variance
          description: "Compare actual IT cloud and ERP spend against budget and publish variance analysis."
          inputParameters:
            - name: fiscal_month
              in: body
              type: string
              description: "Fiscal month to analyze."
          steps:
            - name: get-cloud-spend
              type: call
              call: azure.get-cost
              with:
                subscription: "$secrets.azure_subscription_id"
                rg: "all"
            - name: get-budget
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM finance.it_budget WHERE fiscal_month = '{{fiscal_month}}'"
                warehouse: "FINANCE_WH"
            - name: publish-report
              type: call
              call: confluence.create-page
              with:
                spaceKey: FINANCE
                title: "IT Budget Variance - {{fiscal_month}}"
                body: "Cloud spend: {{get-cloud-spend.total_cost}}, Budget: {{get-budget.data[0][1]}}"
            - name: alert-leadership
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.finance_team_id"
                channel_id: "$secrets.it_finance_channel_id"
                text: "IT budget variance analysis for {{fiscal_month}} published. Report: {{publish-report.url}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription}}/providers/Microsoft.CostManagement/query?api-version=2023-03-01"
          inputParameters:
            - name: subscription
              in: path
          operations:
            - name: get-cost
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Datadog detects a P1 infrastructure alert, creates a ServiceNow critical incident, pages the on-call SRE via PagerDuty, and posts to the IT operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "IT Infrastructure Incident Response"
  description: "When Datadog detects a P1 infrastructure alert, creates a ServiceNow critical incident, pages the on-call SRE via PagerDuty, and posts to the IT operations Microsoft Teams channel."
  tags:
    - itsm
    - incident-response
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given a Datadog P1 alert, create a ServiceNow critical incident, page the on-call SRE via PagerDuty, and notify the IT operations Microsoft Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that triggered the P1 alert."
            - name: service_affected
              in: body
              type: string
              description: "Name of the affected service or system."
            - name: alert_message
              in: body
              type: string
              description: "Full alert description from Datadog."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                category: infrastructure
                impact: 1
                urgency: 1
                short_description: "P1: {{service_affected}} — {{alert_message}}"
                assigned_group: SRE_OnCall
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                title: "P1: {{service_affected}}"
                urgency: high
                service_id: "$secrets.pagerduty_infra_service_id"
            - name: notify-it-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_ops_team_id"
                channel_id: "$secrets.teams_it_ops_channel_id"
                text: "P1 INCIDENT: {{service_affected}} | SNOW: {{create-snow-incident.number}} | PD: {{page-oncall.html_url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: Authorization
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves details for a specific Jira issue by key, including status, assignee, priority, and summary.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves details for a specific Jira issue by key, including status, assignee, priority, and summary."
  tags:
    - project-management
    - engineering
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-issues
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, return the issue summary, status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key (e.g., PROJ-1234)."
          call: jira.get-issue
          with:
            key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-issue
              method: GET

Queries Jira for unestimated and stale backlog items across technology projects and posts a weekly digest to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Project Backlog Health Digest"
  description: "Queries Jira for unestimated and stale backlog items across technology projects and posts a weekly digest to the engineering Microsoft Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: project-health
      port: 8080
      tools:
        - name: digest-project-backlog-health
          description: "Given a Jira project key, retrieve unestimated and stale backlog issues, then post a health digest to the engineering Microsoft Teams channel for grooming prioritisation."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Jira project key to analyse (e.g. PLAT, DX, SEC)."
            - name: teams_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID to post the digest."
          steps:
            - name: search-stale-issues
              type: call
              call: jira.search-issues
              with:
                jql: "project = {{project_key}} AND status = Backlog AND (story_points is EMPTY OR updated <= -14d) ORDER BY created ASC"
                maxResults: 50
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_engineering_team_id"
                channel_id: "{{teams_channel_id}}"
                text: "Backlog health — {{project_key}}: {{search-stale-issues.total}} issues need grooming (unestimated or stale >14 days)."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/search"
          inputParameters:
            - name: jql
              in: query
            - name: maxResults
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Takes a draft from Confluence, publishes it as a ServiceNow knowledge article, updates the Confluence page status, and announces it in the practice Teams channel.

naftiko: "0.5"
info:
  label: "Knowledge Article Publishing Workflow"
  description: "Takes a draft from Confluence, publishes it as a ServiceNow knowledge article, updates the Confluence page status, and announces it in the practice Teams channel."
  tags:
    - knowledge-management
    - publishing
    - confluence
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: knowledge-publishing
      port: 8080
      tools:
        - name: publish-knowledge-article
          description: "Given a Confluence page ID, publish its content as a ServiceNow knowledge article and notify the team."
          inputParameters:
            - name: confluence_page_id
              in: body
              type: string
              description: "Confluence page ID containing the draft article."
            - name: knowledge_base
              in: body
              type: string
              description: "ServiceNow knowledge base to publish to."
          steps:
            - name: get-draft
              type: call
              call: confluence.get-page
              with:
                page_id: "{{confluence_page_id}}"
            - name: publish-to-snow
              type: call
              call: servicenow.create-kb-article
              with:
                short_description: "{{get-draft.title}}"
                text: "{{get-draft.body.storage.value}}"
                kb_knowledge_base: "{{knowledge_base}}"
            - name: update-confluence
              type: call
              call: confluence.update-page-label
              with:
                page_id: "{{confluence_page_id}}"
                label: "published-to-snow"
            - name: announce
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.knowledge_team_id"
                channel_id: "$secrets.knowledge_channel_id"
                text: "New knowledge article published: {{get-draft.title}}. ServiceNow: {{publish-to-snow.number}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://deloitte.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"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
        - name: labels
          path: "/content/{{page_id}}/label"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page-label
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: kb-articles
          path: "/table/kb_knowledge"
          operations:
            - name: create-kb-article
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new role assignment is made in Workday, assigns the corresponding Pluralsight learning path, creates a Jira training tracking ticket, and notifies the employee via Teams.

naftiko: "0.5"
info:
  label: "Learning Path Assignment Orchestration"
  description: "When a new role assignment is made in Workday, assigns the corresponding Pluralsight learning path, creates a Jira training tracking ticket, and notifies the employee via Teams."
  tags:
    - hr
    - learning
    - workday
    - pluralsight
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: learning-paths
      port: 8080
      tools:
        - name: assign-learning-path
          description: "Given a Workday employee ID and new role, assign relevant training and create tracking."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: new_role
              in: body
              type: string
              description: "New role or position title."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: assign-training
              type: call
              call: pluralsight.assign-channel
              with:
                email: "{{get-employee.work_email}}"
                channel_name: "{{new_role}}"
            - name: create-tracking
              type: call
              call: jira.create-issue
              with:
                project: TRAINING
                issuetype: Task
                summary: "Training: {{get-employee.full_name}} - {{new_role}} learning path"
                assignee: "{{get-employee.work_email}}"
            - name: notify-employee
              type: call
              call: msteams.send-chat-message
              with:
                user_id: "{{get-employee.work_email}}"
                text: "Your learning path for {{new_role}} has been assigned in Pluralsight. Tracking ticket: {{create-tracking.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: pluralsight
      baseUri: "https://api.pluralsight.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: channels
          path: "/channels/assign"
          operations:
            - name: assign-channel
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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: chats
          path: "/users/{{user_id}}/chats/messages"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: send-chat-message
              method: POST

Retrieves LinkedIn company page follower and engagement analytics for employer branding reporting.

naftiko: "0.5"
info:
  label: "LinkedIn Company Page Analytics"
  description: "Retrieves LinkedIn company page follower and engagement analytics for employer branding reporting."
  tags:
    - marketing
    - social
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: social-analytics
      port: 8080
      tools:
        - name: get-page-analytics
          description: "Return LinkedIn company page follower count, post impressions, and engagement rate."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "LinkedIn organization ID."
          call: linkedin.get-org-stats
          with:
            org_id: "{{organization_id}}"
          outputParameters:
            - name: follower_count
              type: integer
              mapping: "$.followerCount"
            - name: impressions
              type: integer
              mapping: "$.totalImpressions"
            - name: engagement_rate
              type: number
              mapping: "$.engagementRate"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: org-stats
          path: "/organizationalEntityFollowerStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:{{org_id}}"
          inputParameters:
            - name: org_id
              in: query
          operations:
            - name: get-org-stats
              method: GET

Retrieves LinkedIn page analytics for Deloitte's employer brand and posts a monthly digest to the talent acquisition Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Brand Performance Digest"
  description: "Retrieves LinkedIn page analytics for Deloitte's employer brand and posts a monthly digest to the talent acquisition Microsoft Teams channel."
  tags:
    - marketing
    - hr
    - linkedin
    - microsoft-teams
    - employer-brand
capability:
  exposes:
    - type: mcp
      namespace: talent-brand
      port: 8080
      tools:
        - name: digest-linkedin-brand-performance
          description: "Given a LinkedIn organization URN and date range, retrieve page engagement and follower metrics, then post a digest to the talent acquisition Microsoft Teams channel."
          inputParameters:
            - name: organization_urn
              in: body
              type: string
              description: "LinkedIn organization URN for Deloitte."
            - name: start_date
              in: body
              type: string
              description: "ISO 8601 start date for the analytics period."
            - name: end_date
              in: body
              type: string
              description: "ISO 8601 end date for the analytics period."
          steps:
            - name: get-org-stats
              type: call
              call: linkedin.get-organization-statistics
              with:
                organization_urn: "{{organization_urn}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_ta_channel_id"
                text: "LinkedIn brand digest ({{start_date}} to {{end_date}}): Followers: {{get-org-stats.followersCount}} | Page views: {{get-org-stats.totalPageStatistics.views.allPageViews.pageViews}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organization-statistics
          path: "/organizationalEntityShareStatistics"
          inputParameters:
            - name: organization_urn
              in: query
            - name: start
              in: query
            - name: end
              in: query
          operations:
            - name: get-organization-statistics
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves performance metrics for a Mailchimp email campaign including open rate, click rate, and unsubscribe count.

naftiko: "0.5"
info:
  label: "Mailchimp Campaign Performance Lookup"
  description: "Retrieves performance metrics for a Mailchimp email campaign including open rate, click rate, and unsubscribe count."
  tags:
    - marketing
    - email
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: marketing-email
      port: 8080
      tools:
        - name: get-campaign-performance
          description: "Given a Mailchimp campaign ID, return open rate, click rate, and total recipients."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Mailchimp campaign ID."
          call: mailchimp.get-campaign-report
          with:
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: open_rate
              type: number
              mapping: "$.opens.open_rate"
            - name: click_rate
              type: number
              mapping: "$.clicks.click_rate"
            - name: total_sent
              type: integer
              mapping: "$.emails_sent"
  consumes:
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: reports
          path: "/reports/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-report
              method: GET

Retrieves Microsoft 365 license assignment and usage data from Microsoft Graph for IT asset management.

naftiko: "0.5"
info:
  label: "Microsoft 365 License Usage Report"
  description: "Retrieves Microsoft 365 license assignment and usage data from Microsoft Graph for IT asset management."
  tags:
    - it
    - license-management
    - microsoft-365
capability:
  exposes:
    - type: mcp
      namespace: it-licensing
      port: 8080
      tools:
        - name: get-license-usage
          description: "Retrieve Microsoft 365 license SKUs with assigned and consumed unit counts."
          inputParameters: []
          call: msgraph.get-subscribed-skus
          with: {}
          outputParameters:
            - name: skus
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: subscribed-skus
          path: "/subscribedSkus"
          operations:
            - name: get-subscribed-skus
              method: GET

When an employee's role changes in Workday, updates their Microsoft 365 security group memberships and creates a ServiceNow access review task for IT security to validate the changes.

naftiko: "0.5"
info:
  label: "Microsoft 365 User Role Change Provisioning"
  description: "When an employee's role changes in Workday, updates their Microsoft 365 security group memberships and creates a ServiceNow access review task for IT security to validate the changes."
  tags:
    - hr
    - access-management
    - workday
    - microsoft-365
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-provisioning
      port: 8080
      tools:
        - name: reprovision-role-access
          description: "Given a Workday employee ID, old and new Microsoft 365 group IDs, update the user's group memberships and create a ServiceNow access review task for IT security validation."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the employee changing roles."
            - name: upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the employee."
            - name: old_group_id
              in: body
              type: string
              description: "Microsoft 365 group ID to remove the user from."
            - name: new_group_id
              in: body
              type: string
              description: "Microsoft 365 group ID to add the user to."
            - name: new_role_title
              in: body
              type: string
              description: "New job title for context in the access review task."
          steps:
            - name: remove-old-group
              type: call
              call: msgraph.remove-group-member
              with:
                group_id: "{{old_group_id}}"
                user_id: "{{upn}}"
            - name: add-new-group
              type: call
              call: msgraph-new.add-group-member
              with:
                group_id: "{{new_group_id}}"
                user_id: "{{upn}}"
            - name: create-access-review
              type: call
              call: servicenow.create-task
              with:
                category: access_review
                short_description: "Access review: {{upn}} role change to {{new_role_title}}"
                assigned_group: IT_Security
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members/{{user_id}}/$ref"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: remove-group-member
              method: DELETE
    - type: http
      namespace: msgraph-new
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members/$ref"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: add-group-member
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Sends a notification message to a specified Microsoft Teams channel using the Graph API.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notification"
  description: "Sends a notification message to a specified Microsoft Teams channel using the Graph API."
  tags:
    - communications
    - notifications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: comms-teams
      port: 8080
      tools:
        - name: send-channel-message
          description: "Send a text message to a specified Microsoft Teams channel."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Microsoft Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID."
            - name: message
              in: body
              type: string
              description: "Message text to send."
          call: msteams.post-message
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Checks the health status of a deployed MuleSoft API by application name, returning deployment status and worker count.

naftiko: "0.5"
info:
  label: "MuleSoft API Health Check"
  description: "Checks the health status of a deployed MuleSoft API by application name, returning deployment status and worker count."
  tags:
    - integration
    - api-management
    - mulesoft
capability:
  exposes:
    - type: mcp
      namespace: integration-apis
      port: 8080
      tools:
        - name: check-api-health
          description: "Given a MuleSoft application name, return its deployment status, worker count, and runtime version."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "MuleSoft CloudHub application name."
          call: mulesoft.get-app
          with:
            app_name: "{{app_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: workers
              type: integer
              mapping: "$.workers.amount"
            - name: runtime_version
              type: string
              mapping: "$.muleVersion.version"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/cloudhub/api"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: applications
          path: "/v2/applications/{{app_name}}"
          inputParameters:
            - name: app_name
              in: path
          operations:
            - name: get-app
              method: GET

When a new hire is created in Workday, provisions Microsoft 365 access via Microsoft Graph, creates a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to the practice team.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestration"
  description: "When a new hire is created in Workday, provisions Microsoft 365 access via Microsoft Graph, creates a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to the practice team."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-new-hire-onboarding
          description: "Given a Workday employee ID and start date, provision Microsoft 365 access, create a ServiceNow onboarding ticket, and send a Teams welcome message to the new hire's practice team channel."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format."
            - name: practice_team_id
              in: body
              type: string
              description: "Microsoft Teams team ID for the new hire's consulting practice."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: provision-m365
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-employee.full_name}}"
                userPrincipalName: "{{get-employee.work_email}}"
                department: "{{get-employee.department}}"
            - name: open-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_onboarding
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                assigned_group: IT_Onboarding
            - name: welcome-message
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "{{practice_team_id}}"
                channel_id: "$secrets.teams_general_channel_id"
                text: "Please welcome {{get-employee.full_name}} joining {{get-employee.department}} on {{start_date}}! IT ticket: {{open-snow-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Okta detects a suspicious login event, fetches user details, suspends the account, creates a security incident in ServiceNow, and alerts the security team.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login Response"
  description: "When Okta detects a suspicious login event, fetches user details, suspends the account, creates a security incident in ServiceNow, and alerts the security team."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-identity
      port: 8080
      tools:
        - name: respond-to-suspicious-login
          description: "Given an Okta event ID for a suspicious login, suspend the user, create an incident, and notify security."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "Okta system log event ID."
            - name: user_id
              in: body
              type: string
              description: "Okta user ID of the affected account."
          steps:
            - name: get-user
              type: call
              call: okta.get-user
              with:
                email: "{{user_id}}"
            - name: suspend-user
              type: call
              call: okta.suspend-user
              with:
                user_id: "{{user_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Suspicious login: {{get-user.display_name}}"
                category: security_incident
                priority: "1"
                description: "User {{get-user.display_name}} account suspended due to suspicious login. Event: {{event_id}}"
            - name: alert-security
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.security_team_id"
                channel_id: "$secrets.security_incidents_channel_id"
                text: "Suspicious login for {{get-user.display_name}} - account suspended. SNOW: {{create-incident.number}}. Event: {{event_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://deloitte.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/suspend"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: suspend-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Looks up a user in Okta by email and returns their account status, last login time, and assigned groups.

naftiko: "0.5"
info:
  label: "Okta User Status Lookup"
  description: "Looks up a user in Okta by email and returns their account status, last login time, and assigned groups."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity-users
      port: 8080
      tools:
        - name: get-user-status
          description: "Given a user email, look up their Okta account status, last login, and group memberships."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "User email address to look up in Okta."
          call: okta.get-user
          with:
            email: "{{user_email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
            - name: display_name
              type: string
              mapping: "$.profile.displayName"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://deloitte.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves general ledger account balances from Oracle Cloud for a given period and company code.

naftiko: "0.5"
info:
  label: "Oracle GL Balance Lookup"
  description: "Retrieves general ledger account balances from Oracle Cloud for a given period and company code."
  tags:
    - finance
    - accounting
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: finance-gl
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Given an Oracle ledger ID and accounting period, return the GL account balance."
          inputParameters:
            - name: ledger_id
              in: body
              type: string
              description: "Oracle general ledger ID."
            - name: period_name
              in: body
              type: string
              description: "Accounting period name."
          call: oracle.get-balance
          with:
            ledger_id: "{{ledger_id}}"
            period: "{{period_name}}"
          outputParameters:
            - name: balance
              type: string
              mapping: "$.items[0].balance"
            - name: currency
              type: string
              mapping: "$.items[0].currencyCode"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://deloitte.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: gl-balances
          path: "/glBalances?q=LedgerId={{ledger_id}};AccountingPeriod={{period}}"
          inputParameters:
            - name: ledger_id
              in: query
            - name: period
              in: query
          operations:
            - name: get-balance
              method: GET

Creates a new incident in PagerDuty for a specified service, triggering the on-call rotation.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Creation"
  description: "Creates a new incident in PagerDuty for a specified service, triggering the on-call rotation."
  tags:
    - incident-management
    - on-call
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: incident-paging
      port: 8080
      tools:
        - name: create-incident
          description: "Create a PagerDuty incident with a title and urgency level for a given service."
          inputParameters:
            - name: service_id
              in: body
              type: string
              description: "PagerDuty service ID."
            - name: title
              in: body
              type: string
              description: "Incident title."
            - name: urgency
              in: body
              type: string
              description: "Urgency level (high or low)."
          call: pagerduty.create-incident
          with:
            service_id: "{{service_id}}"
            title: "{{title}}"
            urgency: "{{urgency}}"
          outputParameters:
            - name: incident_id
              type: string
              mapping: "$.incident.id"
            - name: status
              type: string
              mapping: "$.incident.status"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Retrieves the currently on-call engineer for a Deloitte IT service from PagerDuty for use at the start of incident response workflows.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Roster Lookup"
  description: "Retrieves the currently on-call engineer for a Deloitte IT service from PagerDuty for use at the start of incident response workflows."
  tags:
    - incident-response
    - operations
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-current-oncall
          description: "Given a PagerDuty schedule ID, return the name and email of the current on-call engineer. Use at the beginning of incident response workflows to identify the right engineer to engage."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID for the service's on-call rotation."
          call: pagerduty.get-oncall
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: user_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: Authorization
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: schedule_id
              in: query
          operations:
            - name: get-oncall
              method: GET

Triggers a refresh of a specified Power BI dataset to update reports with the latest data from source systems.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Trigger"
  description: "Triggers a refresh of a specified Power BI dataset to update reports with the latest data from source systems."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: analytics-powerbi
      port: 8080
      tools:
        - name: refresh-dataset
          description: "Trigger a refresh for a Power BI dataset by dataset ID."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace (group) ID."
          call: powerbi.refresh-dataset
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Triggers a Power BI dataset refresh for Deloitte's practice revenue dashboard after Snowflake billing data loads complete, ensuring leadership has current project revenue data.

naftiko: "0.5"
info:
  label: "Power BI Practice Revenue Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for Deloitte's practice revenue dashboard after Snowflake billing data loads complete, ensuring leadership has current project revenue data."
  tags:
    - analytics
    - finance
    - power-bi
    - snowflake
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: revenue-reporting
      port: 8080
      tools:
        - name: refresh-practice-revenue-dashboard
          description: "Given a Power BI dataset ID, verify the latest Snowflake billing pipeline load and trigger a Power BI dataset refresh for the practice revenue leadership dashboard."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID for the practice revenue report."
          steps:
            - name: verify-pipeline-load
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT MAX(loaded_at) as last_load FROM pipeline_audit WHERE pipeline = 'billing_revenue' AND status = 'success'"
            - name: refresh-pbi-dataset
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Aggregates staff utilization data from Workday, project hours from Jira, and revenue data from Salesforce to produce a weekly practice utilization report refreshed in Power BI.

naftiko: "0.5"
info:
  label: "Practice Utilization Report Orchestration"
  description: "Aggregates staff utilization data from Workday, project hours from Jira, and revenue data from Salesforce to produce a weekly practice utilization report refreshed in Power BI."
  tags:
    - operations
    - reporting
    - workday
    - jira
    - salesforce
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: ops-utilization
      port: 8080
      tools:
        - name: generate-utilization-report
          description: "Compile utilization data from Workday, Jira, and Salesforce and refresh the Power BI report."
          inputParameters:
            - name: practice_code
              in: body
              type: string
              description: "Practice code to generate report for."
            - name: report_week
              in: body
              type: string
              description: "ISO week to report on (e.g., 2026-W13)."
          steps:
            - name: get-headcount
              type: call
              call: workday.get-practice-headcount
              with:
                practice: "{{practice_code}}"
            - name: get-project-hours
              type: call
              call: jira.get-worklogs
              with:
                project: "{{practice_code}}"
                week: "{{report_week}}"
            - name: get-revenue
              type: call
              call: salesforce.get-practice-revenue
              with:
                practice_code: "{{practice_code}}"
            - name: refresh-report
              type: call
              call: powerbi.refresh-dataset
              with:
                group_id: "$secrets.ops_workspace_id"
                dataset_id: "$secrets.utilization_dataset_id"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/workers?practice={{practice}}"
          inputParameters:
            - name: practice
              in: query
          operations:
            - name: get-practice-headcount
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: worklogs
          path: "/worklog/list?project={{project}}&week={{week}}"
          inputParameters:
            - name: project
              in: query
            - name: week
              in: query
          operations:
            - name: get-worklogs
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: revenue
          path: "/query?q=SELECT+SUM(Amount)+FROM+Opportunity+WHERE+Practice_Code__c='{{practice_code}}'"
          inputParameters:
            - name: practice_code
              in: query
          operations:
            - name: get-practice-revenue
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Orchestrates the quarterly financial close by verifying SAP period status, triggering Snowflake reconciliation queries, refreshing Power BI dashboards, and posting the summary to Teams.

naftiko: "0.5"
info:
  label: "Quarterly Financial Close Checklist"
  description: "Orchestrates the quarterly financial close by verifying SAP period status, triggering Snowflake reconciliation queries, refreshing Power BI dashboards, and posting the summary to Teams."
  tags:
    - finance
    - accounting
    - sap
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-quarterly-close
          description: "Execute the quarterly financial close checklist including SAP period check, data reconciliation, and dashboard refresh."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period to close (e.g., 2026-Q1)."
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
          steps:
            - name: check-sap-period
              type: call
              call: sap.get-period-status
              with:
                company_code: "{{company_code}}"
                period: "{{fiscal_period}}"
            - name: run-reconciliation
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL finance.reconciliation_check('{{fiscal_period}}', '{{company_code}}')"
                warehouse: "FINANCE_WH"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                group_id: "$secrets.finance_workspace_id"
                dataset_id: "$secrets.finance_close_dataset_id"
            - name: post-summary
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.finance_team_id"
                channel_id: "$secrets.finance_close_channel_id"
                text: "Q close checklist for {{fiscal_period}}: SAP period {{check-sap-period.status}}, Reconciliation rows: {{run-reconciliation.row_count}}, Dashboard refresh triggered."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIOD"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: periods
          path: "/A_FinancialPeriod(CompanyCode='{{company_code}}',FiscalPeriod='{{period}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: period
              in: path
          operations:
            - name: get-period-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a SailPoint access certification campaign, pulls non-compliant users, creates ServiceNow remediation tickets, and notifies managers via Teams.

naftiko: "0.5"
info:
  label: "SailPoint Access Certification Workflow"
  description: "Triggers a SailPoint access certification campaign, pulls non-compliant users, creates ServiceNow remediation tickets, and notifies managers via Teams."
  tags:
    - security
    - identity-governance
    - sailpoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: access-certification
      port: 8080
      tools:
        - name: run-access-certification
          description: "Trigger an access certification campaign and handle non-compliant accounts."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "Name for the certification campaign."
          steps:
            - name: launch-campaign
              type: call
              call: sailpoint.create-campaign
              with:
                name: "{{campaign_name}}"
                type: MANAGER
            - name: get-violations
              type: call
              call: sailpoint.get-violations
              with:
                campaign_id: "{{launch-campaign.id}}"
            - name: create-remediation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Access certification violations: {{campaign_name}}"
                category: security
                description: "{{get-violations.count}} non-compliant access entries found."
            - name: notify-managers
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.security_team_id"
                channel_id: "$secrets.access_review_channel_id"
                text: "Access certification '{{campaign_name}}' complete. {{get-violations.count}} violations found. Remediation ticket: {{create-remediation.number}}"
  consumes:
    - type: http
      namespace: sailpoint
      baseUri: "https://deloitte.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: create-campaign
              method: POST
        - name: violations
          path: "/campaigns/{{campaign_id}}/violations"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-violations
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Creates a new support case in Salesforce with specified subject, priority, and account association.

naftiko: "0.5"
info:
  label: "Salesforce Case Creation"
  description: "Creates a new support case in Salesforce with specified subject, priority, and account association."
  tags:
    - support
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: support-cases
      port: 8080
      tools:
        - name: create-case
          description: "Create a new Salesforce case with subject, description, priority, and account ID."
          inputParameters:
            - name: subject
              in: body
              type: string
              description: "Case subject line."
            - name: description
              in: body
              type: string
              description: "Case description."
            - name: priority
              in: body
              type: string
              description: "Case priority (High, Medium, Low)."
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
          call: salesforce.create-case
          with:
            Subject: "{{subject}}"
            Description: "{{description}}"
            Priority: "{{priority}}"
            AccountId: "{{account_id}}"
          outputParameters:
            - name: case_id
              type: string
              mapping: "$.id"
            - name: case_number
              type: string
              mapping: "$.CaseNumber"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

Retrieves a Salesforce client account record and returns key engagement health indicators including open opportunities, last activity, and current contract status for partner-level reviews.

naftiko: "0.5"
info:
  label: "Salesforce Client Account Health Review"
  description: "Retrieves a Salesforce client account record and returns key engagement health indicators including open opportunities, last activity, and current contract status for partner-level reviews."
  tags:
    - sales
    - crm
    - salesforce
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: client-management
      port: 8080
      tools:
        - name: get-client-account-health
          description: "Given a Salesforce account ID, retrieve client health indicators including open opportunities, last contact date, and active contract value. Use for quarterly business reviews and partner planning."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID for the client."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: account_name
              type: string
              mapping: "$.Name"
            - name: owner_name
              type: string
              mapping: "$.Owner.Name"
            - name: last_activity_date
              type: string
              mapping: "$.LastActivityDate"
            - name: annual_revenue
              type: number
              mapping: "$.AnnualRevenue"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.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

Retrieves contact details from Salesforce by email address, returning the contact name, account, title, and phone number.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Retrieves contact details from Salesforce by email address, returning the contact name, account, title, and phone number."
  tags:
    - sales
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-contacts
      port: 8080
      tools:
        - name: get-contact-by-email
          description: "Given an email address, look up the Salesforce contact and return name, account, title, and phone."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email address of the contact to look up."
          call: salesforce.query-contact
          with:
            email: "{{email}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.records[0].Name"
            - name: account
              type: string
              mapping: "$.records[0].Account.Name"
            - name: title
              type: string
              mapping: "$.records[0].Title"
            - name: phone
              type: string
              mapping: "$.records[0].Phone"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/query?q=SELECT+Name,Account.Name,Title,Phone+FROM+Contact+WHERE+Email='{{email}}'"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: query-contact
              method: GET

Enriches a Salesforce client lead with LinkedIn company and executive profile data to give the business development team richer context before an initial client meeting.

naftiko: "0.5"
info:
  label: "Salesforce Lead to Engagement Enrichment"
  description: "Enriches a Salesforce client lead with LinkedIn company and executive profile data to give the business development team richer context before an initial client meeting."
  tags:
    - sales
    - crm
    - salesforce
    - linkedin
    - enrichment
capability:
  exposes:
    - type: mcp
      namespace: bd-intelligence
      port: 8080
      tools:
        - name: enrich-client-lead
          description: "Given a Salesforce lead ID and LinkedIn member URN for the prospect, retrieve LinkedIn profile data and update the Salesforce lead with current title and industry for pre-meeting research."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead ID to enrich."
            - name: linkedin_member_urn
              in: body
              type: string
              description: "LinkedIn member URN for the prospect."
          steps:
            - name: get-linkedin-profile
              type: call
              call: linkedin.get-profile
              with:
                member_urn: "{{linkedin_member_urn}}"
            - name: update-lead
              type: call
              call: salesforce.update-lead
              with:
                lead_id: "{{lead_id}}"
                title: "{{get-linkedin-profile.headline}}"
                linkedin_url: "https://www.linkedin.com/in/{{get-linkedin-profile.vanityName}}"
                industry: "{{get-linkedin-profile.industry}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people/{{member_urn}}"
          inputParameters:
            - name: member_urn
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

Generates a weekly digest of open sales pipeline opportunities from Salesforce by stage and practice area, and posts the summary to the business development Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Pipeline Opportunity Digest"
  description: "Generates a weekly digest of open sales pipeline opportunities from Salesforce by stage and practice area, and posts the summary to the business development Microsoft Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bd-reporting
      port: 8080
      tools:
        - name: digest-pipeline-opportunities
          description: "Given a Salesforce owner team ID and reporting period, query the open opportunity pipeline by stage and post a digest summary to the business development Microsoft Teams channel."
          inputParameters:
            - name: practice_area
              in: body
              type: string
              description: "Practice area to filter opportunities (e.g. Consulting, Advisory, Audit)."
            - name: report_date
              in: body
              type: string
              description: "ISO 8601 date for the pipeline snapshot."
          steps:
            - name: query-pipeline
              type: call
              call: salesforce.query-opportunities
              with:
                q: "SELECT StageName, COUNT(Id) as count, SUM(Amount) as total_value FROM Opportunity WHERE IsClosed = false AND Practice_Area__c = '{{practice_area}}' GROUP BY StageName"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_bd_team_id"
                channel_id: "$secrets.teams_bd_channel_id"
                text: "Pipeline digest — {{practice_area}} as of {{report_date}}: {{query-pipeline.total}} open opportunities. Review in Salesforce for details."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-opportunities
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new case is created in Salesforce Service Cloud, enriches it with account data, assigns to the appropriate queue, creates a ServiceNow shadow ticket, and notifies the support team.

naftiko: "0.5"
info:
  label: "Salesforce Service Cloud Case Routing"
  description: "When a new case is created in Salesforce Service Cloud, enriches it with account data, assigns to the appropriate queue, creates a ServiceNow shadow ticket, and notifies the support team."
  tags:
    - support
    - case-management
    - salesforce-service-cloud
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: support-routing
      port: 8080
      tools:
        - name: route-service-case
          description: "Given a Salesforce case ID, enrich with account data, route to queue, create shadow ticket, and notify."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID."
          steps:
            - name: get-case
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-shadow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "SF Case: {{get-case.Subject}}"
                category: "{{get-case.Type}}"
                description: "Account: {{get-case.Account.Name}}, Priority: {{get-case.Priority}}"
            - name: notify-support
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.support_team_id"
                channel_id: "$secrets.support_cases_channel_id"
                text: "New case: {{get-case.Subject}} from {{get-case.Account.Name}}. Priority: {{get-case.Priority}}. SNOW shadow: {{create-shadow-ticket.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a SAP Concur expense report exceeds the auto-approval threshold, creates a ServiceNow approval task and notifies the employee's practice leader in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Approval Escalation"
  description: "When a SAP Concur expense report exceeds the auto-approval threshold, creates a ServiceNow approval task and notifies the employee's practice leader in Microsoft Teams."
  tags:
    - finance
    - expenses
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: escalate-expense-for-approval
          description: "Given a SAP Concur expense report ID and total exceeding the auto-approval threshold, create a ServiceNow approval task and notify the practice leader in Microsoft Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID requiring approval."
            - name: total_amount_usd
              in: body
              type: number
              description: "Total expense report amount in USD."
            - name: employee_name
              in: body
              type: string
              description: "Name of the employee who submitted the expense report."
            - name: approver_upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the approving practice leader."
          steps:
            - name: create-approval-task
              type: call
              call: servicenow.create-task
              with:
                category: expense_approval
                short_description: "Expense approval: {{employee_name}} — ${{total_amount_usd}}"
                assigned_to: "{{approver_upn}}"
            - name: notify-approver
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Expense approval needed: {{employee_name}} submitted ${{total_amount_usd}} (Concur report: {{report_id}}) | Approve in SNOW: {{create-approval-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              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

Checks the SAP HANA system replication status and alerts operations if replication lag exceeds threshold, creating a ServiceNow incident.

naftiko: "0.5"
info:
  label: "SAP HANA Data Replication Monitor"
  description: "Checks the SAP HANA system replication status and alerts operations if replication lag exceeds threshold, creating a ServiceNow incident."
  tags:
    - data
    - database
    - sap-hana
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-replication
      port: 8080
      tools:
        - name: check-replication-status
          description: "Check SAP HANA replication status and escalate if lagging."
          inputParameters:
            - name: hana_host
              in: body
              type: string
              description: "SAP HANA host identifier."
          steps:
            - name: get-replication
              type: call
              call: saphana.get-replication-status
              with:
                host: "{{hana_host}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "HANA replication check: {{hana_host}}"
                category: database
                description: "Replication status: {{get-replication.status}}, Lag: {{get-replication.lag_seconds}}s"
            - name: notify-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.dba_team_id"
                channel_id: "$secrets.dba_alerts_channel_id"
                text: "HANA replication on {{hana_host}}: Status={{get-replication.status}}, Lag={{get-replication.lag_seconds}}s. SNOW: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: saphana
      baseUri: "https://deloitte-hana.sap.com/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_hana_user"
        password: "$secrets.sap_hana_password"
      resources:
        - name: replication
          path: "/system/replication/{{host}}"
          inputParameters:
            - name: host
              in: path
          operations:
            - name: get-replication-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an invoice is posted in SAP, validates the amount against the purchase order, updates the ServiceNow finance ticket, and notifies the approver via Teams.

naftiko: "0.5"
info:
  label: "SAP Invoice Approval to Teams Notification"
  description: "When an invoice is posted in SAP, validates the amount against the purchase order, updates the ServiceNow finance ticket, and notifies the approver via Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-invoices
      port: 8080
      tools:
        - name: process-invoice-approval
          description: "Given a SAP invoice document number, validate against PO, update finance ticket, and notify the approver."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: sap.get-invoice
              with:
                doc_number: "{{invoice_number}}"
            - name: validate-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{get-invoice.PurchaseOrder}}"
            - name: update-ticket
              type: call
              call: servicenow.update-ticket
              with:
                ticket_id: "{{get-invoice.TicketReference}}"
                state: "awaiting_approval"
                work_notes: "Invoice {{invoice_number}} for {{get-invoice.GrossAmount}} {{get-invoice.Currency}} against PO {{get-invoice.PurchaseOrder}}"
            - name: notify-approver
              type: call
              call: msteams.send-chat-message
              with:
                user_id: "{{get-invoice.ApproverEmail}}"
                text: "Invoice {{invoice_number}} requires approval: {{get-invoice.GrossAmount}} {{get-invoice.Currency}} from {{validate-po.vendor}}. PO: {{get-invoice.PurchaseOrder}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/API_SUPPLIER_INVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{doc_number}}')"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tickets
          path: "/table/incident/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: update-ticket
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{user_id}}/chats/messages"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: send-chat-message
              method: POST

Retrieves material master data from SAP S/4HANA by material number, including description, unit of measure, and material group.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number, including description, unit of measure, and material group."
  tags:
    - procurement
    - erp
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-materials
      port: 8080
      tools:
        - name: get-material
          description: "Given a SAP material number, return the material description, base unit, and material group."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material master number."
          call: sap.get-material
          with:
            material: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialName"
            - name: base_unit
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product('{{material}}')"
          inputParameters:
            - name: material
              in: path
          operations:
            - name: get-material
              method: GET

Looks up a purchase order in SAP S/4HANA by PO number and returns the header status, vendor, and total value for procurement and finance review.

naftiko: "0.5"
info:
  label: "SAP S/4HANA Purchase Order Lookup"
  description: "Looks up a purchase order in SAP S/4HANA by PO number and returns the header status, vendor, and total value for procurement and finance review."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, retrieve the PO header status, vendor name, total value, and currency from SAP S/4HANA. Use for procurement approvals and vendor payment verification."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number to look up."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_amount
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Retrieves vendor master data from SAP S/4HANA by vendor number, including company name, payment terms, and tax ID.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA by vendor number, including company name, payment terms, and tax ID."
  tags:
    - procurement
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: procurement-vendors
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, return the vendor company name, payment terms, and tax identification number."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor master number."
          call: sap.get-vendor
          with:
            vendor_id: "{{vendor_number}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: tax_id
              type: string
              mapping: "$.d.TaxNumber1"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

When a critical security alert fires in Splunk, creates a ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the security Teams channel.

naftiko: "0.5"
info:
  label: "Security Incident Escalation Workflow"
  description: "When a critical security alert fires in Splunk, creates a ServiceNow incident, pages the on-call engineer via PagerDuty, and posts to the security Teams channel."
  tags:
    - security
    - incident-response
    - splunk
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-escalation
      port: 8080
      tools:
        - name: escalate-security-incident
          description: "Given a Splunk alert ID, create a ServiceNow incident, page on-call, and notify the security team in Teams."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Splunk alert ID triggering the escalation."
            - name: severity
              in: body
              type: string
              description: "Incident severity (P1, P2, P3)."
          steps:
            - name: get-alert
              type: call
              call: splunk.get-alert
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Security Alert: {{get-alert.title}}"
                category: security_incident
                priority: "{{severity}}"
                description: "{{get-alert.description}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "$secrets.pagerduty_security_service_id"
                title: "Security Alert: {{get-alert.title}}"
                urgency: high
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.security_team_id"
                channel_id: "$secrets.security_incidents_channel_id"
                text: "SECURITY ALERT [{{severity}}]: {{get-alert.title}}. SNOW: {{create-incident.number}}, PagerDuty: {{page-oncall.incident.id}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.deloitte.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: alerts
          path: "/alerts/fired_alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks the ServiceNow change calendar for a specified date range to identify scheduled changes and potential conflicts.

naftiko: "0.5"
info:
  label: "ServiceNow Change Calendar Check"
  description: "Checks the ServiceNow change calendar for a specified date range to identify scheduled changes and potential conflicts."
  tags:
    - it
    - change-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: change-calendar
      port: 8080
      tools:
        - name: check-change-calendar
          description: "Given a date range, return all scheduled changes from ServiceNow to identify conflicts."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date (ISO 8601)."
            - name: end_date
              in: body
              type: string
              description: "End date (ISO 8601)."
          call: servicenow.get-changes
          with:
            start: "{{start_date}}"
            end: "{{end_date}}"
          outputParameters:
            - name: changes
              type: array
              mapping: "$.result"
            - name: count
              type: integer
              mapping: "$.result.length"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=start_dateBETWEEN{{start}}@{{end}}"
          inputParameters:
            - name: start
              in: query
            - name: end
              in: query
          operations:
            - name: get-changes
              method: GET

Retrieves a configuration item from the ServiceNow CMDB by name, returning its class, status, owner, and environment.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Lookup"
  description: "Retrieves a configuration item from the ServiceNow CMDB by name, returning its class, status, owner, and environment."
  tags:
    - it
    - asset-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-cmdb
      port: 8080
      tools:
        - name: get-ci
          description: "Given a CI name, return its class, operational status, assigned owner, and environment from the ServiceNow CMDB."
          inputParameters:
            - name: ci_name
              in: body
              type: string
              description: "Configuration item name."
          call: servicenow.get-ci
          with:
            name: "{{ci_name}}"
          outputParameters:
            - name: sys_class_name
              type: string
              mapping: "$.result[0].sys_class_name"
            - name: operational_status
              type: string
              mapping: "$.result[0].operational_status"
            - name: assigned_to
              type: string
              mapping: "$.result[0].assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci?sysparm_query=name={{name}}"
          inputParameters:
            - name: name
              in: query
          operations:
            - name: get-ci
              method: GET

Looks up a ServiceNow incident by number and returns its current state, priority, assigned group, and short description.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Looks up a ServiceNow incident by number and returns its current state, priority, assigned group, and short description."
  tags:
    - it
    - incident-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-incidents
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, retrieve the incident state, priority, assigned group, and short description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g., INC0012345)."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.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={{number}}"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Submits a ServiceNow change request for a planned IT system change, assigns it to the CAB, and posts the request details to the IT governance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow IT Change Request Workflow"
  description: "Submits a ServiceNow change request for a planned IT system change, assigns it to the CAB, and posts the request details to the IT governance Microsoft Teams channel."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, risk level, and planned maintenance window, create a ServiceNow change request for CAB approval and notify the IT governance Microsoft Teams channel."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the planned IT change."
            - name: change_type
              in: body
              type: string
              description: "Type of change: standard, normal, or emergency."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start time in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned change end time in ISO 8601 format."
          steps:
            - name: create-cr
              type: call
              call: servicenow.create-change-request
              with:
                type: "{{change_type}}"
                risk: "{{risk_level}}"
                short_description: "{{short_description}}"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
            - name: notify-it-governance
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_it_governance_team_id"
                channel_id: "$secrets.teams_cab_channel_id"
                text: "Change request submitted: {{short_description}} | Type: {{change_type}} | Risk: {{risk_level}} | Window: {{planned_start}} to {{planned_end}} | SNOW: {{create-cr.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Monitors ServiceNow tickets for SLA breaches and escalates overdue tickets by updating priority and notifying the IT service delivery manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "Monitors ServiceNow tickets for SLA breaches and escalates overdue tickets by updating priority and notifying the IT service delivery manager in Microsoft Teams."
  tags:
    - itsm
    - sla
    - servicenow
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: sla-management
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given a ServiceNow incident number that has breached its SLA and breach duration, update the ticket priority and notify the IT service delivery manager in Microsoft Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number that has breached its SLA."
            - name: breach_minutes
              in: body
              type: integer
              description: "Number of minutes the SLA has been exceeded."
            - name: it_manager_upn
              in: body
              type: string
              description: "Microsoft 365 UPN of the IT service delivery manager."
          steps:
            - name: escalate-ticket
              type: call
              call: servicenow.update-incident
              with:
                number: "{{incident_number}}"
                priority: 1
                assigned_group: IT_Service_Delivery
                work_notes: "SLA breached by {{breach_minutes}} minutes. Escalated to service delivery."
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{it_manager_upn}}"
                text: "SLA breach: {{incident_number}} is {{breach_minutes}}min overdue. Priority escalated and reassigned."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: update-incident
              method: PATCH
    - type: http
      namespace: msteams
      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

Searches for documents in SharePoint by keyword, returning matching file names, locations, and last modified dates.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches for documents in SharePoint by keyword, returning matching file names, locations, and last modified dates."
  tags:
    - knowledge-management
    - collaboration
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-search
      port: 8080
      tools:
        - name: search-documents
          description: "Search SharePoint for documents matching a keyword query and return file names, paths, and modification dates."
          inputParameters:
            - name: search_term
              in: body
              type: string
              description: "Keyword to search for in SharePoint documents."
          call: sharepoint.search
          with:
            query: "{{search_term}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/search/query"
          operations:
            - name: search
              method: POST

Scans Snowflake metadata to identify tables with PII columns, creates a governance report in Confluence, and alerts the data privacy team in Teams.

naftiko: "0.5"
info:
  label: "Snowflake Data Governance Scan"
  description: "Scans Snowflake metadata to identify tables with PII columns, creates a governance report in Confluence, and alerts the data privacy team in Teams."
  tags:
    - data-governance
    - privacy
    - snowflake
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: run-governance-scan
          description: "Scan Snowflake metadata for PII columns, publish findings, and notify the privacy team."
          inputParameters:
            - name: database_name
              in: body
              type: string
              description: "Snowflake database to scan."
          steps:
            - name: scan-metadata
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT table_name, column_name, data_type FROM {{database_name}}.information_schema.columns WHERE column_name ILIKE ANY ('%email%','%ssn%','%phone%','%address%','%dob%')"
                warehouse: "GOVERNANCE_WH"
            - name: publish-report
              type: call
              call: confluence.create-page
              with:
                spaceKey: GOVERNANCE
                title: "PII Scan Report - {{database_name}}"
                body: "Found {{scan-metadata.row_count}} potential PII columns in {{database_name}}."
            - name: notify-privacy
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.privacy_team_id"
                channel_id: "$secrets.privacy_alerts_channel_id"
                text: "Data governance scan complete for {{database_name}}: {{scan-metadata.row_count}} potential PII columns identified. Report: {{publish-report.url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Runs row count and null rate data quality checks on core Snowflake reporting tables and creates a Jira data quality bug when tables fail validation thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Check"
  description: "Runs row count and null rate data quality checks on core Snowflake reporting tables and creates a Jira data quality bug when tables fail validation thresholds."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table name, expected minimum row count, and check date, run the validation and open a Jira bug if the table fails the quality threshold."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name (e.g. PROD.BILLING.ENGAGEMENT_REVENUE)."
            - name: expected_min_rows
              in: body
              type: integer
              description: "Minimum expected row count for the quality check to pass."
            - name: check_date
              in: body
              type: string
              description: "ISO 8601 date for the data partition being checked."
          steps:
            - name: check-row-count
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT COUNT(*) as row_count FROM {{table_name}} WHERE DATE(created_at) = '{{check_date}}'"
            - name: raise-quality-bug
              type: call
              call: jira.create-issue
              with:
                project_key: DATA
                issuetype: Bug
                summary: "Data quality failure: {{table_name}} on {{check_date}}"
                description: "Row count: {{check-row-count.row_count}}, below minimum {{expected_min_rows}} for date {{check_date}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Executes a read-only SQL query against the Snowflake data warehouse and returns the result set for analytics and reporting.

naftiko: "0.5"
info:
  label: "Snowflake Query Execution"
  description: "Executes a read-only SQL query against the Snowflake data warehouse and returns the result set for analytics and reporting."
  tags:
    - data
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: data-queries
      port: 8080
      tools:
        - name: run-query
          description: "Execute a read-only SQL query on Snowflake and return the result set. Only SELECT statements are permitted."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "SQL SELECT statement to execute."
            - name: warehouse
              in: body
              type: string
              description: "Snowflake warehouse to use for the query."
          call: snowflake.execute-query
          with:
            statement: "{{sql_statement}}"
            warehouse: "{{warehouse}}"
          outputParameters:
            - name: row_count
              type: integer
              mapping: "$.resultSetMetaData.numRows"
            - name: data
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for workforce utilisation and billing metrics and writes a weekly analytics snapshot for Deloitte's resource planning and finance leadership.

naftiko: "0.5"
info:
  label: "Snowflake Workforce Analytics Snapshot"
  description: "Queries Snowflake for workforce utilisation and billing metrics and writes a weekly analytics snapshot for Deloitte's resource planning and finance leadership."
  tags:
    - analytics
    - hr
    - snowflake
    - reporting
    - resource-planning
capability:
  exposes:
    - type: mcp
      namespace: workforce-analytics
      port: 8080
      tools:
        - name: snapshot-workforce-utilisation
          description: "Given a week ending date, query Snowflake for billable utilisation rates and project staffing across practices, then store the analytics snapshot for resource planning dashboards."
          inputParameters:
            - name: week_ending_date
              in: body
              type: string
              description: "ISO 8601 date for the workforce analytics snapshot."
          call: snowflake.execute-query
          with:
            statement: "INSERT INTO workforce_utilisation_snapshots SELECT '{{week_ending_date}}' as week_ending, practice, COUNT(DISTINCT employee_id) as headcount, AVG(billable_hours / total_hours) as utilisation_rate FROM staffing_data WHERE week_ending = '{{week_ending_date}}' GROUP BY practice"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Executes a Splunk search query and returns matching log events for incident investigation and troubleshooting.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Executes a Splunk search query and returns matching log events for incident investigation and troubleshooting."
  tags:
    - security
    - observability
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: security-logs
      port: 8080
      tools:
        - name: search-logs
          description: "Execute a Splunk search query over a specified time range and return matching events."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Splunk search query string."
            - name: earliest_time
              in: body
              type: string
              description: "Earliest time for search range (e.g., -24h)."
          call: splunk.create-search
          with:
            search: "{{search_query}}"
            earliest_time: "{{earliest_time}}"
          outputParameters:
            - name: sid
              type: string
              mapping: "$.sid"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.deloitte.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Compiles sprint metrics from Jira, collects team feedback, generates a retrospective summary in Confluence, and posts highlights to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Sprint Retrospective Digest Orchestration"
  description: "Compiles sprint metrics from Jira, collects team feedback, generates a retrospective summary in Confluence, and posts highlights to the engineering Teams channel."
  tags:
    - engineering
    - agile
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agile-retro
      port: 8080
      tools:
        - name: generate-retro-digest
          description: "Given a Jira sprint ID, compile metrics, create a Confluence retro page, and post highlights."
          inputParameters:
            - name: sprint_id
              in: body
              type: string
              description: "Jira sprint ID."
            - name: board_id
              in: body
              type: string
              description: "Jira board ID."
          steps:
            - name: get-sprint-report
              type: call
              call: jira.get-sprint-report
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: create-retro-page
              type: call
              call: confluence.create-page
              with:
                spaceKey: ENG
                title: "Sprint {{sprint_id}} Retrospective"
                body: "Completed: {{get-sprint-report.completedIssues.length}}, Incomplete: {{get-sprint-report.incompleteIssues.length}}, Velocity: {{get-sprint-report.velocity}}"
            - name: post-highlights
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.eng_team_id"
                channel_id: "$secrets.eng_retro_channel_id"
                text: "Sprint {{sprint_id}} retro: {{get-sprint-report.completedIssues.length}} completed, {{get-sprint-report.incompleteIssues.length}} carried over. Full report: {{create-retro-page.url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Triggers a data extract refresh for a specified Tableau workbook to ensure dashboards display current data.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Refresh Trigger"
  description: "Triggers a data extract refresh for a specified Tableau workbook to ensure dashboards display current data."
  tags:
    - analytics
    - reporting
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: analytics-dashboards
      port: 8080
      tools:
        - name: refresh-workbook
          description: "Trigger a data extract refresh for a Tableau workbook by ID."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "Tableau workbook ID to refresh."
          call: tableau.refresh-workbook
          with:
            workbook_id: "{{workbook_id}}"
          outputParameters:
            - name: job_id
              type: string
              mapping: "$.job.id"
            - name: status
              type: string
              mapping: "$.job.status"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.deloitte.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/$secrets.tableau_site_id/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST

Syncs talent pipeline data from LinkedIn Recruiter to Workday Recruiting, creates a Jira intake ticket, and posts a weekly digest to the HR Teams channel.

naftiko: "0.5"
info:
  label: "Talent Acquisition Pipeline Sync"
  description: "Syncs talent pipeline data from LinkedIn Recruiter to Workday Recruiting, creates a Jira intake ticket, and posts a weekly digest to the HR Teams channel."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-pipeline
      port: 8080
      tools:
        - name: sync-talent-pipeline
          description: "Pull candidate data from LinkedIn, sync to Workday Recruiting, create intake tickets, and post digest."
          inputParameters:
            - name: job_posting_id
              in: body
              type: string
              description: "LinkedIn job posting ID."
            - name: workday_requisition_id
              in: body
              type: string
              description: "Workday job requisition ID."
          steps:
            - name: get-linkedin-candidates
              type: call
              call: linkedin.get-applicants
              with:
                job_id: "{{job_posting_id}}"
            - name: sync-to-workday
              type: call
              call: workday.create-candidates
              with:
                requisition_id: "{{workday_requisition_id}}"
                candidates: "{{get-linkedin-candidates.elements}}"
            - name: create-intake-ticket
              type: call
              call: jira.create-issue
              with:
                project: TALENT
                issuetype: Task
                summary: "Review {{get-linkedin-candidates.total}} new candidates for req {{workday_requisition_id}}"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.hr_team_id"
                channel_id: "$secrets.recruiting_channel_id"
                text: "Talent pipeline sync: {{get-linkedin-candidates.total}} candidates from LinkedIn synced to Workday req {{workday_requisition_id}}. Intake: {{create-intake-ticket.key}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: applicants
          path: "/jobPostings/{{job_id}}/applicants"
          inputParameters:
            - name: job_id
              in: path
          operations:
            - name: get-applicants
              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: candidates
          path: "/recruiting/candidates/bulk"
          operations:
            - name: create-candidates
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://deloitte.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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new vendor is approved, creates the vendor master in SAP, sets up a Salesforce partner account, creates a ServiceNow request, and notifies procurement via Teams.

naftiko: "0.5"
info:
  label: "Vendor Onboarding Orchestration"
  description: "When a new vendor is approved, creates the vendor master in SAP, sets up a Salesforce partner account, creates a ServiceNow request, and notifies procurement via Teams."
  tags:
    - procurement
    - vendor-management
    - sap
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-onboarding
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create vendor master records across SAP and Salesforce, open a ServiceNow ticket, and notify procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "Vendor company name."
            - name: vendor_tax_id
              in: body
              type: string
              description: "Vendor tax identification number."
            - name: payment_terms
              in: body
              type: string
              description: "Payment terms code."
          steps:
            - name: create-sap-vendor
              type: call
              call: sap.create-supplier
              with:
                SupplierName: "{{vendor_name}}"
                TaxNumber1: "{{vendor_tax_id}}"
                PaymentTerms: "{{payment_terms}}"
            - name: create-sf-partner
              type: call
              call: salesforce.create-account
              with:
                Name: "{{vendor_name}}"
                Type: Partner
                TaxId__c: "{{vendor_tax_id}}"
            - name: create-snow-request
              type: call
              call: servicenow.create-request
              with:
                short_description: "Vendor onboarding: {{vendor_name}}"
                category: procurement
                assigned_group: Vendor_Management
            - name: notify-procurement
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.procurement_team_id"
                channel_id: "$secrets.procurement_channel_id"
                text: "New vendor onboarded: {{vendor_name}}. SAP: {{create-sap-vendor.SupplierNumber}}, Salesforce: {{create-sf-partner.id}}, SNOW: {{create-snow-request.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://deloitte-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Aggregates KPIs from Salesforce pipeline, Workday headcount, Snowflake financial metrics, and Datadog service health into a weekly executive Power BI dashboard refresh.

naftiko: "0.5"
info:
  label: "Weekly Executive Dashboard Orchestration"
  description: "Aggregates KPIs from Salesforce pipeline, Workday headcount, Snowflake financial metrics, and Datadog service health into a weekly executive Power BI dashboard refresh."
  tags:
    - executive
    - reporting
    - salesforce
    - workday
    - snowflake
    - datadog
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: executive-reporting
      port: 8080
      tools:
        - name: refresh-executive-dashboard
          description: "Compile weekly KPIs from multiple sources and refresh the executive Power BI dashboard."
          inputParameters:
            - name: report_week
              in: body
              type: string
              description: "ISO week for the report."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce.get-pipeline-summary
              with:
                week: "{{report_week}}"
            - name: get-headcount
              type: call
              call: workday.get-org-headcount
              with: {}
            - name: get-financials
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM executive.weekly_kpis WHERE report_week = '{{report_week}}'"
                warehouse: "EXECUTIVE_WH"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                group_id: "$secrets.executive_workspace_id"
                dataset_id: "$secrets.executive_dashboard_dataset_id"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://deloitte.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: pipeline
          path: "/query?q=SELECT+SUM(Amount),StageName+FROM+Opportunity+GROUP+BY+StageName"
          operations:
            - name: get-pipeline-summary
              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: headcount
          path: "/workers/count"
          operations:
            - name: get-org-headcount
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Launches the annual compensation review cycle by pulling market data from Snowflake, initiating Workday compensation events, refreshing the HR Power BI dashboard, and notifying HR leadership.

naftiko: "0.5"
info:
  label: "Workday Annual Compensation Cycle Orchestration"
  description: "Launches the annual compensation review cycle by pulling market data from Snowflake, initiating Workday compensation events, refreshing the HR Power BI dashboard, and notifying HR leadership."
  tags:
    - hr
    - compensation
    - workday
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-comp-cycle
      port: 8080
      tools:
        - name: launch-comp-cycle
          description: "Initiate annual compensation review with market data and notify HR leadership."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year for the compensation cycle."
          steps:
            - name: get-market-data
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM hr.market_compensation_benchmarks WHERE fiscal_year = '{{fiscal_year}}'"
                warehouse: "HR_WH"
            - name: initiate-cycle
              type: call
              call: workday.create-comp-event
              with:
                fiscal_year: "{{fiscal_year}}"
                type: annual_review
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                group_id: "$secrets.hr_workspace_id"
                dataset_id: "$secrets.comp_review_dataset_id"
            - name: notify-hr
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.hr_team_id"
                channel_id: "$secrets.hr_comp_channel_id"
                text: "Annual compensation cycle for FY{{fiscal_year}} launched. Market benchmarks loaded ({{get-market-data.row_count}} records). Workday event: {{initiate-cycle.event_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: comp-events
          path: "/compensation/events"
          operations:
            - name: create-comp-event
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves an employee's current benefits enrollment status from Workday, including health plan, dental, and vision selections.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Lookup"
  description: "Retrieves an employee's current benefits enrollment status from Workday, including health plan, dental, and vision selections."
  tags:
    - hr
    - benefits
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: get-benefits
          description: "Given a Workday employee ID, return their current health, dental, and vision benefit elections."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-benefits
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: health_plan
              type: string
              mapping: "$.benefits.healthPlan"
            - name: dental_plan
              type: string
              mapping: "$.benefits.dentalPlan"
            - name: vision_plan
              type: string
              mapping: "$.benefits.visionPlan"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/workers/{{worker_id}}/benefits"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-benefits
              method: GET

Retrieves the current compensation details for a given employee from Workday, including base salary, bonus target, and pay grade.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Lookup"
  description: "Retrieves the current compensation details for a given employee from Workday, including base salary, bonus target, and pay grade."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-compensation-details
          description: "Given a Workday employee ID, return their current base salary, bonus target percentage, and pay grade from Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-compensation
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: base_salary
              type: string
              mapping: "$.compensation.baseSalary"
            - name: bonus_target
              type: string
              mapping: "$.compensation.bonusTarget"
            - name: pay_grade
              type: string
              mapping: "$.compensation.payGrade"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{worker_id}}/compensation"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-compensation
              method: GET

When an employee is terminated in Workday, disables their Microsoft 365 account, resolves their open ServiceNow tickets, and notifies the IT security team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Employee Offboarding"
  description: "When an employee is terminated in Workday, disables their Microsoft 365 account, resolves their open ServiceNow tickets, and notifies the IT security team in Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - microsoft-365
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: execute-employee-offboarding
          description: "Given a Workday employee ID and Microsoft 365 UPN, disable the M365 account, create a ServiceNow offboarding task, and notify IT security in Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the terminated employee."
            - name: upn
              in: body
              type: string
              description: "Microsoft 365 user principal name of the terminated employee."
          steps:
            - name: disable-m365-account
              type: call
              call: msgraph.disable-user
              with:
                user_id: "{{upn}}"
                accountEnabled: false
            - name: create-offboarding-task
              type: call
              call: servicenow.create-task
              with:
                category: hr_offboarding
                short_description: "Offboarding: {{upn}}"
                assigned_group: IT_Security
            - name: notify-security
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_security_team_id"
                channel_id: "$secrets.teams_security_channel_id"
                text: "Employee offboarded: {{upn}} (Workday: {{workday_employee_id}}) | M365 disabled | SNOW: {{create-offboarding-task.number}}"
  consumes:
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://deloitte.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the organizational hierarchy for a specified employee from Workday, including manager, department, and cost center.

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves the organizational hierarchy for a specified employee from Workday, including manager, department, and cost center."
  tags:
    - hr
    - organization
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-org
      port: 8080
      tools:
        - name: get-org-hierarchy
          description: "Given a Workday employee ID, return their manager, department, and cost center."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-worker-org
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: manager
              type: string
              mapping: "$.manager.displayName"
            - name: department
              type: string
              mapping: "$.department"
            - name: cost_center
              type: string
              mapping: "$.costCenter"
  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}}/organizationInfo"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker-org
              method: GET

Pulls active headcount from Workday by practice and cost center and writes the snapshot to Snowflake for finance planning and payroll reconciliation.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Pulls active headcount from Workday by practice and cost center and writes the snapshot to Snowflake for finance planning and payroll reconciliation."
  tags:
    - hr
    - finance
    - workday
    - snowflake
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: payroll-reporting
      port: 8080
      tools:
        - name: snapshot-payroll-headcount
          description: "Retrieve active employees from Workday segmented by practice and cost center, then write the periodic headcount snapshot to Snowflake for finance planning and payroll reconciliation."
          inputParameters:
            - name: snapshot_date
              in: body
              type: string
              description: "ISO 8601 date for the payroll headcount snapshot."
          steps:
            - name: get-workers
              type: call
              call: workday.list-workers
              with:
                effective_date: "{{snapshot_date}}"
                employment_status: active
            - name: store-snapshot
              type: call
              call: snowflake.execute-query
              with:
                statement: "INSERT INTO headcount_snapshots (snapshot_date, total_headcount) VALUES ('{{snapshot_date}}', {{get-workers.total_results}})"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: effective_date
              in: query
            - name: employment_status
              in: query
          operations:
            - name: list-workers
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://deloitte.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a new headcount requisition is approved in Workday, creates a Jira recruiting task and notifies the talent acquisition team in Microsoft Teams to start the hiring process.

naftiko: "0.5"
info:
  label: "Workday Position Approval for Recruiting"
  description: "When a new headcount requisition is approved in Workday, creates a Jira recruiting task and notifies the talent acquisition team in Microsoft Teams to start the hiring process."
  tags:
    - hr
    - recruiting
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: activate-recruiting-position
          description: "Given a Workday position requisition ID, job title, and practice area, create a Jira recruiting task and notify the talent acquisition Microsoft Teams channel to begin sourcing."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday position requisition ID."
            - name: job_title
              in: body
              type: string
              description: "Job title for the open position."
            - name: practice_area
              in: body
              type: string
              description: "Deloitte practice area requesting the headcount."
          steps:
            - name: create-recruiting-task
              type: call
              call: jira.create-issue
              with:
                project_key: HR
                issuetype: Task
                summary: "Recruiting: {{job_title}} — {{practice_area}}"
                description: "Position requisition {{requisition_id}} approved. Begin sourcing for {{job_title}} in {{practice_area}}."
            - name: notify-ta-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.teams_hr_team_id"
                channel_id: "$secrets.teams_ta_channel_id"
                text: "New position to fill: {{job_title}} in {{practice_area}} | Jira: {{create-recruiting-task.key}} | Workday req: {{requisition_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://deloitte.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_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/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current time off balance for an employee from Workday, including vacation, sick, and personal days remaining.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves the current time off balance for an employee from Workday, including vacation, sick, and personal days remaining."
  tags:
    - hr
    - time-off
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-timeoff
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given a Workday employee ID, return their remaining vacation, sick, and personal time off balances."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-timeoff-balance
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: vacation_balance
              type: number
              mapping: "$.timeOffBalances[0].balance"
            - name: sick_balance
              type: number
              mapping: "$.timeOffBalances[1].balance"
            - name: personal_balance
              type: number
              mapping: "$.timeOffBalances[2].balance"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: timeoff
          path: "/workers/{{worker_id}}/timeOffBalances"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-timeoff-balance
              method: GET

Enriches a company record with firmographic data from ZoomInfo, including employee count, revenue, and industry classification.

naftiko: "0.5"
info:
  label: "ZoomInfo Company Enrichment"
  description: "Enriches a company record with firmographic data from ZoomInfo, including employee count, revenue, and industry classification."
  tags:
    - sales
    - data-enrichment
    - zoominfo
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-company
          description: "Given a company name or domain, return ZoomInfo firmographic data including revenue, employee count, and industry."
          inputParameters:
            - name: company_domain
              in: body
              type: string
              description: "Company website domain to look up."
          call: zoominfo.enrich-company
          with:
            domain: "{{company_domain}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.data[0].name"
            - name: employee_count
              type: integer
              mapping: "$.data[0].employeeCount"
            - name: revenue
              type: string
              mapping: "$.data[0].revenue"
            - name: industry
              type: string
              mapping: "$.data[0].industry"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/enrich/company"
          operations:
            - name: enrich-company
              method: POST