KPMG Capabilities

Naftiko 0.5 capability definitions for KPMG - 106 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Tests accounts receivable balances by extracting AR aging from SAP, selecting confirmation samples in Databricks, generating letters in SharePoint, and tracking responses in Salesforce.

naftiko: "0.5"
info:
  label: "Accounts Receivable Confirmation Pipeline"
  description: "Tests accounts receivable balances by extracting AR aging from SAP, selecting confirmation samples in Databricks, generating letters in SharePoint, and tracking responses in Salesforce."
  tags:
    - audit
    - accounts-receivable
    - sap
    - azure-databricks
    - sharepoint
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: ar-confirmation
      port: 8080
      tools:
        - name: test-ar-balances
          description: "Test accounts receivable balances through confirmation procedures."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement ID."
            - name: cutoff_date
              in: body
              type: string
              description: "AR cutoff date."
          steps:
            - name: extract-ar-aging
              type: call
              call: "sap.get-ar-aging"
              with:
                cutoff_date: "{{cutoff_date}}"
            - name: select-sample
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM ar_sampling WHERE engagement_id = '{{engagement_id}}' AND cutoff_date = '{{cutoff_date}}'"
            - name: generate-confirmation-letters
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/ARConfirmations"
                template: "ar_confirmation_letters"
            - name: create-tracking-records
              type: call
              call: "salesforce.bulk-create"
              with:
                object: "AuditConfirmation__c"
                records: "{{select-sample.sampled_customers}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: ar
          path: "/FI_SRV/ARaging"
          operations:
            - name: get-ar-aging
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: bulk
          path: "/composite/sobjects"
          operations:
            - name: bulk-create
              method: POST

Retrieves a payroll summary from ADP Workforce Now by company code and pay period, returning gross pay, net pay, tax withholdings, and employee count. Used by audit and HR advisory teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Summary Lookup"
  description: "Retrieves a payroll summary from ADP Workforce Now by company code and pay period, returning gross pay, net pay, tax withholdings, and employee count. Used by audit and HR advisory teams."
  tags:
    - hr
    - payroll
    - adp
    - audit
capability:
  exposes:
    - type: mcp
      namespace: payroll-audit
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Look up an ADP payroll summary by company code and pay period."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The ADP company code."
            - name: pay_period
              in: body
              type: string
              description: "The pay period identifier (e.g., 2026-03-15)."
          call: "adp.get-payroll"
          with:
            company_code: "{{company_code}}"
            pay_period: "{{pay_period}}"
          outputParameters:
            - name: gross_pay
              type: string
              mapping: "$.payrollSummary.grossPay.amount"
            - name: net_pay
              type: string
              mapping: "$.payrollSummary.netPay.amount"
            - name: tax_withholdings
              type: string
              mapping: "$.payrollSummary.taxWithholdings.amount"
            - name: employee_count
              type: string
              mapping: "$.payrollSummary.employeeCount"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/companies/{{company_code}}/payroll-summaries/{{pay_period}}"
          inputParameters:
            - name: company_code
              in: path
            - name: pay_period
              in: path
          operations:
            - name: get-payroll
              method: GET

Triggers an Alteryx Server workflow by workflow ID and returns the job execution status. Used by audit analytics and data teams to run analytical procedures on demand.

naftiko: "0.5"
info:
  label: "Alteryx Analytics Workflow Trigger"
  description: "Triggers an Alteryx Server workflow by workflow ID and returns the job execution status. Used by audit analytics and data teams to run analytical procedures on demand."
  tags:
    - analytics
    - alteryx
    - audit
    - data-processing
capability:
  exposes:
    - type: mcp
      namespace: audit-analytics-alteryx
      port: 8080
      tools:
        - name: trigger-alteryx-workflow
          description: "Trigger an Alteryx Server workflow, log the execution in Jira, and notify the audit analytics team via Microsoft Teams."
          inputParameters:
            - name: workflow_id
              in: body
              type: string
              description: "The Alteryx Server workflow ID."
            - name: engagement_code
              in: body
              type: string
              description: "The audit engagement code."
            - name: analyst_email
              in: body
              type: string
              description: "Email of the requesting analyst."
          steps:
            - name: run-workflow
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "{{workflow_id}}"
            - name: log-execution
              type: call
              call: "jira.create-issue"
              with:
                project_key: "AUDITANA"
                issue_type: "Task"
                summary: "Alteryx workflow {{workflow_id}} executed — {{engagement_code}}"
                description: "Job ID: {{run-workflow.id}}. Status: {{run-workflow.status}}. Analyst: {{analyst_email}}."
            - name: notify-analyst
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{analyst_email}}"
                text: "Alteryx workflow {{workflow_id}} triggered. Job: {{run-workflow.id}}. Status: {{run-workflow.status}}. Jira: {{log-execution.key}}."
  consumes:
    - type: http
      namespace: alteryx
      baseUri: "https://alteryx.kpmg.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/jobs"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Triggers an Alteryx data quality profiling workflow for a client dataset, returning completeness, uniqueness, and validity metrics for audit evidence.

naftiko: "0.5"
info:
  label: "Alteryx Data Quality Profiling Lookup"
  description: "Triggers an Alteryx data quality profiling workflow for a client dataset, returning completeness, uniqueness, and validity metrics for audit evidence."
  tags:
    - data-analytics
    - audit
    - alteryx
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: get-data-quality-profile
          description: "Trigger an Alteryx data quality profiling job for a specified dataset. Returns completeness, uniqueness, and validity scores."
          inputParameters:
            - name: workflow_id
              in: body
              type: string
              description: "The Alteryx workflow identifier for data profiling."
            - name: dataset_name
              in: body
              type: string
              description: "Name of the client dataset to profile."
          call: "alteryx.trigger-workflow"
          with:
            workflow_id: "{{workflow_id}}"
            parameters:
              dataset: "{{dataset_name}}"
          outputParameters:
            - name: completeness_score
              type: number
              mapping: "$.results.completeness"
            - name: uniqueness_score
              type: number
              mapping: "$.results.uniqueness"
            - name: validity_score
              type: number
              mapping: "$.results.validity"
            - name: record_count
              type: number
              mapping: "$.results.totalRecords"
  consumes:
    - type: http
      namespace: alteryx
      baseUri: "https://kpmg.alteryxcloud.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/jobs"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: trigger-workflow
              method: POST

Screens a batch of financial transactions against Dow Jones watchlists, logs flagged transactions in ServiceNow for investigation, creates Jira case tasks for compliance analysts, and notifies the AML officer via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Anti-Money Laundering Transaction Screening"
  description: "Screens a batch of financial transactions against Dow Jones watchlists, logs flagged transactions in ServiceNow for investigation, creates Jira case tasks for compliance analysts, and notifies the AML officer via Microsoft Teams."
  tags:
    - compliance
    - aml
    - financial-crime
    - dow-jones
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: aml-screening
      port: 8080
      tools:
        - name: screen-transactions
          description: "Given a transaction batch ID and AML officer email, screen transactions against Dow Jones, log flagged items in ServiceNow, create Jira investigation tasks, and notify the officer."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The transaction batch identifier."
            - name: client_entity_id
              in: body
              type: string
              description: "The client entity under screening."
            - name: aml_officer_email
              in: body
              type: string
              description: "Email of the AML compliance officer."
          steps:
            - name: screen-batch
              type: call
              call: "dowjones.screen-transactions"
              with:
                batch_id: "{{batch_id}}"
                entity_id: "{{client_entity_id}}"
            - name: log-flagged-transactions
              type: call
              call: "servicenow.create-aml-case"
              with:
                short_description: "AML flags: Batch {{batch_id}} — {{screen-batch.flagged_count}} transactions"
                description: "Entity: {{client_entity_id}}. Flagged: {{screen-batch.flagged_count}}. Highest risk: {{screen-batch.max_risk_score}}. Categories: {{screen-batch.categories}}."
                assigned_group: "AML_Investigations"
            - name: create-investigation-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "AMLOPS"
                issue_type: "Task"
                summary: "Investigate: AML flags batch {{batch_id}} — {{screen-batch.flagged_count}} hits"
                description: "ServiceNow case: {{log-flagged-transactions.number}}. Entity: {{client_entity_id}}. Max risk: {{screen-batch.max_risk_score}}."
            - name: notify-officer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{aml_officer_email}}"
                text: "AML Alert: Batch {{batch_id}} flagged {{screen-batch.flagged_count}} transactions. Max risk: {{screen-batch.max_risk_score}}. ServiceNow: {{log-flagged-transactions.number}}. Jira: {{create-investigation-task.key}}."
  consumes:
    - type: http
      namespace: dowjones
      baseUri: "https://api.dowjones.com/riskandcompliance/v1"
      authentication:
        type: bearer
        token: "$secrets.dowjones_token"
      resources:
        - name: transaction-screening
          path: "/transactions/screen"
          operations:
            - name: screen-transactions
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: aml-cases
          path: "/table/sn_grc_case"
          operations:
            - name: create-aml-case
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Manages audit confirmation workflows by generating confirmation letters in SharePoint, tracking responses in Salesforce, creating follow-up tasks in Jira, and alerting the audit team on non-responses.

naftiko: "0.5"
info:
  label: "Audit Confirmation Workflow Orchestrator"
  description: "Manages audit confirmation workflows by generating confirmation letters in SharePoint, tracking responses in Salesforce, creating follow-up tasks in Jira, and alerting the audit team on non-responses."
  tags:
    - audit
    - confirmations
    - sharepoint
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: confirmations
      port: 8080
      tools:
        - name: manage-confirmations
          description: "Manage audit confirmation letter workflow."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier."
            - name: confirmation_type
              in: body
              type: string
              description: "Confirmation type (bank, AR, AP, legal)."
            - name: audit_team_email
              in: body
              type: string
              description: "Audit team email."
          steps:
            - name: generate-letters
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/Confirmations/{{confirmation_type}}"
                template: "confirmation_letter_{{confirmation_type}}"
            - name: track-responses
              type: call
              call: "salesforce.get-confirmation-status"
              with:
                engagement_id: "{{engagement_id}}"
                type: "{{confirmation_type}}"
            - name: create-followups
              type: call
              call: "jira.create-issue"
              with:
                project: "AUDIT"
                summary: "Confirmation follow-up: {{engagement_id}} - {{confirmation_type}}"
                description: "Sent: {{track-responses.sent_count}}. Received: {{track-responses.received_count}}. Outstanding: {{track-responses.outstanding_count}}."
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{audit_team_email}}"
                text: "Confirmation status for {{engagement_id}} ({{confirmation_type}}): {{track-responses.received_count}}/{{track-responses.sent_count}} received. {{track-responses.outstanding_count}} outstanding."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: confirmations
          path: "/sobjects/AuditConfirmation__c"
          operations:
            - name: get-confirmation-status
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

On creation of a new audit engagement in ServiceNow, provisions a SharePoint document library for workpapers, creates a Jira epic for tracking milestones, and notifies the engagement team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Audit Engagement Orchestrator"
  description: "On creation of a new audit engagement in ServiceNow, provisions a SharePoint document library for workpapers, creates a Jira epic for tracking milestones, and notifies the engagement team in Microsoft Teams."
  tags:
    - audit
    - engagement-management
    - servicenow
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: audit-engagement
      port: 8080
      tools:
        - name: provision-audit-engagement
          description: "Given an engagement ID, client name, and lead partner email, provision all supporting infrastructure for a new audit engagement across ServiceNow, SharePoint, Jira, and Microsoft Teams."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The unique engagement identifier."
            - name: client_name
              in: body
              type: string
              description: "The audit client legal entity name."
            - name: lead_partner_email
              in: body
              type: string
              description: "Email of the lead audit partner."
            - name: fiscal_year_end
              in: body
              type: string
              description: "Client fiscal year end date in YYYY-MM-DD format."
          steps:
            - name: create-engagement-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Audit engagement initiated: {{client_name}} FY {{fiscal_year_end}}"
                category: "audit_engagement"
                assigned_group: "Audit_Operations"
                description: "Engagement {{engagement_id}} for {{client_name}}. Lead partner: {{lead_partner_email}}."
            - name: provision-workpaper-library
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "audit_engagements_site"
                folder_path: "Workpapers/{{engagement_id}}_{{client_name}}"
            - name: create-audit-epic
              type: call
              call: "jira.create-issue"
              with:
                project_key: "AUDIT"
                issue_type: "Epic"
                summary: "Audit Engagement: {{client_name}} — {{engagement_id}}"
                description: "FY End: {{fiscal_year_end}}. Workpapers: {{provision-workpaper-library.url}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{lead_partner_email}}"
                text: "Audit engagement {{engagement_id}} for {{client_name}} is provisioned. Jira epic: {{create-audit-epic.key}}. Workpapers: {{provision-workpaper-library.url}}. ServiceNow: {{create-engagement-ticket.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Automates audit sampling by extracting population data from SAP, applying statistical sampling in Databricks, creating sample workpapers in SharePoint, and assigning review tasks in Jira.

naftiko: "0.5"
info:
  label: "Audit Sampling Automation Pipeline"
  description: "Automates audit sampling by extracting population data from SAP, applying statistical sampling in Databricks, creating sample workpapers in SharePoint, and assigning review tasks in Jira."
  tags:
    - audit
    - sampling
    - sap
    - azure-databricks
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: audit-sampling
      port: 8080
      tools:
        - name: generate-audit-sample
          description: "Generate a statistical audit sample from the client population."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The audit engagement identifier."
            - name: population_query
              in: body
              type: string
              description: "SQL query to extract the population."
            - name: confidence_level
              in: body
              type: number
              description: "Statistical confidence level (e.g., 95)."
          steps:
            - name: extract-population
              type: call
              call: "sap.run-query"
              with:
                query: "{{population_query}}"
            - name: generate-sample
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM population_{{engagement_id}} ORDER BY RAND() LIMIT {{extract-population.sample_size}}"
            - name: create-workpaper
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/Sampling"
                template: "audit_sample_workpaper"
            - name: assign-testing
              type: call
              call: "jira.create-issue"
              with:
                project: "AUDIT"
                summary: "Sample testing: {{engagement_id}} - {{extract-population.sample_size}} items"
                description: "Sample workpaper: {{create-workpaper.url}}. Population: {{extract-population.total_count}}. Sample: {{generate-sample.count}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: queries
          path: "/GL_SRV/JournalEntries"
          operations:
            - name: run-query
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.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

Retrieves privileged role assignments from Azure Active Directory for a client tenant, returning user principal names, role names, and assignment expiration dates.

naftiko: "0.5"
info:
  label: "Azure AD Privileged Access Review"
  description: "Retrieves privileged role assignments from Azure Active Directory for a client tenant, returning user principal names, role names, and assignment expiration dates."
  tags:
    - security
    - compliance
    - azure-active-directory
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: security-audit
      port: 8080
      tools:
        - name: get-privileged-assignments
          description: "Look up privileged role assignments in Azure AD for a client tenant. Returns users, roles, and expiration status."
          inputParameters:
            - name: tenant_id
              in: body
              type: string
              description: "The Azure AD tenant identifier for the client."
          call: "azure-ad.list-privileged-roles"
          with:
            tenant_id: "{{tenant_id}}"
          outputParameters:
            - name: assignments
              type: array
              mapping: "$.value"
              items:
                - name: user_principal_name
                  type: string
                  mapping: "$.principalName"
                - name: role_name
                  type: string
                  mapping: "$.roleDefinition.displayName"
                - name: expires_at
                  type: string
                  mapping: "$.scheduleInfo.expiration.endDateTime"
  consumes:
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: role-assignments
          path: "/roleManagement/directory/roleAssignments"
          inputParameters:
            - name: tenant_id
              in: header
          operations:
            - name: list-privileged-roles
              method: GET

Retrieves the status of an Azure Databricks job run by run ID, returning state, start time, and duration. Used by data engineering and analytics teams for pipeline monitoring.

naftiko: "0.5"
info:
  label: "Azure Databricks Job Run Status"
  description: "Retrieves the status of an Azure Databricks job run by run ID, returning state, start time, and duration. Used by data engineering and analytics teams for pipeline monitoring."
  tags:
    - data-engineering
    - azure-databricks
    - pipeline
capability:
  exposes:
    - type: mcp
      namespace: data-pipeline
      port: 8080
      tools:
        - name: get-databricks-run
          description: "Look up an Azure Databricks job run by run ID and notify the data engineering team via Microsoft Teams with the execution results."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The Databricks job run ID."
            - name: data_eng_email
              in: body
              type: string
              description: "Email of the data engineering team lead."
          steps:
            - name: fetch-run
              type: call
              call: "databricks.get-run"
              with:
                run_id: "{{run_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{data_eng_email}}"
                text: "Databricks run {{run_id}}: {{fetch-run.life_cycle_state}} / {{fetch-run.result_state}}. Duration: {{fetch-run.execution_duration}}ms."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://adb-kpmg.azuredatabricks.net/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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the status of an Azure DevOps pipeline run by organization, project, and run ID. Used by technology consulting teams for CI/CD monitoring.

naftiko: "0.5"
info:
  label: "Azure DevOps Pipeline Run Status"
  description: "Retrieves the status of an Azure DevOps pipeline run by organization, project, and run ID. Used by technology consulting teams for CI/CD monitoring."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: devops-pipeline
      port: 8080
      tools:
        - name: get-pipeline-run
          description: "Look up an Azure DevOps pipeline run and create a Jira ticket if the run failed."
          inputParameters:
            - name: organization
              in: body
              type: string
              description: "Azure DevOps organization name."
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: run_id
              in: body
              type: string
              description: "The pipeline run ID."
            - name: dev_lead_email
              in: body
              type: string
              description: "Email of the dev team lead."
          steps:
            - name: fetch-run
              type: call
              call: "azdo.get-run"
              with:
                organization: "{{organization}}"
                project: "{{project}}"
                run_id: "{{run_id}}"
            - name: log-failure
              type: call
              call: "jira.create-issue"
              with:
                project_key: "DEVOPS"
                issue_type: "Bug"
                summary: "Pipeline failure: {{fetch-run.pipeline_name}} run {{run_id}}"
                description: "State: {{fetch-run.state}}. Result: {{fetch-run.result}}. Created: {{fetch-run.createdDate}}."
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{dev_lead_email}}"
                text: "Pipeline {{fetch-run.pipeline_name}} run {{run_id}}: {{fetch-run.result}}. Jira: {{log-failure.key}}."
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/{{organization}}/{{project}}/_apis/pipelines"
      authentication:
        type: basic
        username: ""
        password: "$secrets.azdo_pat"
      inputParameters:
        - name: api-version
          in: query
          value: "7.1"
      resources:
        - name: runs
          path: "/runs/{{run_id}}"
          inputParameters:
            - name: organization
              in: path
            - name: project
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks SSL certificate expiration dates stored in Azure Key Vault for IT general controls testing.

naftiko: "0.5"
info:
  label: "Azure Key Vault Certificate Expiry Check"
  description: "Checks SSL certificate expiration dates stored in Azure Key Vault for IT general controls testing."
  tags:
    - security
    - azure-key-vault
capability:
  exposes:
    - type: mcp
      namespace: certificate-management
      port: 8080
      tools:
        - name: check-certificate-expiry
          description: "Check certificate expiration status in Azure Key Vault."
          inputParameters:
            - name: vault_name
              in: body
              type: string
              description: "The Azure Key Vault name."
            - name: cert_name
              in: body
              type: string
              description: "The certificate name."
          call: "keyvault.get-certificate"
          with:
            vault_name: "{{vault_name}}"
            cert_name: "{{cert_name}}"
          outputParameters:
            - name: expiry_date
              type: string
              mapping: "$.attributes.expires"
            - name: enabled
              type: boolean
              mapping: "$.attributes.enabled"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://{{vault_name}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: certificates
          path: "/certificates/{{cert_name}}?api-version=7.4"
          inputParameters:
            - name: cert_name
              in: path
          operations:
            - name: get-certificate
              method: GET

Retrieves a secret value from Azure Key Vault by secret name. Used by DevOps and cloud advisory teams to validate secret rotation compliance.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Retrieval"
  description: "Retrieves a secret value from Azure Key Vault by secret name. Used by DevOps and cloud advisory teams to validate secret rotation compliance."
  tags:
    - security
    - azure-key-vault
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: cloud-security
      port: 8080
      tools:
        - name: get-vault-secret
          description: "Retrieve a secret's metadata from Azure Key Vault and log the access event in ServiceNow for compliance tracking."
          inputParameters:
            - name: vault_name
              in: body
              type: string
              description: "The Azure Key Vault name."
            - name: secret_name
              in: body
              type: string
              description: "The secret identifier within the vault."
            - name: requestor_email
              in: body
              type: string
              description: "Email of the person requesting the secret audit."
          steps:
            - name: fetch-secret-metadata
              type: call
              call: "keyvault.get-secret"
              with:
                vault_name: "{{vault_name}}"
                secret_name: "{{secret_name}}"
            - name: log-access
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Key Vault access audit: {{vault_name}}/{{secret_name}}"
                description: "Expires: {{fetch-secret-metadata.exp}}. Enabled: {{fetch-secret-metadata.enabled}}. Requestor: {{requestor_email}}."
                assigned_group: "Cloud_Security"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://{{vault_name}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_keyvault_token"
      inputParameters:
        - name: api-version
          in: query
          value: "7.4"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}"
          inputParameters:
            - name: vault_name
              in: path
            - name: secret_name
              in: path
          operations:
            - name: get-secret
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Executes analytical queries against Azure Synapse Analytics data warehouse for financial and audit data analysis.

naftiko: "0.5"
info:
  label: "Azure Synapse Query Runner"
  description: "Executes analytical queries against Azure Synapse Analytics data warehouse for financial and audit data analysis."
  tags:
    - analytics
    - azure-synapse
capability:
  exposes:
    - type: mcp
      namespace: synapse-analytics
      port: 8080
      tools:
        - name: run-synapse-query
          description: "Run an analytical query against Azure Synapse."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The SQL query to execute."
            - name: database
              in: body
              type: string
              description: "The Synapse database name."
          call: "synapse.execute-query"
          with:
            query: "{{query}}"
            database: "{{database}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: row_count
              type: integer
              mapping: "$.rowCount"
  consumes:
    - type: http
      namespace: synapse
      baseUri: "https://kpmg-analytics.sql.azuresynapse.net"
      authentication:
        type: bearer
        token: "$secrets.synapse_token"
      resources:
        - name: queries
          path: "/sql/query"
          operations:
            - name: execute-query
              method: POST

Verifies blockchain-based audit trails for transaction integrity by querying distributed ledger records and returning verification status.

naftiko: "0.5"
info:
  label: "Blockchain Audit Trail Verification"
  description: "Verifies blockchain-based audit trails for transaction integrity by querying distributed ledger records and returning verification status."
  tags:
    - audit
    - blockchain
capability:
  exposes:
    - type: mcp
      namespace: blockchain-audit
      port: 8080
      tools:
        - name: verify-audit-trail
          description: "Verify a blockchain audit trail by transaction hash."
          inputParameters:
            - name: transaction_hash
              in: body
              type: string
              description: "The blockchain transaction hash."
          call: "blockchain.verify-transaction"
          with:
            hash: "{{transaction_hash}}"
          outputParameters:
            - name: verified
              type: boolean
              mapping: "$.verification.isValid"
            - name: timestamp
              type: string
              mapping: "$.verification.timestamp"
  consumes:
    - type: http
      namespace: blockchain
      baseUri: "https://kpmg-ledger.kpmg.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.blockchain_token"
      resources:
        - name: transactions
          path: "/transactions/{{hash}}/verify"
          inputParameters:
            - name: hash
              in: path
          operations:
            - name: verify-transaction
              method: GET

Supports business continuity advisory by assessing client BCP documentation in Confluence, analyzing recovery capabilities in Databricks, and generating gap analysis reports in SharePoint.

naftiko: "0.5"
info:
  label: "Business Continuity Advisory Orchestrator"
  description: "Supports business continuity advisory by assessing client BCP documentation in Confluence, analyzing recovery capabilities in Databricks, and generating gap analysis reports in SharePoint."
  tags:
    - advisory
    - business-continuity
    - confluence
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bcp-advisory
      port: 8080
      tools:
        - name: assess-business-continuity
          description: "Assess a client's business continuity posture."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: advisory_email
              in: body
              type: string
              description: "Advisory team email."
          steps:
            - name: review-bcp-docs
              type: call
              call: "confluence.search"
              with:
                cql: "label = 'bcp' AND label = '{{client_id}}'"
            - name: analyze-recovery
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM bcp_assessment WHERE client_id = '{{client_id}}'"
            - name: generate-gap-analysis
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "advisory-engagements"
                folder_path: "{{client_id}}/BCP"
                template: "bcp_gap_analysis"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{advisory_email}}"
                text: "BCP assessment for {{client_id}}: {{analyze-recovery.gap_count}} gaps identified. RTO compliance: {{analyze-recovery.rto_compliance}}%. Report: {{generate-gap-analysis.url}}."
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://kpmg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves static application security testing results from Checkmarx for client security assessment engagements.

naftiko: "0.5"
info:
  label: "Checkmarx Code Scan Results"
  description: "Retrieves static application security testing results from Checkmarx for client security assessment engagements."
  tags:
    - cybersecurity
    - checkmarx
capability:
  exposes:
    - type: mcp
      namespace: code-security
      port: 8080
      tools:
        - name: get-scan-results
          description: "Retrieve Checkmarx SAST scan results by project ID."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The Checkmarx project identifier."
          call: "checkmarx.get-results"
          with:
            project_id: "{{project_id}}"
          outputParameters:
            - name: high_severity
              type: integer
              mapping: "$.results.highSeverity"
            - name: medium_severity
              type: integer
              mapping: "$.results.mediumSeverity"
            - name: scan_status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: checkmarx
      baseUri: "https://kpmg.checkmarx.net/cxrestapi"
      authentication:
        type: bearer
        token: "$secrets.checkmarx_token"
      resources:
        - name: scans
          path: "/projects/{{project_id}}/lastScan"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-results
              method: GET

On new client acceptance request, screens the entity in Dow Jones for adverse media, retrieves credit data from Bloomberg, creates the acceptance record in Salesforce, logs a compliance review in ServiceNow, and notifies the risk partner via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Client Acceptance and Continuance Workflow"
  description: "On new client acceptance request, screens the entity in Dow Jones for adverse media, retrieves credit data from Bloomberg, creates the acceptance record in Salesforce, logs a compliance review in ServiceNow, and notifies the risk partner via Microsoft Teams."
  tags:
    - risk
    - compliance
    - client-acceptance
    - dow-jones
    - bloomberg
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-acceptance
      port: 8080
      tools:
        - name: process-client-acceptance
          description: "Given a prospective client name and requesting partner email, run DJ screening, pull Bloomberg credit data, create Salesforce account, log in ServiceNow, and notify risk partner."
          inputParameters:
            - name: client_name
              in: body
              type: string
              description: "Legal name of the prospective client."
            - name: country
              in: body
              type: string
              description: "Country of incorporation."
            - name: requesting_partner_email
              in: body
              type: string
              description: "Email of the partner requesting client acceptance."
            - name: bloomberg_ticker
              in: body
              type: string
              description: "Bloomberg ticker if publicly listed, or empty string."
          steps:
            - name: screen-entity
              type: call
              call: "dowjones.screen-entity"
              with:
                entity_name: "{{client_name}}"
                country: "{{country}}"
            - name: get-credit-data
              type: call
              call: "bloomberg.get-credit-risk"
              with:
                ticker: "{{bloomberg_ticker}}"
            - name: create-account
              type: call
              call: "salesforce.create-account"
              with:
                name: "{{client_name}}"
                billing_country: "{{country}}"
                description: "DJ risk score: {{screen-entity.risk_score}}. DJ hits: {{screen-entity.total_hits}}. Credit rating: {{get-credit-data.credit_rating}}."
                type: "Prospect"
            - name: log-compliance-review
              type: call
              call: "servicenow.create-compliance-task"
              with:
                short_description: "Client Acceptance Review: {{client_name}}"
                description: "DJ screening: {{screen-entity.total_hits}} hits, score {{screen-entity.risk_score}}. Credit rating: {{get-credit-data.credit_rating}}. Salesforce: {{create-account.id}}."
                assigned_group: "Risk_Compliance"
            - name: notify-risk-partner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{requesting_partner_email}}"
                text: "Client acceptance for {{client_name}} ({{country}}). DJ risk: {{screen-entity.risk_score}} ({{screen-entity.total_hits}} hits). Credit: {{get-credit-data.credit_rating}}. ServiceNow: {{log-compliance-review.number}}. Salesforce: {{create-account.id}}."
  consumes:
    - type: http
      namespace: dowjones
      baseUri: "https://api.dowjones.com/riskandcompliance/v1"
      authentication:
        type: bearer
        token: "$secrets.dowjones_token"
      resources:
        - name: screening
          path: "/screenings"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: credit-data
          path: "/data/{{ticker}}/creditRisk"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-credit-risk
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.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://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance-tasks
          path: "/table/sn_compliance_task"
          operations:
            - name: create-compliance-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

Verifies auditor independence by checking financial relationships in Salesforce, cross-referencing employee portfolios in Workday, and generating compliance reports in SharePoint.

naftiko: "0.5"
info:
  label: "Client Independence Verification Pipeline"
  description: "Verifies auditor independence by checking financial relationships in Salesforce, cross-referencing employee portfolios in Workday, and generating compliance reports in SharePoint."
  tags:
    - independence
    - compliance
    - salesforce
    - workday
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: independence
      port: 8080
      tools:
        - name: verify-independence
          description: "Verify auditor independence for a client engagement."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: employee_id
              in: body
              type: string
              description: "The auditor employee ID."
          steps:
            - name: check-client-relationships
              type: call
              call: "salesforce.get-relationships"
              with:
                client_id: "{{client_id}}"
            - name: check-financial-interests
              type: call
              call: "workday.get-financial-disclosures"
              with:
                employee_id: "{{employee_id}}"
            - name: generate-compliance-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "independence"
                folder_path: "Verifications/{{client_id}}/{{employee_id}}"
                template: "independence_verification"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: relationships
          path: "/sobjects/ClientRelationship__c"
          operations:
            - name: get-relationships
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/kpmg"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: disclosures
          path: "/workers/{{employee_id}}/financialDisclosures"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-financial-disclosures
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

Generates client proposals by pulling opportunity data from Salesforce, retrieving methodology templates from Confluence, creating the proposal in SharePoint, and notifying the pursuit team via Teams.

naftiko: "0.5"
info:
  label: "Client Proposal Generation Orchestrator"
  description: "Generates client proposals by pulling opportunity data from Salesforce, retrieving methodology templates from Confluence, creating the proposal in SharePoint, and notifying the pursuit team via Teams."
  tags:
    - business-development
    - proposals
    - salesforce
    - confluence
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: proposals
      port: 8080
      tools:
        - name: generate-proposal
          description: "Generate a client proposal from opportunity data."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
            - name: service_line
              in: body
              type: string
              description: "The service line (audit, tax, advisory)."
            - name: pursuit_lead_email
              in: body
              type: string
              description: "Pursuit lead email."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: get-methodology
              type: call
              call: "confluence.search"
              with:
                cql: "label = 'proposal-template' AND label = '{{service_line}}'"
            - name: create-proposal
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "proposals"
                folder_path: "{{get-opportunity.client_name}}/{{opportunity_id}}"
                template: "{{service_line}}_proposal"
            - name: notify-pursuit-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{pursuit_lead_email}}"
                text: "Proposal generated for {{get-opportunity.client_name}} ({{service_line}}). Estimated value: {{get-opportunity.amount}}. Proposal: {{create-proposal.url}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://kpmg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls cost data from Microsoft Azure Cost Management, compares against budget thresholds, generates a cost optimization report in SharePoint, creates a Jira optimization task, and alerts the cloud advisory team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Pulls cost data from Microsoft Azure Cost Management, compares against budget thresholds, generates a cost optimization report in SharePoint, creates a Jira optimization task, and alerts the cloud advisory team via Microsoft Teams."
  tags:
    - advisory
    - cloud
    - cost-optimization
    - microsoft-azure
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-cost
      port: 8080
      tools:
        - name: analyze-cloud-costs
          description: "Given an Azure subscription ID and billing period, pull cost data, generate a SharePoint report, create Jira task, and notify the advisory team."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: billing_period
              in: body
              type: string
              description: "Billing period (YYYY-MM)."
            - name: budget_amount
              in: body
              type: number
              description: "Budget threshold in USD."
            - name: advisory_lead_email
              in: body
              type: string
              description: "Email of the cloud advisory team lead."
          steps:
            - name: get-cost-data
              type: call
              call: "azure-cost.get-usage"
              with:
                subscription_id: "{{subscription_id}}"
                billing_period: "{{billing_period}}"
            - name: generate-report
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "cloud_advisory_site"
                file_path: "CostReports/Azure_{{subscription_id}}_{{billing_period}}.xlsx"
                content: "Azure Cost Report {{billing_period}}. Total: {{get-cost-data.total_cost}} USD. Budget: {{budget_amount}} USD. Top service: {{get-cost-data.top_service}} ({{get-cost-data.top_service_cost}} USD)."
            - name: create-optimization-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CLOUD"
                issue_type: "Task"
                summary: "Cost optimization: Azure {{subscription_id}} — {{billing_period}}"
                description: "Total spend: {{get-cost-data.total_cost}} USD vs budget {{budget_amount}} USD. Top service: {{get-cost-data.top_service}}. Report: {{generate-report.url}}."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{advisory_lead_email}}"
                text: "Azure cost analysis for {{billing_period}}: {{get-cost-data.total_cost}} USD (budget: {{budget_amount}} USD). Top service: {{get-cost-data.top_service}}. Report: {{generate-report.url}}. Jira: {{create-optimization-task.key}}."
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      inputParameters:
        - name: api-version
          in: query
          value: "2023-11-01"
      resources:
        - name: usage
          path: "/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-usage
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Assesses client cloud security posture by scanning Azure configurations, checking compliance against CIS benchmarks in Databricks, generating findings reports in SharePoint, and alerting the cyber team.

naftiko: "0.5"
info:
  label: "Cloud Security Assessment Orchestrator"
  description: "Assesses client cloud security posture by scanning Azure configurations, checking compliance against CIS benchmarks in Databricks, generating findings reports in SharePoint, and alerting the cyber team."
  tags:
    - cybersecurity
    - cloud-security
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-security
      port: 8080
      tools:
        - name: assess-cloud-security
          description: "Assess client cloud security posture."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID to assess."
            - name: cyber_lead_email
              in: body
              type: string
              description: "Cyber engagement lead email."
          steps:
            - name: scan-configuration
              type: call
              call: "azure.get-security-score"
              with:
                subscription_id: "{{subscription_id}}"
            - name: check-cis-compliance
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM cis_benchmark_results WHERE subscription_id = '{{subscription_id}}' AND compliance_status = 'FAIL'"
            - name: generate-findings
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "cyber-engagements"
                folder_path: "{{client_id}}/CloudSecurity/{{subscription_id}}"
                template: "cloud_security_assessment"
            - name: notify-cyber-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{cyber_lead_email}}"
                text: "Cloud security assessment for {{client_id}}: Security score {{scan-configuration.score}}/100. CIS failures: {{check-cis-compliance.fail_count}}. Report: {{generate-findings.url}}."
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/providers/Microsoft.Security"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: security
          path: "/secureScores/ascScore?api-version=2020-01-01"
          operations:
            - name: get-security-score
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new compliance training requirement is identified, creates the course assignment in Pluralsight, logs the requirement in ServiceNow, sends the enrollment link via Microsoft Teams, and tracks completion in Workday learning.

naftiko: "0.5"
info:
  label: "Compliance Training Assignment Orchestrator"
  description: "When a new compliance training requirement is identified, creates the course assignment in Pluralsight, logs the requirement in ServiceNow, sends the enrollment link via Microsoft Teams, and tracks completion in Workday learning."
  tags:
    - compliance
    - training
    - pluralsight
    - servicenow
    - microsoft-teams
    - workday
capability:
  exposes:
    - type: mcp
      namespace: compliance-training
      port: 8080
      tools:
        - name: assign-compliance-training
          description: "Given a course ID, employee ID, and compliance requirement, assign training in Pluralsight, log in ServiceNow, notify via Teams, and register in Workday learning."
          inputParameters:
            - name: course_id
              in: body
              type: string
              description: "The Pluralsight course identifier."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: compliance_requirement
              in: body
              type: string
              description: "The compliance requirement name (e.g., AML Awareness, GDPR, SOX)."
            - name: due_date
              in: body
              type: string
              description: "Training completion due date (YYYY-MM-DD)."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: assign-course
              type: call
              call: "pluralsight.assign-course"
              with:
                course_id: "{{course_id}}"
                user_email: "{{get-employee.work_email}}"
            - name: log-requirement
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Compliance training: {{compliance_requirement}} — {{get-employee.full_name}}"
                description: "Course: {{course_id}}. Due: {{due_date}}. Enrollment: {{assign-course.enrollment_url}}."
                assigned_to: "{{get-employee.work_email}}"
                due_date: "{{due_date}}"
            - name: notify-employee
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Required compliance training: {{compliance_requirement}}. Complete by {{due_date}}. Enroll here: {{assign-course.enrollment_url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: assignments
          path: "/courses/{{course_id}}/assignments"
          inputParameters:
            - name: course_id
              in: path
          operations:
            - name: assign-course
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/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

Searches KPMG methodology documentation in Confluence for audit standards, advisory frameworks, and engagement procedures.

naftiko: "0.5"
info:
  label: "Confluence Methodology Search"
  description: "Searches KPMG methodology documentation in Confluence for audit standards, advisory frameworks, and engagement procedures."
  tags:
    - methodology
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: methodology
      port: 8080
      tools:
        - name: search-methodology
          description: "Search KPMG methodology knowledge base in Confluence."
          inputParameters:
            - name: search_term
              in: body
              type: string
              description: "The search query."
            - name: service_line
              in: body
              type: string
              description: "Service line filter (audit, tax, advisory)."
          call: "confluence.search"
          with:
            cql: "text ~ '{{search_term}}' AND label = '{{service_line}}' AND space = 'METHODOLOGY'"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total_size
              type: integer
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://kpmg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET

Pulls approved timesheets from Workday for a consulting engagement, reconciles hours against the Jira project board, updates the project budget tracker in Microsoft Excel via SharePoint, and sends a weekly utilization summary to the engagement manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Consulting Engagement Timesheet Pipeline"
  description: "Pulls approved timesheets from Workday for a consulting engagement, reconciles hours against the Jira project board, updates the project budget tracker in Microsoft Excel via SharePoint, and sends a weekly utilization summary to the engagement manager via Microsoft Teams."
  tags:
    - consulting
    - time-management
    - workday
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: consulting-timesheets
      port: 8080
      tools:
        - name: reconcile-timesheets
          description: "Given an engagement code and reporting week, pull Workday timesheets, reconcile against Jira, update SharePoint budget tracker, and notify the engagement manager."
          inputParameters:
            - name: engagement_code
              in: body
              type: string
              description: "The consulting engagement project code."
            - name: week_ending
              in: body
              type: string
              description: "Week ending date (YYYY-MM-DD)."
            - name: engagement_manager_email
              in: body
              type: string
              description: "Email of the engagement manager."
          steps:
            - name: get-timesheets
              type: call
              call: "workday.get-time-entries"
              with:
                project_code: "{{engagement_code}}"
                week_ending: "{{week_ending}}"
            - name: get-jira-logged
              type: call
              call: "jira.get-project-worklogs"
              with:
                project_key: "{{engagement_code}}"
                since: "{{week_ending}}"
            - name: update-budget-tracker
              type: call
              call: "sharepoint.update-file"
              with:
                site_id: "consulting_projects_site"
                file_path: "BudgetTrackers/{{engagement_code}}_budget.xlsx"
                content: "Week: {{week_ending}}. Workday hours: {{get-timesheets.total_hours}}. Jira logged: {{get-jira-logged.total_hours}}. Variance: {{get-timesheets.variance}}."
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{engagement_manager_email}}"
                text: "Weekly timesheet reconciliation for {{engagement_code}} (week ending {{week_ending}}). Workday: {{get-timesheets.total_hours}}h. Jira: {{get-jira-logged.total_hours}}h. Budget tracker updated: {{update-budget-tracker.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-entries
          path: "/timeEntries?projectCode={{project_code}}&weekEnding={{week_ending}}"
          inputParameters:
            - name: project_code
              in: query
            - name: week_ending
              in: query
          operations:
            - name: get-time-entries
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: worklogs
          path: "/project/{{project_key}}/worklogs?since={{since}}"
          inputParameters:
            - name: project_key
              in: path
            - name: since
              in: query
          operations:
            - name: get-project-worklogs
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: update-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a Coupa invoice exceeds the auto-approval threshold, retrieves the invoice details, looks up the approver in Workday, routes the approval request via Microsoft Teams, and logs the exception in ServiceNow.

naftiko: "0.5"
info:
  label: "Coupa Invoice Approval Orchestrator"
  description: "When a Coupa invoice exceeds the auto-approval threshold, retrieves the invoice details, looks up the approver in Workday, routes the approval request via Microsoft Teams, and logs the exception in ServiceNow."
  tags:
    - procurement
    - finance
    - coupa
    - workday
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: procurement-invoicing
      port: 8080
      tools:
        - name: route-invoice-approval
          description: "Given a Coupa invoice ID and requestor employee ID, retrieve invoice details, resolve approver from Workday, notify via Teams, and log in ServiceNow."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Coupa invoice identifier."
            - name: requestor_employee_id
              in: body
              type: string
              description: "Workday employee ID of the invoice submitter."
          steps:
            - name: get-invoice
              type: call
              call: "coupa.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-requestor
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{requestor_employee_id}}"
            - name: get-approver
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-requestor.manager_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-approver.work_email}}"
                text: "Invoice Approval Required: Coupa #{{invoice_id}} from {{get-requestor.full_name}}. Supplier: {{get-invoice.supplier_name}}. Amount: {{get-invoice.total_amount}} {{get-invoice.currency}}. Please review in Coupa."
            - name: log-exception
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Invoice approval exception: Coupa #{{invoice_id}}"
                description: "Supplier: {{get-invoice.supplier_name}}. Amount: {{get-invoice.total_amount}} {{get-invoice.currency}}. Requestor: {{get-requestor.full_name}}. Approver: {{get-approver.full_name}}."
                assigned_group: "Accounts_Payable"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://kpmg.coupahost.com/api"
      authentication:
        type: bearer
        token: "$secrets.coupa_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Retrieves purchase order details from Coupa procurement platform, including line items, approval status, and vendor information.

naftiko: "0.5"
info:
  label: "Coupa Purchase Order Lookup"
  description: "Retrieves purchase order details from Coupa procurement platform, including line items, approval status, and vendor information."
  tags:
    - procurement
    - coupa
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a purchase order in Coupa by PO number."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The purchase order number."
          call: "coupa.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: total_amount
              type: number
              mapping: "$.total"
            - name: vendor_name
              type: string
              mapping: "$.supplier.name"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://kpmg.coupahost.com/api"
      authentication:
        type: apiKey
        header: "X-COUPA-API-KEY"
        key: "$secrets.coupa_api_key"
      resources:
        - name: purchase-orders
          path: "/purchase_orders?po_number={{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Tracks CPE compliance for audit professionals by pulling completion data from Workday Learning, identifying gaps, creating remediation tasks in Jira, and notifying practice leaders.

naftiko: "0.5"
info:
  label: "CPE Compliance Tracking Orchestrator"
  description: "Tracks CPE compliance for audit professionals by pulling completion data from Workday Learning, identifying gaps, creating remediation tasks in Jira, and notifying practice leaders."
  tags:
    - compliance
    - cpe
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cpe-compliance
      port: 8080
      tools:
        - name: track-cpe-compliance
          description: "Track CPE compliance status for a practice group."
          inputParameters:
            - name: practice_group
              in: body
              type: string
              description: "The practice group name."
            - name: practice_leader_email
              in: body
              type: string
              description: "Practice leader email."
          steps:
            - name: get-cpe-status
              type: call
              call: "workday.get-cpe-report"
              with:
                practice_group: "{{practice_group}}"
            - name: create-remediation-tasks
              type: call
              call: "jira.create-issues-bulk"
              with:
                project: "CPE"
                issues: "{{get-cpe-status.non_compliant_staff}}"
                issue_type: "Task"
            - name: notify-leader
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{practice_leader_email}}"
                text: "CPE compliance report for {{practice_group}}: {{get-cpe-status.compliant_count}}/{{get-cpe-status.total_count}} compliant. {{create-remediation-tasks.created_count}} remediation tasks created."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/kpmg"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: cpe
          path: "/learningCompletions/cpe"
          operations:
            - name: get-cpe-report
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/bulk"
          operations:
            - name: create-issues-bulk
              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

Identifies customs duty recovery opportunities by analyzing import data in Databricks, cross-referencing tariff schedules, generating recovery claims in SharePoint, and notifying the trade advisory team.

naftiko: "0.5"
info:
  label: "Customs Duty Recovery Pipeline"
  description: "Identifies customs duty recovery opportunities by analyzing import data in Databricks, cross-referencing tariff schedules, generating recovery claims in SharePoint, and notifying the trade advisory team."
  tags:
    - tax
    - customs
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customs-recovery
      port: 8080
      tools:
        - name: identify-recovery-opportunities
          description: "Identify customs duty recovery opportunities for a client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: trade_advisory_email
              in: body
              type: string
              description: "Trade advisory team email."
          steps:
            - name: analyze-imports
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM import_duty_analysis WHERE client_id = '{{client_id}}' AND recovery_potential > 0"
            - name: generate-claims
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "tax-engagements"
                folder_path: "{{client_id}}/CustomsRecovery"
                template: "duty_recovery_claim"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{trade_advisory_email}}"
                text: "Customs duty recovery for {{client_id}}: {{analyze-imports.recovery_count}} opportunities totaling {{analyze-imports.total_recovery}}. Claims: {{generate-claims.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls scan results from Nessus for a target host, creates a ServiceNow security incident for critical findings, assigns remediation in Jira, and alerts the CISO team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cybersecurity Vulnerability Assessment Orchestrator"
  description: "Pulls scan results from Nessus for a target host, creates a ServiceNow security incident for critical findings, assigns remediation in Jira, and alerts the CISO team in Microsoft Teams."
  tags:
    - cybersecurity
    - vulnerability-management
    - nessus
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cyber-vuln
      port: 8080
      tools:
        - name: process-vulnerability-scan
          description: "Given a Nessus scan ID and host IP, retrieve critical findings, create a ServiceNow security incident, assign Jira remediation, and alert the CISO team."
          inputParameters:
            - name: scan_id
              in: body
              type: string
              description: "The Nessus scan ID."
            - name: host_ip
              in: body
              type: string
              description: "Target host IP address."
            - name: ciso_team_email
              in: body
              type: string
              description: "Email of the CISO team distribution list."
          steps:
            - name: get-scan-results
              type: call
              call: "nessus.get-scan-results"
              with:
                scan_id: "{{scan_id}}"
                host_ip: "{{host_ip}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-security-incident"
              with:
                short_description: "Critical vulnerabilities: {{host_ip}} — {{get-scan-results.critical_count}} findings"
                description: "Scan {{scan_id}}. Critical: {{get-scan-results.critical_count}}. High: {{get-scan-results.high_count}}. Top CVE: {{get-scan-results.top_cve}}."
                priority: "1"
                assigned_group: "Security_Operations"
            - name: create-remediation-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SECOPS"
                issue_type: "Bug"
                summary: "Remediate: {{get-scan-results.top_cve}} on {{host_ip}}"
                description: "Nessus scan {{scan_id}}. Critical findings: {{get-scan-results.critical_count}}. ServiceNow: {{create-security-incident.number}}."
                priority: "Highest"
            - name: alert-ciso
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{ciso_team_email}}"
                text: "CRITICAL: {{get-scan-results.critical_count}} vulnerabilities on {{host_ip}}. Top CVE: {{get-scan-results.top_cve}}. ServiceNow: {{create-security-incident.number}}. Jira: {{create-remediation-task.key}}."
  consumes:
    - type: http
      namespace: nessus
      baseUri: "https://nessus.kpmg.com:8834"
      authentication:
        type: apiKey
        key: "$secrets.nessus_api_key"
      inputParameters:
        - name: X-ApiKeys
          in: header
          value: "accessKey=$secrets.nessus_access_key;secretKey=$secrets.nessus_secret_key"
      resources:
        - name: scan-results
          path: "/scans/{{scan_id}}/hosts/{{host_ip}}"
          inputParameters:
            - name: scan_id
              in: path
            - name: host_ip
              in: path
          operations:
            - name: get-scan-results
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: security-incidents
          path: "/table/sn_si_incident"
          operations:
            - name: create-security-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Conducts data privacy impact assessments by scanning data flows in Azure Synapse, mapping to GDPR requirements in Confluence, creating assessment reports in SharePoint, and notifying the DPO.

naftiko: "0.5"
info:
  label: "Data Privacy Impact Assessment Orchestrator"
  description: "Conducts data privacy impact assessments by scanning data flows in Azure Synapse, mapping to GDPR requirements in Confluence, creating assessment reports in SharePoint, and notifying the DPO."
  tags:
    - privacy
    - gdpr
    - azure-synapse
    - confluence
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dpia
      port: 8080
      tools:
        - name: conduct-dpia
          description: "Conduct a data privacy impact assessment for a client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: data_process_name
              in: body
              type: string
              description: "Name of the data processing activity."
            - name: dpo_email
              in: body
              type: string
              description: "Data Protection Officer email."
          steps:
            - name: scan-data-flows
              type: call
              call: "synapse.execute-query"
              with:
                query: "SELECT * FROM data_flow_catalog WHERE client_id = '{{client_id}}' AND process = '{{data_process_name}}'"
            - name: map-gdpr-requirements
              type: call
              call: "confluence.search"
              with:
                cql: "label = 'gdpr-requirements' AND text ~ '{{data_process_name}}'"
            - name: create-assessment
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "privacy-assessments"
                folder_path: "{{client_id}}/DPIA/{{data_process_name}}"
                template: "dpia_template"
            - name: notify-dpo
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{dpo_email}}"
                text: "DPIA completed for {{client_id}} - {{data_process_name}}. Data flows identified: {{scan-data-flows.count}}. Assessment: {{create-assessment.url}}."
  consumes:
    - type: http
      namespace: synapse
      baseUri: "https://kpmg-analytics.sql.azuresynapse.net"
      authentication:
        type: bearer
        token: "$secrets.synapse_token"
      resources:
        - name: queries
          path: "/sql/query"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://kpmg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Datadog for infrastructure metrics by host and metric name, returning the latest data point. Used by technology advisory teams for performance assessments.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Metrics Lookup"
  description: "Queries Datadog for infrastructure metrics by host and metric name, returning the latest data point. Used by technology advisory teams for performance assessments."
  tags:
    - operations
    - monitoring
    - datadog
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-host-metric
          description: "Query Datadog for a specific infrastructure metric on a given host and create a ServiceNow incident if the metric exceeds a threshold."
          inputParameters:
            - name: host_name
              in: body
              type: string
              description: "The hostname to query metrics for."
            - name: metric_name
              in: body
              type: string
              description: "The Datadog metric name (e.g., system.cpu.user, system.mem.used)."
            - name: ops_team_email
              in: body
              type: string
              description: "Email of the operations team lead."
          steps:
            - name: fetch-metric
              type: call
              call: "datadog.query-metric"
              with:
                host_name: "{{host_name}}"
                metric_name: "{{metric_name}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Metric alert: {{metric_name}} on {{host_name}}"
                description: "Current value: {{fetch-metric.value}} {{fetch-metric.unit}}. Host: {{host_name}}."
                assigned_group: "IT_Operations"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{ops_team_email}}"
                text: "Infrastructure alert: {{metric_name}} on {{host_name}} = {{fetch-metric.value}} {{fetch-metric.unit}}. ServiceNow: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: metrics
          path: "/query?query={{metric_name}}{host:{{host_name}}}&from=-3600&to=now"
          inputParameters:
            - name: host_name
              in: query
            - name: metric_name
              in: query
          operations:
            - name: query-metric
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Supports deal advisory valuations by extracting financial data from SAP, running DCF models in Databricks, generating valuation reports in SharePoint, and notifying the deal team.

naftiko: "0.5"
info:
  label: "Deal Advisory Valuation Pipeline"
  description: "Supports deal advisory valuations by extracting financial data from SAP, running DCF models in Databricks, generating valuation reports in SharePoint, and notifying the deal team."
  tags:
    - deal-advisory
    - valuation
    - sap
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: deal-valuation
      port: 8080
      tools:
        - name: run-valuation
          description: "Run a DCF valuation model for a deal advisory engagement."
          inputParameters:
            - name: target_company_id
              in: body
              type: string
              description: "The target company identifier."
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier."
            - name: deal_team_email
              in: body
              type: string
              description: "Deal team email."
          steps:
            - name: extract-financials
              type: call
              call: "sap.get-financial-statements"
              with:
                company_id: "{{target_company_id}}"
            - name: run-dcf-model
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM dcf_valuation WHERE company_id = '{{target_company_id}}' AND engagement_id = '{{engagement_id}}'"
            - name: generate-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "deal-advisory"
                folder_path: "{{engagement_id}}/Valuation/{{target_company_id}}"
                template: "valuation_report"
            - name: notify-deal-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{deal_team_email}}"
                text: "Valuation complete for {{target_company_id}}. Enterprise value range: {{run-dcf-model.ev_low}} - {{run-dcf-model.ev_high}}. Report: {{generate-report.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: financials
          path: "/FI_SRV/FinancialStatements"
          operations:
            - name: get-financial-statements
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              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

Assesses client digital transformation maturity by collecting data from surveys, analyzing capabilities in Databricks, generating maturity scorecards in SharePoint, and presenting to stakeholders.

naftiko: "0.5"
info:
  label: "Digital Transformation Maturity Assessment Pipeline"
  description: "Assesses client digital transformation maturity by collecting data from surveys, analyzing capabilities in Databricks, generating maturity scorecards in SharePoint, and presenting to stakeholders."
  tags:
    - advisory
    - digital-transformation
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: digital-maturity
      port: 8080
      tools:
        - name: assess-digital-maturity
          description: "Assess a client's digital transformation maturity level."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: assessment_date
              in: body
              type: string
              description: "Assessment date."
            - name: stakeholder_email
              in: body
              type: string
              description: "Client stakeholder email."
          steps:
            - name: analyze-maturity
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM digital_maturity_scores WHERE client_id = '{{client_id}}'"
            - name: generate-scorecard
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "advisory-engagements"
                folder_path: "{{client_id}}/DigitalMaturity/{{assessment_date}}"
                template: "maturity_scorecard"
            - name: notify-stakeholder
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{stakeholder_email}}"
                text: "Digital maturity assessment complete for {{client_id}}. Overall score: {{analyze-maturity.overall_score}}/5. Scorecard: {{generate-scorecard.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Elasticsearch for audit trail log entries by index, date range, and search query. Used by forensic and compliance teams for investigation support.

naftiko: "0.5"
info:
  label: "Elasticsearch Audit Log Search"
  description: "Queries Elasticsearch for audit trail log entries by index, date range, and search query. Used by forensic and compliance teams for investigation support."
  tags:
    - forensics
    - compliance
    - elasticsearch
    - audit-trail
capability:
  exposes:
    - type: mcp
      namespace: forensic-search
      port: 8080
      tools:
        - name: search-audit-logs
          description: "Search Elasticsearch audit trail logs by index and query parameters."
          inputParameters:
            - name: index_name
              in: body
              type: string
              description: "The Elasticsearch index name."
            - name: search_query
              in: body
              type: string
              description: "The Elasticsearch query string."
            - name: date_from
              in: body
              type: string
              description: "Start date (YYYY-MM-DD)."
            - name: date_to
              in: body
              type: string
              description: "End date (YYYY-MM-DD)."
          call: "elasticsearch.search"
          with:
            index_name: "{{index_name}}"
            search_query: "{{search_query}}"
            date_from: "{{date_from}}"
            date_to: "{{date_to}}"
          outputParameters:
            - name: total_hits
              type: string
              mapping: "$.hits.total.value"
            - name: results
              type: string
              mapping: "$.hits.hits"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://es.kpmg.com:9200"
      authentication:
        type: basic
        username: "$secrets.elasticsearch_user"
        password: "$secrets.elasticsearch_password"
      resources:
        - name: search
          path: "/{{index_name}}/_search"
          inputParameters:
            - name: index_name
              in: path
          operations:
            - name: search
              method: POST

When an employee separation is triggered in Workday, disables their Azure AD account, revokes ServiceNow access, archives their SharePoint personal drive, and logs the offboarding in Jira.

naftiko: "0.5"
info:
  label: "Employee Offboarding Orchestrator"
  description: "When an employee separation is triggered in Workday, disables their Azure AD account, revokes ServiceNow access, archives their SharePoint personal drive, and logs the offboarding in Jira."
  tags:
    - hr
    - offboarding
    - workday
    - azure-active-directory
    - servicenow
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: process-offboarding
          description: "Given a Workday employee ID and separation date, disable Azure AD, revoke ServiceNow, archive SharePoint drive, and log in Jira."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: separation_date
              in: body
              type: string
              description: "Employee separation date in YYYY-MM-DD format."
            - name: hr_contact_email
              in: body
              type: string
              description: "Email of the HR contact managing the offboarding."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: disable-ad-account
              type: call
              call: "azuread.disable-user"
              with:
                user_principal_name: "{{get-employee.work_email}}"
            - name: revoke-snow-access
              type: call
              call: "servicenow.deactivate-user"
              with:
                user_name: "{{get-employee.work_email}}"
            - name: archive-drive
              type: call
              call: "sharepoint.move-folder"
              with:
                site_id: "personal_drives_site"
                source_path: "Users/{{get-employee.work_email}}"
                dest_path: "Archived/{{get-employee.work_email}}_{{separation_date}}"
            - name: log-offboarding
              type: call
              call: "jira.create-issue"
              with:
                project_key: "HRIT"
                issue_type: "Task"
                summary: "Offboarding: {{get-employee.full_name}} — {{separation_date}}"
                description: "AD disabled. ServiceNow revoked. SharePoint archived. HR contact: {{hr_contact_email}}."
  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: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_principal_name}}"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: users
          path: "/table/sys_user?sysparm_query=user_name={{user_name}}"
          inputParameters:
            - name: user_name
              in: query
          operations:
            - name: deactivate-user
              method: PATCH
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{source_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: source_path
              in: path
          operations:
            - name: move-folder
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://kpmg.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

Monitors engagement budget variances by pulling time entries from Workday, comparing against budgets in Salesforce, generating variance reports, and alerting engagement managers.

naftiko: "0.5"
info:
  label: "Engagement Budget Variance Pipeline"
  description: "Monitors engagement budget variances by pulling time entries from Workday, comparing against budgets in Salesforce, generating variance reports, and alerting engagement managers."
  tags:
    - engagement-management
    - budget
    - workday
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: budget-variance
      port: 8080
      tools:
        - name: check-budget-variance
          description: "Check engagement budget variance and alert on overruns."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier."
            - name: manager_email
              in: body
              type: string
              description: "Engagement manager email."
          steps:
            - name: get-time-entries
              type: call
              call: "workday.get-engagement-hours"
              with:
                engagement_id: "{{engagement_id}}"
            - name: get-budget
              type: call
              call: "salesforce.get-engagement-budget"
              with:
                engagement_id: "{{engagement_id}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{manager_email}}"
                text: "Budget variance for {{engagement_id}}: Budget {{get-budget.total_budget}}. Actual: {{get-time-entries.total_cost}}. Variance: {{get-time-entries.variance_percentage}}%. Remaining: {{get-budget.remaining}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/kpmg"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: hours
          path: "/engagementHours/{{engagement_id}}"
          inputParameters:
            - name: engagement_id
              in: path
          operations:
            - name: get-engagement-hours
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: budgets
          path: "/sobjects/EngagementBudget__c/{{engagement_id}}"
          inputParameters:
            - name: engagement_id
              in: path
          operations:
            - name: get-engagement-budget
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Generates an engagement letter by pulling client data from Salesforce, retrieving the letter template from SharePoint, populating it via Microsoft Power Automate, storing the final version in SharePoint, and sending it for e-signature notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Engagement Letter Generation Pipeline"
  description: "Generates an engagement letter by pulling client data from Salesforce, retrieving the letter template from SharePoint, populating it via Microsoft Power Automate, storing the final version in SharePoint, and sending it for e-signature notification via Microsoft Teams."
  tags:
    - advisory
    - engagement-management
    - salesforce
    - sharepoint
    - microsoft-power-automate
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: engagement-letters
      port: 8080
      tools:
        - name: generate-engagement-letter
          description: "Given a Salesforce opportunity ID, generate an engagement letter from template, store in SharePoint, and notify the partner for signature."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: template_name
              in: body
              type: string
              description: "Engagement letter template name (e.g., audit_standard, tax_advisory, consulting)."
            - name: partner_email
              in: body
              type: string
              description: "Email of the signing partner."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: get-template
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "engagement_templates_site"
                file_path: "Templates/{{template_name}}.docx"
            - name: generate-document
              type: call
              call: "power-automate.trigger-flow"
              with:
                flow_id: "engagement_letter_generator"
                client_name: "{{get-opportunity.Account.Name}}"
                engagement_amount: "{{get-opportunity.Amount}}"
                engagement_scope: "{{get-opportunity.Description}}"
                template_url: "{{get-template.download_url}}"
            - name: notify-partner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{partner_email}}"
                text: "Engagement letter ready for {{get-opportunity.Account.Name}}. Amount: {{get-opportunity.Amount}}. Document: {{generate-document.output_url}}. Please review and sign."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: power-automate
      baseUri: "https://prod-00.westus.logic.azure.com/workflows"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flows
          path: "/{{flow_id}}/triggers/manual/paths/invoke"
          inputParameters:
            - name: flow_id
              in: path
          operations:
            - name: trigger-flow
              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

Manages engagement quality reviews by pulling engagement metrics from Salesforce, collecting review documentation from SharePoint, creating review tasks in Jira, and routing for partner sign-off.

naftiko: "0.5"
info:
  label: "Engagement Quality Review Orchestrator"
  description: "Manages engagement quality reviews by pulling engagement metrics from Salesforce, collecting review documentation from SharePoint, creating review tasks in Jira, and routing for partner sign-off."
  tags:
    - quality
    - engagement-review
    - salesforce
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-review
      port: 8080
      tools:
        - name: initiate-quality-review
          description: "Initiate an engagement quality review process."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier."
            - name: eqr_partner_email
              in: body
              type: string
              description: "EQR partner email."
          steps:
            - name: get-engagement-data
              type: call
              call: "salesforce.get-engagement"
              with:
                engagement_id: "{{engagement_id}}"
            - name: collect-workpapers
              type: call
              call: "sharepoint.get-folder-contents"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project: "QR"
                summary: "EQR: {{get-engagement-data.client_name}} - {{engagement_id}}"
                assignee: "{{eqr_partner_email}}"
                description: "Engagement files: {{collect-workpapers.file_count}} documents."
            - name: notify-partner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{eqr_partner_email}}"
                text: "EQR assigned: {{get-engagement-data.client_name}} ({{engagement_id}}). {{collect-workpapers.file_count}} workpapers to review. Jira: {{create-review-task.key}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: engagements
          path: "/sobjects/Engagement__c/{{engagement_id}}"
          inputParameters:
            - name: engagement_id
              in: path
          operations:
            - name: get-engagement
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: get-folder-contents
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Optimizes engagement staffing by pulling availability from Workday, matching skills from Salesforce CRM, creating assignments, and notifying resource managers via Teams.

naftiko: "0.5"
info:
  label: "Engagement Staffing Optimizer Pipeline"
  description: "Optimizes engagement staffing by pulling availability from Workday, matching skills from Salesforce CRM, creating assignments, and notifying resource managers via Teams."
  tags:
    - resource-management
    - staffing
    - workday
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: staffing-optimizer
      port: 8080
      tools:
        - name: optimize-staffing
          description: "Optimize engagement staffing based on availability and skills."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier."
            - name: required_skills
              in: body
              type: string
              description: "Required skill set."
            - name: resource_manager_email
              in: body
              type: string
              description: "Resource manager email."
          steps:
            - name: check-availability
              type: call
              call: "workday.get-available-staff"
              with:
                skills: "{{required_skills}}"
            - name: match-skills
              type: call
              call: "salesforce.search-professionals"
              with:
                skills: "{{required_skills}}"
                available_ids: "{{check-availability.available_ids}}"
            - name: create-assignments
              type: call
              call: "workday.create-assignments"
              with:
                engagement_id: "{{engagement_id}}"
                staff_ids: "{{match-skills.recommended_staff}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{resource_manager_email}}"
                text: "Staffing recommendation for {{engagement_id}}: {{match-skills.match_count}} professionals matched. Assignments created: {{create-assignments.count}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/kpmg"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: staff
          path: "/workers/available"
          operations:
            - name: get-available-staff
              method: GET
        - name: assignments
          path: "/engagementAssignments"
          operations:
            - name: create-assignments
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: professionals
          path: "/sobjects/Professional__c"
          operations:
            - name: search-professionals
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

On request for an architecture review, pulls the current architecture diagram from SharePoint, retrieves infrastructure inventory from ServiceNow CMDB, generates a technology radar summary via Confluence, and notifies the architecture review board via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Enterprise Architecture Review Orchestrator"
  description: "On request for an architecture review, pulls the current architecture diagram from SharePoint, retrieves infrastructure inventory from ServiceNow CMDB, generates a technology radar summary via Confluence, and notifies the architecture review board via Microsoft Teams."
  tags:
    - advisory
    - enterprise-architecture
    - sharepoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ea-review
      port: 8080
      tools:
        - name: initiate-architecture-review
          description: "Given a client name and review scope, pull SharePoint diagrams, ServiceNow CMDB inventory, and notify the review board."
          inputParameters:
            - name: client_name
              in: body
              type: string
              description: "The client name for the architecture review."
            - name: review_scope
              in: body
              type: string
              description: "Scope of the architecture review (e.g., cloud, application, data)."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID containing architecture artifacts."
            - name: review_board_email
              in: body
              type: string
              description: "Email of the architecture review board lead."
          steps:
            - name: get-architecture-docs
              type: call
              call: "sharepoint.list-folder"
              with:
                site_id: "{{sharepoint_site_id}}"
                folder_path: "Architecture/{{client_name}}"
            - name: get-cmdb-inventory
              type: call
              call: "servicenow.get-cmdb-summary"
              with:
                client_name: "{{client_name}}"
            - name: create-review-record
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Architecture Review: {{client_name}} — {{review_scope}}"
                description: "Scope: {{review_scope}}. CMDB CIs: {{get-cmdb-inventory.ci_count}}. Architecture docs: {{get-architecture-docs.file_count}} files."
                assigned_group: "Enterprise_Architecture"
            - name: notify-board
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{review_board_email}}"
                text: "Architecture Review initiated for {{client_name}} ({{review_scope}}). CMDB CIs: {{get-cmdb-inventory.ci_count}}. Docs: {{get-architecture-docs.file_count}}. ServiceNow: {{create-review-record.number}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: folders
          path: "/{{site_id}}/drive/root:/{{folder_path}}:/children"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: list-folder
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.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=company={{client_name}}"
          inputParameters:
            - name: client_name
              in: query
          operations:
            - name: get-cmdb-summary
              method: GET
        - 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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Conducts ESG materiality assessments by collecting stakeholder survey data from Microsoft Forms, analyzing materiality in Databricks, generating assessment reports in SharePoint, and presenting findings via Teams.

naftiko: "0.5"
info:
  label: "ESG Materiality Assessment Orchestrator"
  description: "Conducts ESG materiality assessments by collecting stakeholder survey data from Microsoft Forms, analyzing materiality in Databricks, generating assessment reports in SharePoint, and presenting findings via Teams."
  tags:
    - esg
    - materiality
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: esg-materiality
      port: 8080
      tools:
        - name: conduct-materiality-assessment
          description: "Conduct an ESG materiality assessment for a client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: assessment_year
              in: body
              type: string
              description: "The assessment year."
            - name: engagement_team_email
              in: body
              type: string
              description: "Engagement team email."
          steps:
            - name: analyze-materiality
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM esg_materiality_scores WHERE client_id = '{{client_id}}' AND year = '{{assessment_year}}' ORDER BY materiality_score DESC"
            - name: generate-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "esg-advisory"
                folder_path: "{{client_id}}/Materiality/{{assessment_year}}"
                template: "materiality_assessment"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{engagement_team_email}}"
                text: "ESG materiality assessment complete for {{client_id}} ({{assessment_year}}). Top material topics: {{analyze-materiality.top_topics}}. Report: {{generate-report.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Collects ESG metrics from SAP Sustainability, retrieves carbon footprint data from an external provider, compiles the report in SharePoint, updates the Salesforce engagement record, and notifies the ESG practice lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ESG Reporting Data Collection Pipeline"
  description: "Collects ESG metrics from SAP Sustainability, retrieves carbon footprint data from an external provider, compiles the report in SharePoint, updates the Salesforce engagement record, and notifies the ESG practice lead via Microsoft Teams."
  tags:
    - advisory
    - esg
    - sustainability
    - sap
    - sharepoint
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: esg-reporting
      port: 8080
      tools:
        - name: collect-esg-data
          description: "Given a client company code and reporting year, pull SAP sustainability metrics, compile a SharePoint report, update Salesforce, and notify the ESG lead."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "Client SAP company code."
            - name: reporting_year
              in: body
              type: string
              description: "ESG reporting year (YYYY)."
            - name: salesforce_opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID for the ESG engagement."
            - name: esg_lead_email
              in: body
              type: string
              description: "Email of the ESG practice lead."
          steps:
            - name: get-sustainability-data
              type: call
              call: "sap.get-sustainability-metrics"
              with:
                company_code: "{{company_code}}"
                year: "{{reporting_year}}"
            - name: compile-esg-report
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "esg_advisory_site"
                file_path: "Reports/{{company_code}}_ESG_{{reporting_year}}.xlsx"
                content: "ESG Report {{reporting_year}}. Scope 1: {{get-sustainability-data.scope1_emissions}}. Scope 2: {{get-sustainability-data.scope2_emissions}}. Energy consumption: {{get-sustainability-data.energy_kwh}}."
            - name: update-engagement
              type: call
              call: "salesforce.update-opportunity"
              with:
                opportunity_id: "{{salesforce_opportunity_id}}"
                description: "ESG report compiled for {{reporting_year}}. Report: {{compile-esg-report.url}}"
                stage: "Deliverable Complete"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{esg_lead_email}}"
                text: "ESG data collection complete for {{company_code}} ({{reporting_year}}). Scope 1: {{get-sustainability-data.scope1_emissions}} tCO2e. Scope 2: {{get-sustainability-data.scope2_emissions}} tCO2e. Report: {{compile-esg-report.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-s4.sap.com/sap/opu/odata/sap/API_SUSTAINABILITY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: sustainability
          path: "/SustainabilityMetricSet?$filter=CompanyCode eq '{{company_code}}' and Year eq '{{year}}'"
          inputParameters:
            - name: company_code
              in: query
            - name: year
              in: query
          operations:
            - name: get-sustainability-metrics
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.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

Tests financial close processes by extracting journal entries from SAP, performing analytics in Databricks, documenting findings in SharePoint, and notifying the audit team.

naftiko: "0.5"
info:
  label: "Financial Close Testing Pipeline"
  description: "Tests financial close processes by extracting journal entries from SAP, performing analytics in Databricks, documenting findings in SharePoint, and notifying the audit team."
  tags:
    - audit
    - financial-close
    - sap
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: close-testing
      port: 8080
      tools:
        - name: test-financial-close
          description: "Perform financial close testing procedures."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The audit engagement ID."
            - name: period_end
              in: body
              type: string
              description: "Period end date in YYYY-MM-DD format."
          steps:
            - name: extract-journal-entries
              type: call
              call: "sap.get-journal-entries"
              with:
                period_end: "{{period_end}}"
            - name: analyze-entries
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM journal_entry_analytics WHERE period_end = '{{period_end}}' AND risk_flag = true"
            - name: document-findings
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/CloseTestingResults"
                template: "close_testing_workpaper"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: journal-entries
          path: "/GL_SRV/JournalEntries"
          operations:
            - name: get-journal-entries
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

Extracts financial statement data from SAP, runs analytical procedures through Azure Databricks, generates variance analysis in Power BI, stores the working paper in SharePoint, and alerts the audit senior via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Financial Statement Analytics Pipeline"
  description: "Extracts financial statement data from SAP, runs analytical procedures through Azure Databricks, generates variance analysis in Power BI, stores the working paper in SharePoint, and alerts the audit senior via Microsoft Teams."
  tags:
    - audit
    - analytics
    - sap
    - azure-databricks
    - power-bi
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: audit-fs-analytics
      port: 8080
      tools:
        - name: run-fs-analytics
          description: "Given a company code and fiscal year, extract SAP data, run Databricks analytics, refresh Power BI, save workpaper, and notify the audit senior."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year (YYYY)."
            - name: audit_senior_email
              in: body
              type: string
              description: "Email of the audit senior."
            - name: databricks_job_id
              in: body
              type: string
              description: "Databricks analytics job ID."
            - name: powerbi_dataset_id
              in: body
              type: string
              description: "Power BI dataset GUID for the audit dashboard."
          steps:
            - name: extract-financials
              type: call
              call: "sap.get-financial-statements"
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
            - name: run-analytics
              type: call
              call: "databricks.run-job"
              with:
                job_id: "{{databricks_job_id}}"
                parameters: "{\"company_code\":\"{{company_code}}\",\"fiscal_year\":\"{{fiscal_year}}\"}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "audit_workspace"
                dataset_id: "{{powerbi_dataset_id}}"
            - name: save-workpaper
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "audit_engagements_site"
                file_path: "Analytics/{{company_code}}_FY{{fiscal_year}}_fs_analytics.xlsx"
            - name: notify-senior
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{audit_senior_email}}"
                text: "FS analytics complete for {{company_code}} FY{{fiscal_year}}. Databricks job: {{run-analytics.run_id}}. Power BI refreshed. Workpaper: {{save-workpaper.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-s4.sap.com/sap/opu/odata/sap/API_FINANCIALSTATEMENT"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: financial-statements
          path: "/FinancialStatementSet?$filter=CompanyCode eq '{{company_code}}' and FiscalYear eq '{{fiscal_year}}'"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_year
              in: query
          operations:
            - name: get-financial-statements
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://adb-kpmg.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              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/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the status and findings summary from Fortify application security scans used in security assessment engagements.

naftiko: "0.5"
info:
  label: "Fortify Vulnerability Scan Status"
  description: "Retrieves the status and findings summary from Fortify application security scans used in security assessment engagements."
  tags:
    - cybersecurity
    - fortify
capability:
  exposes:
    - type: mcp
      namespace: appsec
      port: 8080
      tools:
        - name: get-fortify-scan
          description: "Get Fortify scan status and findings summary."
          inputParameters:
            - name: application_id
              in: body
              type: string
              description: "The Fortify application identifier."
          call: "fortify.get-scan-summary"
          with:
            application_id: "{{application_id}}"
          outputParameters:
            - name: critical_count
              type: integer
              mapping: "$.issueSummary.critical"
            - name: high_count
              type: integer
              mapping: "$.issueSummary.high"
            - name: scan_date
              type: string
              mapping: "$.scanDate"
  consumes:
    - type: http
      namespace: fortify
      baseUri: "https://kpmg-fortify.fortify.com/ssc/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fortify_token"
      resources:
        - name: applications
          path: "/projectVersions/{{application_id}}/issueSummaries"
          inputParameters:
            - name: application_id
              in: path
          operations:
            - name: get-scan-summary
              method: GET

Performs fraud risk assessments by analyzing transaction patterns in Databricks, cross-referencing with known fraud indicators, generating risk reports in SharePoint, and alerting the forensics team.

naftiko: "0.5"
info:
  label: "Fraud Risk Assessment Pipeline"
  description: "Performs fraud risk assessments by analyzing transaction patterns in Databricks, cross-referencing with known fraud indicators, generating risk reports in SharePoint, and alerting the forensics team."
  tags:
    - forensics
    - fraud
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fraud-assessment
      port: 8080
      tools:
        - name: assess-fraud-risk
          description: "Perform a fraud risk assessment on client transaction data."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: analysis_period
              in: body
              type: string
              description: "Analysis period (e.g., 2025-Q4)."
            - name: forensics_email
              in: body
              type: string
              description: "Forensics team email."
          steps:
            - name: analyze-transactions
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM transaction_fraud_indicators WHERE client_id = '{{client_id}}' AND period = '{{analysis_period}}' AND risk_score > 0.8"
            - name: generate-risk-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "forensics"
                folder_path: "{{client_id}}/FraudAssessment/{{analysis_period}}"
                template: "fraud_risk_report"
            - name: alert-forensics
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{forensics_email}}"
                text: "Fraud risk assessment for {{client_id}} ({{analysis_period}}): {{analyze-transactions.high_risk_count}} high-risk transactions identified. Report: {{generate-risk-report.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              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

On receipt of a DSAR, looks up the data subject in Workday, searches for their data across Salesforce and ServiceNow, compiles a report in SharePoint, and notifies the DPO via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GDPR Data Subject Access Request Pipeline"
  description: "On receipt of a DSAR, looks up the data subject in Workday, searches for their data across Salesforce and ServiceNow, compiles a report in SharePoint, and notifies the DPO via Microsoft Teams."
  tags:
    - compliance
    - gdpr
    - privacy
    - workday
    - salesforce
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: gdpr-dsar
      port: 8080
      tools:
        - name: process-dsar
          description: "Given a data subject email and request ID, search across Workday, Salesforce, and ServiceNow, compile a report in SharePoint, and notify the DPO."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The DSAR request identifier."
            - name: data_subject_email
              in: body
              type: string
              description: "Email of the data subject."
            - name: dpo_email
              in: body
              type: string
              description: "Email of the Data Protection Officer."
          steps:
            - name: search-workday
              type: call
              call: "workday.search-worker"
              with:
                email: "{{data_subject_email}}"
            - name: search-salesforce
              type: call
              call: "salesforce.search-contact"
              with:
                email: "{{data_subject_email}}"
            - name: search-servicenow
              type: call
              call: "servicenow.search-user"
              with:
                email: "{{data_subject_email}}"
            - name: compile-report
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "gdpr_dsar_site"
                file_path: "Reports/DSAR_{{request_id}}_{{data_subject_email}}.docx"
                content: "DSAR Report {{request_id}}. Subject: {{data_subject_email}}. Workday records: {{search-workday.record_count}}. Salesforce records: {{search-salesforce.record_count}}. ServiceNow records: {{search-servicenow.record_count}}."
            - name: notify-dpo
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{dpo_email}}"
                text: "DSAR {{request_id}} processed for {{data_subject_email}}. Records found — Workday: {{search-workday.record_count}}, Salesforce: {{search-salesforce.record_count}}, ServiceNow: {{search-servicenow.record_count}}. Report: {{compile-report.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers?email={{email}}"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-worker
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/parameterizedSearch/?q={{email}}&sobject=Contact"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-contact
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: users
          path: "/table/sys_user?sysparm_query=email={{email}}"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-user
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Calculates tax equalization for globally mobile employees by extracting compensation data from Workday, running multi-jurisdiction tax calculations in Databricks, and generating equalization reports.

naftiko: "0.5"
info:
  label: "Global Mobility Tax Equalization Pipeline"
  description: "Calculates tax equalization for globally mobile employees by extracting compensation data from Workday, running multi-jurisdiction tax calculations in Databricks, and generating equalization reports."
  tags:
    - tax
    - global-mobility
    - workday
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: global-mobility
      port: 8080
      tools:
        - name: calculate-tax-equalization
          description: "Calculate tax equalization for a mobile employee."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The employee ID."
            - name: home_country
              in: body
              type: string
              description: "Home country code."
            - name: host_country
              in: body
              type: string
              description: "Host country code."
          steps:
            - name: get-compensation
              type: call
              call: "workday.get-compensation"
              with:
                employee_id: "{{employee_id}}"
            - name: calculate-equalization
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM tax_equalization WHERE employee_id = '{{employee_id}}' AND home = '{{home_country}}' AND host = '{{host_country}}'"
            - name: generate-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "global-mobility"
                folder_path: "TaxEqualization/{{employee_id}}"
                template: "tax_equalization_report"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/kpmg"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{employee_id}}/compensation"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-compensation
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

Retrieves IAM policy bindings for a Google Cloud Platform project, returning roles and members. Used by cloud advisory teams for access review audits.

naftiko: "0.5"
info:
  label: "Google Cloud Platform Project IAM Lookup"
  description: "Retrieves IAM policy bindings for a Google Cloud Platform project, returning roles and members. Used by cloud advisory teams for access review audits."
  tags:
    - cloud
    - google-cloud-platform
    - iam
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: gcp-iam
      port: 8080
      tools:
        - name: get-gcp-iam-policy
          description: "Look up IAM policy bindings for a GCP project by project ID."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GCP project ID."
          call: "gcp.get-iam-policy"
          with:
            project_id: "{{project_id}}"
          outputParameters:
            - name: bindings
              type: string
              mapping: "$.bindings"
            - name: etag
              type: string
              mapping: "$.etag"
  consumes:
    - type: http
      namespace: gcp
      baseUri: "https://cloudresourcemanager.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: iam-policies
          path: "/projects/{{project_id}}:getIamPolicy"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-iam-policy
              method: POST

Supports IFRS conversion by extracting GAAP financial data from SAP, running conversion calculations in Databricks, and generating conversion workpapers in SharePoint.

naftiko: "0.5"
info:
  label: "IFRS Conversion Advisory Pipeline"
  description: "Supports IFRS conversion by extracting GAAP financial data from SAP, running conversion calculations in Databricks, and generating conversion workpapers in SharePoint."
  tags:
    - advisory
    - ifrs
    - sap
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: ifrs-conversion
      port: 8080
      tools:
        - name: run-ifrs-conversion
          description: "Run IFRS conversion analysis for a client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier." 
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year." 
          steps:
            - name: extract-gaap-data
              type: call
              call: "sap.get-financials"
              with:
                client_id: "{{client_id}}"
                standard: "US-GAAP"
            - name: convert-to-ifrs
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM ifrs_conversion WHERE client_id = '{{client_id}}'"
            - name: create-workpaper
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "advisory"
                folder_path: "{{client_id}}/IFRS/{{fiscal_year}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password" 
      resources:
        - name: financials
          path: "/FI_SRV/FinancialStatements"
          operations:
            - name: get-financials
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token" 
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

Manages cybersecurity incident response by creating cases in ServiceNow, deploying investigation runbooks from Confluence, collecting evidence in SharePoint, and coordinating the response team via Teams.

naftiko: "0.5"
info:
  label: "Incident Response Retainer Orchestrator"
  description: "Manages cybersecurity incident response by creating cases in ServiceNow, deploying investigation runbooks from Confluence, collecting evidence in SharePoint, and coordinating the response team via Teams."
  tags:
    - cybersecurity
    - incident-response
    - servicenow
    - confluence
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: activate-ir
          description: "Activate cybersecurity incident response for a retainer client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier." 
            - name: incident_severity
              in: body
              type: string
              description: "Incident severity (P1, P2, P3)." 
            - name: ir_lead_email
              in: body
              type: string
              description: "IR lead email." 
          steps:
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Cyber IR: {{client_id}} - {{incident_severity}}"
                urgency: "1"
            - name: get-runbook
              type: call
              call: "confluence.search"
              with:
                cql: "label = 'ir-runbook' AND label = '{{incident_severity}}'"
            - name: create-evidence-folder
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "cyber-ir"
                folder_path: "{{client_id}}/{{create-case.number}}"
            - name: mobilize-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{ir_lead_email}}"
                text: "IR ACTIVATED: {{client_id}} ({{incident_severity}}). Case: {{create-case.number}}. Runbook: {{get-runbook.url}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.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: confluence
      baseUri: "https://kpmg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              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

Scans SAP Ariba purchase transactions for recoverable VAT and GST, validates against jurisdiction rules in Snowflake, generates claim documentation, and files recovery requests through the tax portal.

naftiko: "0.5"
info:
  label: "Indirect Tax Recovery Orchestrator"
  description: "Scans SAP Ariba purchase transactions for recoverable VAT and GST, validates against jurisdiction rules in Snowflake, generates claim documentation, and files recovery requests through the tax portal."
  tags:
    - tax
    - finance
    - sap-ariba
    - snowflake
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: tax-recovery
      port: 8080
      tools:
        - name: process-indirect-tax-recovery
          description: "Given a client ID and date range, scan purchase transactions for recoverable indirect taxes, validate eligibility, and generate claim files."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client engagement identifier."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-purchase-transactions
              type: call
              call: "sap-ariba.get-purchase-orders"
              with:
                client_id: "{{client_id}}"
                from: "{{start_date}}"
                to: "{{end_date}}"
            - name: validate-recovery-rules
              type: call
              call: "snowflake.run-tax-rule-validation"
              with:
                transactions: "{{get-purchase-transactions.orders}}"
            - name: generate-claim-docs
              type: call
              call: "sharepoint.upload-document"
              with:
                library: "TaxRecoveryClaims"
                filename: "indirect-tax-claim-{{client_id}}-{{start_date}}.pdf"
                data: "{{validate-recovery-rules.claim_data}}"
            - name: notify-engagement-team
              type: call
              call: "msteams.post-message"
              with:
                channel: "tax-recovery-{{client_id}}"
                message: "Indirect tax recovery claim generated: {{validate-recovery-rules.recoverable_amount}} across {{validate-recovery-rules.jurisdiction_count}} jurisdictions."
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://api.ariba.com/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: purchase-orders
          path: "/procurement/purchase-orders"
          operations:
            - name: get-purchase-orders
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://kpmg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: run-tax-rule-validation
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/kpmg.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/drive/items"
          operations:
            - name: upload-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/teams/channels/messages"
          operations:
            - name: post-message
              method: POST

Retrieves the status of an Informatica Cloud data quality job run, returning execution state, row counts, and error summary. Used by data governance teams for ETL monitoring.

naftiko: "0.5"
info:
  label: "Informatica Data Quality Job Status"
  description: "Retrieves the status of an Informatica Cloud data quality job run, returning execution state, row counts, and error summary. Used by data governance teams for ETL monitoring."
  tags:
    - data-governance
    - informatica
    - etl
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: get-informatica-job-status
          description: "Look up an Informatica Cloud data quality job run by run ID."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The Informatica Cloud job run ID."
          call: "informatica.get-activity-run"
          with:
            run_id: "{{run_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: rows_success
              type: string
              mapping: "$.successRowsCount"
            - name: rows_error
              type: string
              mapping: "$.errorRowsCount"
            - name: start_time
              type: string
              mapping: "$.startTime"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: activity-runs
          path: "/activity/activityMonitor/{{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-activity-run
              method: GET

Queries SAP for intercompany receivables and payables, matches offsetting entries in Snowflake, flags unreconciled balances, and posts elimination journal entries for consolidated financial statements.

naftiko: "0.5"
info:
  label: "Intercompany Transaction Elimination Pipeline"
  description: "Queries SAP for intercompany receivables and payables, matches offsetting entries in Snowflake, flags unreconciled balances, and posts elimination journal entries for consolidated financial statements."
  tags:
    - audit
    - finance
    - sap
    - snowflake
    - consolidation
capability:
  exposes:
    - type: mcp
      namespace: audit-consolidation
      port: 8080
      tools:
        - name: eliminate-intercompany-transactions
          description: "Given a reporting period and entity list, retrieve intercompany balances from SAP, match in Snowflake, flag exceptions, and post elimination entries."
          inputParameters:
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period in YYYY-MM format."
            - name: entity_ids
              in: body
              type: array
              description: "List of legal entity IDs to consolidate."
          steps:
            - name: get-intercompany-balances
              type: call
              call: "sap.get-intercompany-balances"
              with:
                period: "{{reporting_period}}"
                entities: "{{entity_ids}}"
            - name: match-offsetting-entries
              type: call
              call: "snowflake.run-intercompany-match"
              with:
                balances: "{{get-intercompany-balances.data}}"
                period: "{{reporting_period}}"
            - name: flag-exceptions
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Intercompany reconciliation exceptions for {{reporting_period}}"
                description: "Unmatched items: {{match-offsetting-entries.unmatched_count}}"
                category: "audit_finding"
            - name: post-elimination-entries
              type: call
              call: "sap.post-journal-entry"
              with:
                period: "{{reporting_period}}"
                entries: "{{match-offsetting-entries.elimination_entries}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.s4hana.cloud/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: intercompany
          path: "/intercompany/balances"
          operations:
            - name: get-intercompany-balances
              method: GET
        - name: journal-entries
          path: "/journal-entries"
          operations:
            - name: post-journal-entry
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://kpmg.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: run-intercompany-match
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When an internal audit finding is identified, creates the finding in ServiceNow GRC, assigns a Jira remediation task to the control owner, and notifies the audit committee distribution list in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Internal Audit Finding Workflow"
  description: "When an internal audit finding is identified, creates the finding in ServiceNow GRC, assigns a Jira remediation task to the control owner, and notifies the audit committee distribution list in Microsoft Teams."
  tags:
    - internal-audit
    - governance
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: internal-audit
      port: 8080
      tools:
        - name: log-audit-finding
          description: "Given finding details, create a ServiceNow GRC finding, assign a Jira remediation task, and notify the audit committee via Microsoft Teams."
          inputParameters:
            - name: finding_title
              in: body
              type: string
              description: "Title of the audit finding."
            - name: finding_description
              in: body
              type: string
              description: "Detailed description of the finding."
            - name: severity
              in: body
              type: string
              description: "Finding severity (critical, high, medium, low)."
            - name: control_owner_email
              in: body
              type: string
              description: "Email of the control owner responsible for remediation."
            - name: audit_committee_channel
              in: body
              type: string
              description: "Microsoft Teams channel ID for the audit committee."
          steps:
            - name: create-grc-finding
              type: call
              call: "servicenow.create-finding"
              with:
                short_description: "{{finding_title}}"
                description: "{{finding_description}}"
                severity: "{{severity}}"
                assigned_to: "{{control_owner_email}}"
            - name: create-remediation-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "IAUDIT"
                issue_type: "Task"
                summary: "Remediate: {{finding_title}}"
                description: "Severity: {{severity}}. GRC Finding: {{create-grc-finding.number}}. {{finding_description}}"
                assignee: "{{control_owner_email}}"
            - name: notify-committee
              type: call
              call: "msteams.send-channel-message"
              with:
                channel_id: "{{audit_committee_channel}}"
                text: "Internal Audit Finding: {{finding_title}} ({{severity}}). GRC: {{create-grc-finding.number}}. Remediation: {{create-remediation-task.key}}. Owner: {{control_owner_email}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: findings
          path: "/table/sn_audit_finding"
          operations:
            - name: create-finding
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.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: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Conducts internal controls walkthroughs by extracting process documentation from Confluence, creating testing workpapers in SharePoint, assigning tasks in Jira, and notifying the audit team.

naftiko: "0.5"
info:
  label: "Internal Controls Walkthrough Orchestrator"
  description: "Conducts internal controls walkthroughs by extracting process documentation from Confluence, creating testing workpapers in SharePoint, assigning tasks in Jira, and notifying the audit team."
  tags:
    - audit
    - internal-controls
    - confluence
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: controls-walkthrough
      port: 8080
      tools:
        - name: conduct-walkthrough
          description: "Conduct an internal controls walkthrough for a client process."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The audit engagement ID."
            - name: process_name
              in: body
              type: string
              description: "The business process name."
            - name: team_email
              in: body
              type: string
              description: "Audit team email."
          steps:
            - name: get-process-docs
              type: call
              call: "confluence.search"
              with:
                cql: "label = '{{process_name}}' AND space = 'CONTROLS'"
            - name: create-testing-workpaper
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/Controls/{{process_name}}"
                template: "controls_walkthrough"
            - name: assign-testing-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "AUDIT"
                summary: "Controls walkthrough: {{process_name}} - {{engagement_id}}"
                description: "Process documentation: {{get-process-docs.url}}. Workpaper: {{create-testing-workpaper.url}}."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{team_email}}"
                text: "Controls walkthrough initiated for {{process_name}} on engagement {{engagement_id}}. Workpaper: {{create-testing-workpaper.url}}. Jira: {{assign-testing-tasks.key}}."
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://kpmg.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Manages audit inventory observations by extracting book values from SAP, creating observation workpapers in SharePoint, and tracking exceptions in Jira.

naftiko: "0.5"
info:
  label: "Inventory Observation Orchestrator"
  description: "Manages audit inventory observations by extracting book values from SAP, creating observation workpapers in SharePoint, and tracking exceptions in Jira."
  tags:
    - audit
    - inventory
    - sap
    - sharepoint
    - jira
capability:
  exposes:
    - type: mcp
      namespace: inventory-observation
      port: 8080
      tools:
        - name: manage-observation
          description: "Manage audit inventory observation procedures."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier." 
            - name: warehouse_location
              in: body
              type: string
              description: "Warehouse location code." 
          steps:
            - name: get-book-values
              type: call
              call: "sap.get-inventory"
              with:
                location: "{{warehouse_location}}"
            - name: create-workpaper
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit"
                folder_path: "{{engagement_id}}/Inventory/{{warehouse_location}}"
            - name: track-exceptions
              type: call
              call: "jira.create-issue"
              with:
                project: "AUDIT"
                summary: "Inventory observation: {{engagement_id}} - {{warehouse_location}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password" 
      resources:
        - name: inventory
          path: "/MM_SRV/InventoryValues"
          operations:
            - name: get-inventory
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.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

Conducts IT audit access reviews by extracting user access lists from Azure AD, comparing against authorized roles in ServiceNow, documenting exceptions in SharePoint, and notifying the IT audit team.

naftiko: "0.5"
info:
  label: "IT Audit Access Review Orchestrator"
  description: "Conducts IT audit access reviews by extracting user access lists from Azure AD, comparing against authorized roles in ServiceNow, documenting exceptions in SharePoint, and notifying the IT audit team."
  tags:
    - it-audit
    - access-review
    - azure-ad
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-access-review
      port: 8080
      tools:
        - name: conduct-access-review
          description: "Conduct an IT audit user access review."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement ID."
            - name: application_name
              in: body
              type: string
              description: "The application under review."
            - name: it_audit_email
              in: body
              type: string
              description: "IT audit team email."
          steps:
            - name: extract-access-list
              type: call
              call: "azuread.get-app-users"
              with:
                application_name: "{{application_name}}"
            - name: compare-authorized-roles
              type: call
              call: "servicenow.get-authorized-access"
              with:
                application: "{{application_name}}"
            - name: document-exceptions
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/ITControls/AccessReview/{{application_name}}"
                template: "access_review_workpaper"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{it_audit_email}}"
                text: "Access review for {{application_name}} ({{engagement_id}}): {{extract-access-list.user_count}} users. Exceptions: {{compare-authorized-roles.exception_count}}. Workpaper: {{document-exceptions.url}}."
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: app-users
          path: "/applications/{{application_name}}/appRoleAssignedTo"
          inputParameters:
            - name: application_name
              in: path
          operations:
            - name: get-app-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: access
          path: "/table/sys_user_role"
          operations:
            - name: get-authorized-access
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              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

Executes IT general controls testing by pulling access logs from Azure Active Directory, comparing against authorized user lists in ServiceNow, documenting exceptions in SharePoint, and notifying the IT audit lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "IT General Controls Testing Orchestrator"
  description: "Executes IT general controls testing by pulling access logs from Azure Active Directory, comparing against authorized user lists in ServiceNow, documenting exceptions in SharePoint, and notifying the IT audit lead via Microsoft Teams."
  tags:
    - audit
    - itgc
    - azure-active-directory
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itgc-testing
      port: 8080
      tools:
        - name: test-access-controls
          description: "Given an application name and testing period, pull Azure AD sign-in logs, compare against ServiceNow authorized users, document exceptions, and notify the IT audit lead."
          inputParameters:
            - name: application_name
              in: body
              type: string
              description: "Name of the application under ITGC testing."
            - name: application_id
              in: body
              type: string
              description: "Azure AD application ID."
            - name: testing_period_start
              in: body
              type: string
              description: "Testing period start (YYYY-MM-DD)."
            - name: testing_period_end
              in: body
              type: string
              description: "Testing period end (YYYY-MM-DD)."
            - name: it_audit_lead_email
              in: body
              type: string
              description: "Email of the IT audit lead."
          steps:
            - name: get-sign-in-logs
              type: call
              call: "azuread.get-sign-in-logs"
              with:
                application_id: "{{application_id}}"
                date_from: "{{testing_period_start}}"
                date_to: "{{testing_period_end}}"
            - name: get-authorized-users
              type: call
              call: "servicenow.get-authorized-users"
              with:
                application_name: "{{application_name}}"
            - name: document-exceptions
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "itgc_testing_site"
                file_path: "ITGC/{{application_name}}_access_{{testing_period_start}}_to_{{testing_period_end}}.xlsx"
                content: "Application: {{application_name}}. Period: {{testing_period_start}} to {{testing_period_end}}. Sign-ins: {{get-sign-in-logs.total_count}}. Authorized users: {{get-authorized-users.user_count}}. Unauthorized access attempts: {{get-sign-in-logs.unauthorized_count}}."
            - name: notify-audit-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{it_audit_lead_email}}"
                text: "ITGC access test for {{application_name}} ({{testing_period_start}} to {{testing_period_end}}). Sign-ins: {{get-sign-in-logs.total_count}}. Unauthorized: {{get-sign-in-logs.unauthorized_count}}. Report: {{document-exceptions.url}}."
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: sign-in-logs
          path: "/auditLogs/signIns?$filter=appId eq '{{application_id}}' and createdDateTime ge {{date_from}} and createdDateTime le {{date_to}}"
          inputParameters:
            - name: application_id
              in: query
            - name: date_from
              in: query
            - name: date_to
              in: query
          operations:
            - name: get-sign-in-logs
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: authorized-users
          path: "/table/sys_user_has_role?sysparm_query=role.application={{application_name}}"
          inputParameters:
            - name: application_name
              in: query
          operations:
            - name: get-authorized-users
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Jira issue by key, returning summary, status, assignee, and priority. Used by consulting and advisory teams to track project delivery milestones.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority. Used by consulting and advisory teams to track project delivery milestones."
  tags:
    - project-management
    - jira
    - consulting
capability:
  exposes:
    - type: mcp
      namespace: project-tracking
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key and return its current status and assignment."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., AUDIT-1234)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Supports lease accounting under ASC 842 by extracting lease data from SAP, calculating right-of-use assets in Databricks, and generating disclosure workpapers in SharePoint.

naftiko: "0.5"
info:
  label: "Lease Accounting ASC 842 Pipeline"
  description: "Supports lease accounting under ASC 842 by extracting lease data from SAP, calculating right-of-use assets in Databricks, and generating disclosure workpapers in SharePoint."
  tags:
    - audit
    - lease-accounting
    - sap
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: lease-accounting
      port: 8080
      tools:
        - name: analyze-leases
          description: "Analyze client leases for ASC 842 compliance."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement ID."
            - name: client_id
              in: body
              type: string
              description: "The client ID."
          steps:
            - name: extract-leases
              type: call
              call: "sap.get-lease-data"
              with:
                client_id: "{{client_id}}"
            - name: calculate-rou-assets
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM lease_calculations WHERE client_id = '{{client_id}}' AND standard = 'ASC842'"
            - name: create-workpaper
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/LeaseAccounting"
                template: "asc842_workpaper"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: leases
          path: "/RE_SRV/Leases"
          operations:
            - name: get-lease-data
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

On deal initiation, creates a SharePoint deal room, provisions Jira tracking board, pulls target company financials from Bloomberg, logs the engagement in Salesforce, and notifies the deal team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "M&A Due Diligence Pipeline"
  description: "On deal initiation, creates a SharePoint deal room, provisions Jira tracking board, pulls target company financials from Bloomberg, logs the engagement in Salesforce, and notifies the deal team in Microsoft Teams."
  tags:
    - advisory
    - mergers-and-acquisitions
    - due-diligence
    - sharepoint
    - jira
    - bloomberg
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ma-advisory
      port: 8080
      tools:
        - name: initiate-due-diligence
          description: "Given a target company name and deal lead email, provision deal room, Jira board, pull Bloomberg data, log in Salesforce, and notify team."
          inputParameters:
            - name: target_company
              in: body
              type: string
              description: "Legal name of the target company."
            - name: deal_code
              in: body
              type: string
              description: "Internal deal/project code."
            - name: deal_lead_email
              in: body
              type: string
              description: "Email of the deal lead partner."
            - name: bloomberg_ticker
              in: body
              type: string
              description: "Bloomberg ticker for the target company."
          steps:
            - name: create-deal-room
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "ma_deal_rooms_site"
                folder_path: "Deals/{{deal_code}}_{{target_company}}"
            - name: create-deal-board
              type: call
              call: "jira.create-issue"
              with:
                project_key: "MADEAL"
                issue_type: "Epic"
                summary: "Due Diligence: {{target_company}} — {{deal_code}}"
                description: "Deal room: {{create-deal-room.url}}. Lead: {{deal_lead_email}}."
            - name: get-financials
              type: call
              call: "bloomberg.get-company-financials"
              with:
                ticker: "{{bloomberg_ticker}}"
            - name: log-opportunity
              type: call
              call: "salesforce.create-opportunity"
              with:
                name: "M&A Advisory: {{target_company}}"
                stage: "Due Diligence"
                deal_code: "{{deal_code}}"
                description: "Revenue: {{get-financials.revenue}}. EBITDA: {{get-financials.ebitda}}. Deal room: {{create-deal-room.url}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{deal_lead_email}}"
                text: "Due diligence initiated for {{target_company}} ({{deal_code}}). Revenue: {{get-financials.revenue}}. EBITDA: {{get-financials.ebitda}}. Deal room: {{create-deal-room.url}}. Jira: {{create-deal-board.key}}."
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.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: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: company-data
          path: "/data/{{ticker}}/financials"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-company-financials
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors SLA compliance for managed services engagements by pulling metrics from Datadog, comparing against SLA thresholds in Salesforce, and alerting service managers via Teams.

naftiko: "0.5"
info:
  label: "Managed Services SLA Monitoring Pipeline"
  description: "Monitors SLA compliance for managed services engagements by pulling metrics from Datadog, comparing against SLA thresholds in Salesforce, and alerting service managers via Teams."
  tags:
    - managed-services
    - sla
    - datadog
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sla-monitoring
      port: 8080
      tools:
        - name: monitor-sla-compliance
          description: "Monitor SLA compliance for a managed services engagement."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier." 
            - name: service_manager_email
              in: body
              type: string
              description: "Service manager email." 
          steps:
            - name: get-metrics
              type: call
              call: "datadog.get-sla-metrics"
              with:
                engagement_id: "{{engagement_id}}"
            - name: check-thresholds
              type: call
              call: "salesforce.get-sla-thresholds"
              with:
                engagement_id: "{{engagement_id}}"
            - name: alert-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{service_manager_email}}"
                text: "SLA report for {{engagement_id}}: Uptime {{get-metrics.uptime}}%. Breaches: {{get-metrics.breach_count}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        header: "DD-API-KEY"
        key: "$secrets.datadog_api_key" 
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: get-sla-metrics
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: sla
          path: "/sobjects/SLAThreshold__c"
          operations:
            - name: get-sla-thresholds
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a customer account record from Microsoft Dynamics 365 by account ID, returning name, revenue, industry, and primary contact. Used by advisory teams for client intelligence.

naftiko: "0.5"
info:
  label: "Microsoft Dynamics 365 Customer Lookup"
  description: "Retrieves a customer account record from Microsoft Dynamics 365 by account ID, returning name, revenue, industry, and primary contact. Used by advisory teams for client intelligence."
  tags:
    - advisory
    - crm
    - microsoft-dynamics
    - client-intelligence
capability:
  exposes:
    - type: mcp
      namespace: crm-dynamics
      port: 8080
      tools:
        - name: get-dynamics-account
          description: "Look up a Microsoft Dynamics 365 customer account by ID."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Dynamics 365 account GUID."
          call: "dynamics.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: revenue
              type: string
              mapping: "$.revenue"
            - name: industry
              type: string
              mapping: "$.industrycode@OData.Community.Display.V1.FormattedValue"
            - name: primary_contact
              type: string
              mapping: "$.primarycontactid.fullname"
  consumes:
    - type: http
      namespace: dynamics
      baseUri: "https://kpmg.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

Retrieves client invoice details from Microsoft Dynamics 365, including amount, status, and payment terms.

naftiko: "0.5"
info:
  label: "Microsoft Dynamics Invoice Lookup"
  description: "Retrieves client invoice details from Microsoft Dynamics 365, including amount, status, and payment terms."
  tags:
    - billing
    - microsoft-dynamics
capability:
  exposes:
    - type: mcp
      namespace: client-billing
      port: 8080
      tools:
        - name: get-invoice
          description: "Look up a client invoice by invoice number in Dynamics 365."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The invoice number."
          call: "dynamics.get-invoice"
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: amount
              type: number
              mapping: "$.value[0].totalamount"
            - name: status
              type: string
              mapping: "$.value[0].statuscode"
            - name: due_date
              type: string
              mapping: "$.value[0].duedate"
  consumes:
    - type: http
      namespace: dynamics
      baseUri: "https://kpmg.api.crm.dynamics.com/api/data/v9.2"
      authentication:
        type: bearer
        token: "$secrets.dynamics_token"
      resources:
        - name: invoices
          path: "/invoices?$filter=invoicenumber eq '{{invoice_number}}'"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET

Retrieves a Microsoft Sentinel security alert by alert ID, returning severity, status, tactics, and affected entities. Used by cybersecurity advisory teams.

naftiko: "0.5"
info:
  label: "Microsoft Sentinel Security Alert Lookup"
  description: "Retrieves a Microsoft Sentinel security alert by alert ID, returning severity, status, tactics, and affected entities. Used by cybersecurity advisory teams."
  tags:
    - cybersecurity
    - microsoft-sentinel
    - security-operations
capability:
  exposes:
    - type: mcp
      namespace: security-sentinel
      port: 8080
      tools:
        - name: get-sentinel-alert
          description: "Look up a Microsoft Sentinel security alert by ID and return severity and tactic details."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
            - name: resource_group
              in: body
              type: string
              description: "Resource group name."
            - name: workspace_name
              in: body
              type: string
              description: "Log Analytics workspace name."
            - name: alert_id
              in: body
              type: string
              description: "The Sentinel alert ID."
          call: "sentinel.get-alert"
          with:
            subscription_id: "{{subscription_id}}"
            resource_group: "{{resource_group}}"
            workspace_name: "{{workspace_name}}"
            alert_id: "{{alert_id}}"
          outputParameters:
            - name: severity
              type: string
              mapping: "$.properties.severity"
            - name: status
              type: string
              mapping: "$.properties.status"
            - name: tactics
              type: string
              mapping: "$.properties.tactics"
            - name: alert_display_name
              type: string
              mapping: "$.properties.alertDisplayName"
  consumes:
    - type: http
      namespace: sentinel
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.OperationalInsights/workspaces/{{workspace_name}}/providers/Microsoft.SecurityInsights"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      inputParameters:
        - name: api-version
          in: query
          value: "2023-11-01"
      resources:
        - name: alerts
          path: "/incidents/{{alert_id}}"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
            - name: workspace_name
              in: path
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET

Retrieves API analytics from MuleSoft Anypoint Platform for a given API and environment, returning request counts, error rates, and average latency. Used by technology advisory teams.

naftiko: "0.5"
info:
  label: "MuleSoft API Analytics Lookup"
  description: "Retrieves API analytics from MuleSoft Anypoint Platform for a given API and environment, returning request counts, error rates, and average latency. Used by technology advisory teams."
  tags:
    - integration
    - mulesoft
    - api-management
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: api-analytics
      port: 8080
      tools:
        - name: get-api-analytics
          description: "Look up MuleSoft Anypoint API analytics by organization, environment, and API ID."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "MuleSoft Anypoint organization ID."
            - name: environment_id
              in: body
              type: string
              description: "Target environment ID."
            - name: api_id
              in: body
              type: string
              description: "The API instance ID."
          call: "mulesoft.get-analytics"
          with:
            org_id: "{{org_id}}"
            environment_id: "{{environment_id}}"
            api_id: "{{api_id}}"
          outputParameters:
            - name: total_requests
              type: string
              mapping: "$.total"
            - name: error_count
              type: string
              mapping: "$.errors"
            - name: avg_latency_ms
              type: string
              mapping: "$.averageResponseTime"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/analytics/1.0"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: analytics
          path: "/{{org_id}}/environments/{{environment_id}}/apis/{{api_id}}/events"
          inputParameters:
            - name: org_id
              in: path
            - name: environment_id
              in: path
            - name: api_id
              in: path
          operations:
            - name: get-analytics
              method: GET

Checks the health and performance status of APIs managed through the MuleSoft API gateway, returning uptime and error rates.

naftiko: "0.5"
info:
  label: "MuleSoft API Gateway Health Check"
  description: "Checks the health and performance status of APIs managed through the MuleSoft API gateway, returning uptime and error rates."
  tags:
    - integration
    - mulesoft
capability:
  exposes:
    - type: mcp
      namespace: api-health
      port: 8080
      tools:
        - name: check-api-health
          description: "Check the health status of a MuleSoft-managed API."
          inputParameters:
            - name: api_id
              in: body
              type: string
              description: "The MuleSoft API identifier."
          call: "mulesoft.get-api-status"
          with:
            api_id: "{{api_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: uptime_percentage
              type: number
              mapping: "$.metrics.uptime"
            - name: error_rate
              type: number
              mapping: "$.metrics.errorRate"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/apiplatform/repository/v2"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: apis
          path: "/organizations/kpmg/apis/{{api_id}}/status"
          inputParameters:
            - name: api_id
              in: path
          operations:
            - name: get-api-status
              method: GET

Retrieves vulnerability assessment scan results from Nessus for infrastructure security engagements.

naftiko: "0.5"
info:
  label: "Nessus Vulnerability Report Lookup"
  description: "Retrieves vulnerability assessment scan results from Nessus for infrastructure security engagements."
  tags:
    - cybersecurity
    - nessus
capability:
  exposes:
    - type: mcp
      namespace: vuln-assessment
      port: 8080
      tools:
        - name: get-nessus-report
          description: "Retrieve Nessus vulnerability scan report by scan ID."
          inputParameters:
            - name: scan_id
              in: body
              type: string
              description: "The Nessus scan identifier."
          call: "nessus.get-report"
          with:
            scan_id: "{{scan_id}}"
          outputParameters:
            - name: critical
              type: integer
              mapping: "$.hosts[0].critical"
            - name: high
              type: integer
              mapping: "$.hosts[0].high"
            - name: total_hosts
              type: integer
              mapping: "$.hostcount"
  consumes:
    - type: http
      namespace: nessus
      baseUri: "https://kpmg-nessus.kpmg.com:8834"
      authentication:
        type: apiKey
        header: "X-ApiKeys"
        key: "$secrets.nessus_api_keys"
      resources:
        - name: scans
          path: "/scans/{{scan_id}}"
          inputParameters:
            - name: scan_id
              in: path
          operations:
            - name: get-report
              method: GET

Retrieves an Oracle Cloud Financials journal entry by batch name and ledger, returning status, total debits, total credits, and posting date.

naftiko: "0.5"
info:
  label: "Oracle Cloud Financials Journal Entry Lookup"
  description: "Retrieves an Oracle Cloud Financials journal entry by batch name and ledger, returning status, total debits, total credits, and posting date."
  tags:
    - finance
    - oracle-cloud
    - general-ledger
    - journal-entry
capability:
  exposes:
    - type: mcp
      namespace: oracle-finance
      port: 8080
      tools:
        - name: get-journal-entry
          description: "Look up an Oracle Cloud Financials journal entry by batch name and ledger ID, then store the result in SharePoint for audit evidence."
          inputParameters:
            - name: batch_name
              in: body
              type: string
              description: "The journal batch name."
            - name: ledger_id
              in: body
              type: string
              description: "The Oracle ledger identifier."
            - name: engagement_id
              in: body
              type: string
              description: "The audit engagement ID for filing."
          steps:
            - name: fetch-journal
              type: call
              call: "oracle.get-journal"
              with:
                batch_name: "{{batch_name}}"
                ledger_id: "{{ledger_id}}"
            - name: store-evidence
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "audit_engagements_site"
                file_path: "Evidence/{{engagement_id}}/JE_{{batch_name}}.json"
                content: "Batch: {{batch_name}}. Status: {{fetch-journal.Status}}. Debits: {{fetch-journal.TotalEnteredDebitAmount}}. Credits: {{fetch-journal.TotalEnteredCreditAmount}}. Posted: {{fetch-journal.PostingDate}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://kpmg.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: journals
          path: "/journalBatches?q=BatchName='{{batch_name}}';LedgerId={{ledger_id}}"
          inputParameters:
            - name: batch_name
              in: query
            - name: ledger_id
              in: query
          operations:
            - name: get-journal
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT

Queries Palo Alto Networks threat intelligence feeds for indicators of compromise during cybersecurity assessments.

naftiko: "0.5"
info:
  label: "Palo Alto Network Threat Feed"
  description: "Queries Palo Alto Networks threat intelligence feeds for indicators of compromise during cybersecurity assessments."
  tags:
    - cybersecurity
    - palo-alto-networks
capability:
  exposes:
    - type: mcp
      namespace: threat-intel
      port: 8080
      tools:
        - name: query-threat-feed
          description: "Query threat intelligence for an indicator of compromise."
          inputParameters:
            - name: indicator
              in: body
              type: string
              description: "The IOC to query (IP, domain, hash)."
            - name: indicator_type
              in: body
              type: string
              description: "Type of indicator (ip, domain, filehash)."
          call: "paloalto.get-threat-intel"
          with:
            indicator: "{{indicator}}"
            type: "{{indicator_type}}"
          outputParameters:
            - name: threat_score
              type: integer
              mapping: "$.verdict.score"
            - name: classification
              type: string
              mapping: "$.verdict.classification"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://autofocus.paloaltonetworks.com/api/v1.0"
      authentication:
        type: apiKey
        header: "apiKey"
        key: "$secrets.paloalto_api_key"
      resources:
        - name: indicators
          path: "/samples/search"
          operations:
            - name: get-threat-intel
              method: POST

Retrieves firewall security rules from Palo Alto Networks Panorama by device group, returning rule names, source/destination zones, and actions. Used by cybersecurity advisory teams for firewall policy audits.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Firewall Rule Audit"
  description: "Retrieves firewall security rules from Palo Alto Networks Panorama by device group, returning rule names, source/destination zones, and actions. Used by cybersecurity advisory teams for firewall policy audits."
  tags:
    - cybersecurity
    - palo-alto-networks
    - firewall
    - audit
capability:
  exposes:
    - type: mcp
      namespace: firewall-audit
      port: 8080
      tools:
        - name: get-firewall-rules
          description: "Retrieve security rules from Palo Alto Panorama for a specified device group."
          inputParameters:
            - name: device_group
              in: body
              type: string
              description: "The Panorama device group name."
          call: "panorama.get-security-rules"
          with:
            device_group: "{{device_group}}"
          outputParameters:
            - name: rules
              type: string
              mapping: "$.result.entry"
            - name: rule_count
              type: string
              mapping: "$.result.@count"
  consumes:
    - type: http
      namespace: panorama
      baseUri: "https://panorama.kpmg.com/restapi/v10.2"
      authentication:
        type: apiKey
        key: "$secrets.panorama_api_key"
      inputParameters:
        - name: X-PAN-KEY
          in: header
          value: "$secrets.panorama_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?location=device-group&device-group={{device_group}}"
          inputParameters:
            - name: device_group
              in: query
          operations:
            - name: get-security-rules
              method: GET

Compiles penetration testing results from Nessus and Burp Suite, generates findings reports in SharePoint, creates remediation tasks in Jira, and notifies the client engagement lead.

naftiko: "0.5"
info:
  label: "Penetration Test Report Orchestrator"
  description: "Compiles penetration testing results from Nessus and Burp Suite, generates findings reports in SharePoint, creates remediation tasks in Jira, and notifies the client engagement lead."
  tags:
    - cybersecurity
    - penetration-testing
    - nessus
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pentest-reporting
      port: 8080
      tools:
        - name: compile-pentest-report
          description: "Compile penetration test findings into a client report."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement identifier."
            - name: scan_id
              in: body
              type: string
              description: "The Nessus scan ID."
            - name: lead_email
              in: body
              type: string
              description: "Engagement lead email."
          steps:
            - name: get-scan-results
              type: call
              call: "nessus.get-report"
              with:
                scan_id: "{{scan_id}}"
            - name: create-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "cyber-engagements"
                folder_path: "{{engagement_id}}/PenTestResults"
                template: "pentest_report"
            - name: create-remediation-tasks
              type: call
              call: "jira.create-issue"
              with:
                project: "CYBER"
                summary: "Remediation plan: {{engagement_id}} - {{get-scan-results.critical}} critical findings"
                description: "Report: {{create-report.url}}. Critical: {{get-scan-results.critical}}. High: {{get-scan-results.high}}."
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{lead_email}}"
                text: "Pentest report ready for {{engagement_id}}. Critical: {{get-scan-results.critical}}, High: {{get-scan-results.high}}. Report: {{create-report.url}}."
  consumes:
    - type: http
      namespace: nessus
      baseUri: "https://kpmg-nessus.kpmg.com:8834"
      authentication:
        type: apiKey
        header: "X-ApiKeys"
        key: "$secrets.nessus_api_keys"
      resources:
        - name: scans
          path: "/scans/{{scan_id}}"
          inputParameters:
            - name: scan_id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Power BI dataset refresh for the specified audit analytics dashboard and returns the refresh status.

naftiko: "0.5"
info:
  label: "Power BI Audit Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the specified audit analytics dashboard and returns the refresh status."
  tags:
    - audit
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: audit-analytics
      port: 8080
      tools:
        - name: refresh-audit-dashboard
          description: "Trigger a Power BI dataset refresh for an audit analytics workspace and notify the audit team via Microsoft Teams when initiated."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace GUID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset GUID."
            - name: audit_team_email
              in: body
              type: string
              description: "Email of the audit team lead."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{audit_team_email}}"
                text: "Power BI audit dashboard refresh initiated. Dataset: {{dataset_id}}. Status: {{trigger-refresh.status}}."
  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/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Exports data from Qlik Sense analytical dashboards used for audit analytics and financial statement analysis.

naftiko: "0.5"
info:
  label: "Qlik Sense Dashboard Data Export"
  description: "Exports data from Qlik Sense analytical dashboards used for audit analytics and financial statement analysis."
  tags:
    - analytics
    - qlik-sense
capability:
  exposes:
    - type: mcp
      namespace: qlik-analytics
      port: 8080
      tools:
        - name: export-dashboard-data
          description: "Export data from a Qlik Sense dashboard by app ID."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The Qlik Sense app identifier."
            - name: object_id
              in: body
              type: string
              description: "The visualization object ID."
          call: "qlik.export-data"
          with:
            app_id: "{{app_id}}"
            object_id: "{{object_id}}"
          outputParameters:
            - name: data
              type: array
              mapping: "$.qDataPages[0].qMatrix"
  consumes:
    - type: http
      namespace: qlik
      baseUri: "https://kpmg-qlik.qlikcloud.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.qlik_token"
      resources:
        - name: apps
          path: "/apps/{{app_id}}/objects/{{object_id}}/data"
          inputParameters:
            - name: app_id
              in: path
            - name: object_id
              in: path
          operations:
            - name: export-data
              method: GET

When a new regulatory update is detected in Bloomberg Law, creates a Jira ticket for impact analysis, updates the compliance register in ServiceNow, posts an alert to the regulatory affairs team in Microsoft Teams, and stores the bulletin in SharePoint.

naftiko: "0.5"
info:
  label: "Regulatory Change Impact Orchestrator"
  description: "When a new regulatory update is detected in Bloomberg Law, creates a Jira ticket for impact analysis, updates the compliance register in ServiceNow, posts an alert to the regulatory affairs team in Microsoft Teams, and stores the bulletin in SharePoint."
  tags:
    - compliance
    - regulatory
    - bloomberg
    - jira
    - servicenow
    - microsoft-teams
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: regulatory-monitoring
      port: 8080
      tools:
        - name: process-regulatory-change
          description: "Given a Bloomberg Law alert ID and regulation domain, retrieve the update, create a Jira impact ticket, update the ServiceNow compliance register, store in SharePoint, and notify the regulatory team."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Bloomberg Law alert identifier."
            - name: regulation_domain
              in: body
              type: string
              description: "Domain of regulation (e.g., banking, insurance, securities, tax)."
            - name: compliance_team_channel
              in: body
              type: string
              description: "Microsoft Teams channel webhook URL for the compliance team."
          steps:
            - name: get-alert
              type: call
              call: "bloomberg-law.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-impact-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "COMPLY"
                issue_type: "Task"
                summary: "Regulatory Change: {{get-alert.title}} — {{regulation_domain}}"
                description: "Effective date: {{get-alert.effective_date}}. Jurisdiction: {{get-alert.jurisdiction}}. Summary: {{get-alert.summary}}"
            - name: update-register
              type: call
              call: "servicenow.create-compliance-record"
              with:
                regulation_name: "{{get-alert.title}}"
                domain: "{{regulation_domain}}"
                effective_date: "{{get-alert.effective_date}}"
                jira_reference: "{{create-impact-ticket.key}}"
            - name: store-bulletin
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "regulatory_updates_site"
                file_path: "Bulletins/{{regulation_domain}}/{{get-alert.title}}_{{get-alert.effective_date}}.pdf"
            - name: notify-team
              type: call
              call: "msteams.post-webhook"
              with:
                webhook_url: "{{compliance_team_channel}}"
                text: "Regulatory Change Alert: {{get-alert.title}} ({{regulation_domain}}). Effective: {{get-alert.effective_date}}. Jira: {{create-impact-ticket.key}}. Bulletin: {{store-bulletin.url}}."
  consumes:
    - type: http
      namespace: bloomberg-law
      baseUri: "https://api.bloomberglaw.com/v2"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_law_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: compliance
          path: "/table/sn_compliance_policy"
          operations:
            - name: create-compliance-record
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: webhooks
          path: "/teams/{{webhook_url}}"
          inputParameters:
            - name: webhook_url
              in: path
          operations:
            - name: post-webhook
              method: POST

Tracks regulatory filing deadlines by pulling client engagements from Salesforce, checking deadlines in Jira, and sending upcoming deadline alerts via Teams and email.

naftiko: "0.5"
info:
  label: "Regulatory Filing Deadline Tracker Pipeline"
  description: "Tracks regulatory filing deadlines by pulling client engagements from Salesforce, checking deadlines in Jira, and sending upcoming deadline alerts via Teams and email."
  tags:
    - compliance
    - regulatory
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: filing-deadlines
      port: 8080
      tools:
        - name: check-filing-deadlines
          description: "Check upcoming regulatory filing deadlines for a client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: days_ahead
              in: body
              type: integer
              description: "Number of days to look ahead."
            - name: engagement_team_email
              in: body
              type: string
              description: "Engagement team email."
          steps:
            - name: get-client-filings
              type: call
              call: "salesforce.get-filing-schedule"
              with:
                client_id: "{{client_id}}"
            - name: check-task-status
              type: call
              call: "jira.search-issues"
              with:
                jql: "project = TAX AND client = '{{client_id}}' AND dueDate <= '{{days_ahead}}d'"
            - name: send-deadline-alert
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{engagement_team_email}}"
                text: "Filing deadline alert for {{client_id}}: {{check-task-status.total}} filings due within {{days_ahead}} days. {{check-task-status.overdue_count}} are overdue."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: filings
          path: "/sobjects/FilingSchedule__c"
          operations:
            - name: get-filing-schedule
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: search
          path: "/search"
          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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Tests revenue recognition compliance by extracting contract data from SAP, analyzing recognition patterns in Databricks, and documenting testing results in SharePoint.

naftiko: "0.5"
info:
  label: "Revenue Recognition Testing Pipeline"
  description: "Tests revenue recognition compliance by extracting contract data from SAP, analyzing recognition patterns in Databricks, and documenting testing results in SharePoint."
  tags:
    - audit
    - revenue-recognition
    - sap
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: revenue-testing
      port: 8080
      tools:
        - name: test-revenue-recognition
          description: "Test client revenue recognition against ASC 606 requirements."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The engagement ID."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year under audit."
          steps:
            - name: extract-contracts
              type: call
              call: "sap.get-contracts"
              with:
                fiscal_year: "{{fiscal_year}}"
            - name: analyze-recognition
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM revenue_recognition_analysis WHERE fiscal_year = '{{fiscal_year}}' AND variance_flag = true"
            - name: create-workpaper
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "audit-engagements"
                folder_path: "{{engagement_id}}/RevenueRecognition"
                template: "asc606_testing_workpaper"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: contracts
          path: "/SD_SRV/SalesContracts"
          operations:
            - name: get-contracts
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

On initiation of a new client risk assessment, creates a ServiceNow risk record, pulls entity data from Salesforce, runs a Dow Jones adverse media screening, and posts summary findings to the engagement team channel in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Risk Assessment Orchestrator"
  description: "On initiation of a new client risk assessment, creates a ServiceNow risk record, pulls entity data from Salesforce, runs a Dow Jones adverse media screening, and posts summary findings to the engagement team channel in Microsoft Teams."
  tags:
    - risk
    - compliance
    - aml
    - servicenow
    - salesforce
    - microsoft-teams
    - dow-jones
capability:
  exposes:
    - type: mcp
      namespace: risk-assessment
      port: 8080
      tools:
        - name: initiate-risk-assessment
          description: "Given a client Salesforce account ID and engagement lead email, pull client data, screen against Dow Jones, create a ServiceNow risk record, and alert the engagement team."
          inputParameters:
            - name: salesforce_account_id
              in: body
              type: string
              description: "The Salesforce account ID for the client entity."
            - name: engagement_lead_email
              in: body
              type: string
              description: "UPN of the engagement lead."
            - name: risk_category
              in: body
              type: string
              description: "Risk category (e.g., financial_crime, sanctions, pep)."
          steps:
            - name: get-client
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{salesforce_account_id}}"
            - name: screen-entity
              type: call
              call: "dowjones.screen-entity"
              with:
                entity_name: "{{get-client.Name}}"
                country: "{{get-client.BillingCountry}}"
            - name: create-risk-record
              type: call
              call: "servicenow.create-risk"
              with:
                short_description: "Risk Assessment: {{get-client.Name}} — {{risk_category}}"
                description: "DJ screening hits: {{screen-entity.total_hits}}. Category: {{risk_category}}. Country: {{get-client.BillingCountry}}."
                risk_score: "{{screen-entity.risk_score}}"
                assigned_group: "Risk_Advisory"
            - name: notify-lead
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{engagement_lead_email}}"
                text: "Risk Assessment initiated for {{get-client.Name}}. DJ hits: {{screen-entity.total_hits}}. Risk score: {{screen-entity.risk_score}}. ServiceNow: {{create-risk-record.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: dowjones
      baseUri: "https://api.dowjones.com/riskandcompliance/v1"
      authentication:
        type: bearer
        token: "$secrets.dowjones_token"
      resources:
        - name: screening
          path: "/screenings"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: risk-records
          path: "/table/sn_risk_risk"
          operations:
            - name: create-risk
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Monitors Microsoft Power Automate flow runs for a consulting engagement, detects failures, creates ServiceNow incidents for failed runs, assigns remediation in Jira, and alerts the RPA team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Robotic Process Automation Monitoring Orchestrator"
  description: "Monitors Microsoft Power Automate flow runs for a consulting engagement, detects failures, creates ServiceNow incidents for failed runs, assigns remediation in Jira, and alerts the RPA team via Microsoft Teams."
  tags:
    - consulting
    - rpa
    - microsoft-power-automate
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rpa-monitoring
      port: 8080
      tools:
        - name: monitor-rpa-failures
          description: "Given a Power Automate flow ID and monitoring window, check for failures, create ServiceNow incidents, assign Jira tasks, and alert the RPA team."
          inputParameters:
            - name: flow_id
              in: body
              type: string
              description: "The Power Automate flow identifier."
            - name: environment_id
              in: body
              type: string
              description: "The Power Platform environment ID."
            - name: rpa_team_email
              in: body
              type: string
              description: "Email of the RPA support team lead."
          steps:
            - name: get-flow-runs
              type: call
              call: "power-automate.get-flow-runs"
              with:
                flow_id: "{{flow_id}}"
                environment_id: "{{environment_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "RPA failure: Flow {{flow_id}} — {{get-flow-runs.failed_count}} failures"
                description: "Environment: {{environment_id}}. Failed runs: {{get-flow-runs.failed_count}}. Last failure: {{get-flow-runs.last_failure_message}}."
                priority: "2"
                assigned_group: "RPA_Support"
            - name: create-remediation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "RPA"
                issue_type: "Bug"
                summary: "Fix: Power Automate flow {{flow_id}} failures"
                description: "ServiceNow: {{create-incident.number}}. Failed: {{get-flow-runs.failed_count}}. Error: {{get-flow-runs.last_failure_message}}."
            - name: alert-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{rpa_team_email}}"
                text: "RPA Alert: Flow {{flow_id}} has {{get-flow-runs.failed_count}} failures. Error: {{get-flow-runs.last_failure_message}}. ServiceNow: {{create-incident.number}}. Jira: {{create-remediation.key}}."
  consumes:
    - type: http
      namespace: power-automate
      baseUri: "https://api.flow.microsoft.com/providers/Microsoft.ProcessSimple/environments/{{environment_id}}"
      authentication:
        type: bearer
        token: "$secrets.power_automate_token"
      resources:
        - name: flow-runs
          path: "/flows/{{flow_id}}/runs?$filter=status eq 'Failed'"
          inputParameters:
            - name: flow_id
              in: path
            - name: environment_id
              in: path
          operations:
            - name: get-flow-runs
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name. Used by advisory partners to check pipeline status.

naftiko: "0.5"
info:
  label: "Salesforce Client Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and account name. Used by advisory partners to check pipeline status."
  tags:
    - sales
    - advisory
    - salesforce
    - pipeline
capability:
  exposes:
    - type: mcp
      namespace: advisory-pipeline
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID and return its current stage and deal details."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity record ID."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
            - name: account_name
              type: string
              mapping: "$.Account.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.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

Screens entities against global sanctions lists by querying client data from Salesforce, running screening in Databricks, documenting results in SharePoint, and alerting compliance.

naftiko: "0.5"
info:
  label: "Sanctions Screening Pipeline"
  description: "Screens entities against global sanctions lists by querying client data from Salesforce, running screening in Databricks, documenting results in SharePoint, and alerting compliance."
  tags:
    - compliance
    - sanctions
    - salesforce
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sanctions-screening
      port: 8080
      tools:
        - name: screen-entity
          description: "Screen an entity against global sanctions lists."
          inputParameters:
            - name: entity_name
              in: body
              type: string
              description: "The entity name to screen."
            - name: engagement_id
              in: body
              type: string
              description: "The engagement ID."
            - name: compliance_email
              in: body
              type: string
              description: "Compliance team email."
          steps:
            - name: get-entity-data
              type: call
              call: "salesforce.get-client-entity"
              with:
                entity_name: "{{entity_name}}"
            - name: run-screening
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM sanctions_screening WHERE entity_name LIKE '%{{entity_name}}%'"
            - name: document-results
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "compliance"
                folder_path: "SanctionsScreening/{{engagement_id}}/{{entity_name}}"
                template: "sanctions_screening_result"
            - name: alert-compliance
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{compliance_email}}"
                text: "Sanctions screening for {{entity_name}} ({{engagement_id}}): {{run-screening.match_count}} potential matches. Results: {{document-results.url}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://kpmg.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: clients
          path: "/sobjects/Account"
          operations:
            - name: get-client-entity
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP Ariba procurement requisition by ID, returning status, requestor, total amount, and approval chain. Used by procurement advisory teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Procurement Requisition Lookup"
  description: "Retrieves a SAP Ariba procurement requisition by ID, returning status, requestor, total amount, and approval chain. Used by procurement advisory teams."
  tags:
    - procurement
    - sap-ariba
    - spend-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ariba
      port: 8080
      tools:
        - name: get-ariba-requisition
          description: "Look up a SAP Ariba requisition by ID and return its status and details."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba requisition identifier."
          call: "ariba.get-requisition"
          with:
            requisition_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.StatusString"
            - name: requestor
              type: string
              mapping: "$.Requester.Name"
            - name: total_amount
              type: string
              mapping: "$.TotalCost.Amount"
            - name: currency
              type: string
              mapping: "$.TotalCost.Currency"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-req/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET

Looks up supplier qualification status and risk ratings from SAP Ariba for procurement compliance assessments.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Qualification Lookup"
  description: "Looks up supplier qualification status and risk ratings from SAP Ariba for procurement compliance assessments."
  tags:
    - procurement
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: supplier-qualification
      port: 8080
      tools:
        - name: get-supplier-qualification
          description: "Check supplier qualification status in SAP Ariba."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
          call: "ariba.get-qualification"
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: qualification_status
              type: string
              mapping: "$.supplier.qualificationStatus"
            - name: risk_rating
              type: string
              mapping: "$.supplier.riskRating"
            - name: last_assessment_date
              type: string
              mapping: "$.supplier.lastAssessmentDate"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}/qualification"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-qualification
              method: GET

Retrieves fixed asset depreciation schedules from SAP for a given company code and fiscal year, returning asset descriptions, acquisition values, accumulated depreciation, and net book values.

naftiko: "0.5"
info:
  label: "SAP Fixed Asset Depreciation Lookup"
  description: "Retrieves fixed asset depreciation schedules from SAP for a given company code and fiscal year, returning asset descriptions, acquisition values, accumulated depreciation, and net book values."
  tags:
    - audit
    - finance
    - sap
    - fixed-assets
capability:
  exposes:
    - type: mcp
      namespace: audit-assets
      port: 8080
      tools:
        - name: get-asset-depreciation
          description: "Look up fixed asset depreciation data from SAP by company code and fiscal year. Returns asset details, acquisition cost, and net book value."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code for the client entity."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year in YYYY format."
          call: "sap.get-fixed-assets"
          with:
            company_code: "{{company_code}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: assets
              type: array
              mapping: "$.data"
              items:
                - name: asset_number
                  type: string
                  mapping: "$.assetNumber"
                - name: description
                  type: string
                  mapping: "$.description"
                - name: acquisition_value
                  type: number
                  mapping: "$.acquisitionValue"
                - name: accumulated_depreciation
                  type: number
                  mapping: "$.accumulatedDepreciation"
                - name: net_book_value
                  type: number
                  mapping: "$.netBookValue"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.s4hana.cloud/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: fixed-assets
          path: "/fixed-assets"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_year
              in: query
          operations:
            - name: get-fixed-assets
              method: GET

Retrieves the general ledger account balance from SAP S/4HANA for a given company code, fiscal year, and GL account number. Used by audit and finance teams to validate trial balance figures.

naftiko: "0.5"
info:
  label: "SAP General Ledger Balance Lookup"
  description: "Retrieves the general ledger account balance from SAP S/4HANA for a given company code, fiscal year, and GL account number. Used by audit and finance teams to validate trial balance figures."
  tags:
    - audit
    - finance
    - sap
    - general-ledger
capability:
  exposes:
    - type: mcp
      namespace: audit-gl
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Look up a SAP S/4HANA general ledger account balance by company code, fiscal year, and GL account number, and log the inquiry in ServiceNow for audit trail purposes."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code (4-digit)."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year (YYYY)."
            - name: gl_account
              in: body
              type: string
              description: "The GL account number (10-digit)."
            - name: auditor_email
              in: body
              type: string
              description: "Email of the requesting auditor."
          steps:
            - name: fetch-balance
              type: call
              call: "sap.get-gl-balance"
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
                gl_account: "{{gl_account}}"
            - name: log-inquiry
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "GL balance inquiry: {{company_code}}/{{gl_account}} FY{{fiscal_year}}"
                description: "Balance: {{fetch-balance.EndingBalance}} {{fetch-balance.TransactionCurrency}}. Auditor: {{auditor_email}}."
                assigned_group: "Audit_Operations"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: gl-balances
          path: "/GLAccountBalanceSet(CompanyCode='{{company_code}}',FiscalYear='{{fiscal_year}}',GLAccount='{{gl_account}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: fiscal_year
              in: path
            - name: gl_account
              in: path
          operations:
            - name: get-gl-balance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Queries SAP HANA system overview for a given SID, returning memory utilization, disk usage, and active connections. Used by technology advisory teams for infrastructure assessments.

naftiko: "0.5"
info:
  label: "SAP HANA Database Health Check"
  description: "Queries SAP HANA system overview for a given SID, returning memory utilization, disk usage, and active connections. Used by technology advisory teams for infrastructure assessments."
  tags:
    - infrastructure
    - sap-hana
    - database
    - health-check
capability:
  exposes:
    - type: mcp
      namespace: sap-hana-ops
      port: 8080
      tools:
        - name: get-hana-health
          description: "Look up SAP HANA system health by SID and return key metrics."
          inputParameters:
            - name: hana_host
              in: body
              type: string
              description: "The SAP HANA host address."
            - name: sid
              in: body
              type: string
              description: "The SAP HANA system ID."
          call: "hana.get-system-overview"
          with:
            hana_host: "{{hana_host}}"
            sid: "{{sid}}"
          outputParameters:
            - name: memory_used_pct
              type: string
              mapping: "$.memoryUsedPercent"
            - name: disk_used_pct
              type: string
              mapping: "$.diskUsedPercent"
            - name: active_connections
              type: string
              mapping: "$.activeConnections"
            - name: version
              type: string
              mapping: "$.version"
  consumes:
    - type: http
      namespace: hana
      baseUri: "https://{{hana_host}}:8443/api/v1"
      authentication:
        type: basic
        username: "$secrets.hana_user"
        password: "$secrets.hana_password"
      resources:
        - name: system-overview
          path: "/systems/{{sid}}/overview"
          inputParameters:
            - name: hana_host
              in: path
            - name: sid
              in: path
          operations:
            - name: get-system-overview
              method: GET

Retrieves a ServiceNow incident by number, returning priority, assignment group, state, and short description. Used by IT operations and advisory teams for incident triage.

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

Retrieves audit workpapers and supporting documentation from SharePoint document libraries organized by engagement.

naftiko: "0.5"
info:
  label: "SharePoint Audit Workpaper Retrieval"
  description: "Retrieves audit workpapers and supporting documentation from SharePoint document libraries organized by engagement."
  tags:
    - audit
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: audit-workpapers
      port: 8080
      tools:
        - name: get-workpaper
          description: "Retrieve an audit workpaper from SharePoint by engagement and document ID."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The audit engagement identifier."
            - name: document_name
              in: body
              type: string
              description: "The workpaper document name."
          call: "sharepoint.get-document"
          with:
            site_id: "audit-engagements"
            folder_path: "{{engagement_id}}/Workpapers/{{document_name}}"
          outputParameters:
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/audit-engagements/drive/root:/{{folder_path}}"
          inputParameters:
            - name: folder_path
              in: path
          operations:
            - name: get-document
              method: GET

Executes SOX control testing by pulling control evidence from ServiceNow GRC, validating against SAP transaction logs, documenting test results in SharePoint, and notifying the SOX coordinator via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SOX Compliance Testing Orchestrator"
  description: "Executes SOX control testing by pulling control evidence from ServiceNow GRC, validating against SAP transaction logs, documenting test results in SharePoint, and notifying the SOX coordinator via Microsoft Teams."
  tags:
    - audit
    - sox
    - compliance
    - servicenow
    - sap
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sox-testing
      port: 8080
      tools:
        - name: execute-sox-test
          description: "Given a control ID and testing period, pull evidence from ServiceNow GRC, validate against SAP, document in SharePoint, and notify the coordinator."
          inputParameters:
            - name: control_id
              in: body
              type: string
              description: "The ServiceNow GRC control identifier."
            - name: testing_period_start
              in: body
              type: string
              description: "Testing period start date (YYYY-MM-DD)."
            - name: testing_period_end
              in: body
              type: string
              description: "Testing period end date (YYYY-MM-DD)."
            - name: coordinator_email
              in: body
              type: string
              description: "Email of the SOX testing coordinator."
          steps:
            - name: get-control-evidence
              type: call
              call: "servicenow.get-control"
              with:
                control_id: "{{control_id}}"
            - name: get-sap-transactions
              type: call
              call: "sap.get-transaction-log"
              with:
                control_id: "{{control_id}}"
                date_from: "{{testing_period_start}}"
                date_to: "{{testing_period_end}}"
            - name: save-test-results
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "sox_testing_site"
                file_path: "TestResults/{{control_id}}_{{testing_period_start}}_to_{{testing_period_end}}.xlsx"
                content: "Control: {{get-control-evidence.control_name}}. Transactions tested: {{get-sap-transactions.count}}. Exceptions: {{get-sap-transactions.exceptions}}."
            - name: notify-coordinator
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{coordinator_email}}"
                text: "SOX test complete for {{get-control-evidence.control_name}} ({{control_id}}). Period: {{testing_period_start}} to {{testing_period_end}}. Transactions: {{get-sap-transactions.count}}. Exceptions: {{get-sap-transactions.exceptions}}. Results: {{save-test-results.url}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: controls
          path: "/table/sn_compliance_control/{{control_id}}"
          inputParameters:
            - name: control_id
              in: path
          operations:
            - name: get-control
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://kpmg-s4.sap.com/sap/opu/odata/sap/API_JOURNAL_ENTRY"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: transaction-logs
          path: "/JournalEntrySet?$filter=PostingDate ge datetime'{{date_from}}' and PostingDate le datetime'{{date_to}}'"
          inputParameters:
            - name: date_from
              in: query
            - name: date_to
              in: query
          operations:
            - name: get-transaction-log
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Assesses client supply chain risk by analyzing supplier data in Databricks, cross-referencing geopolitical risk indicators, generating risk reports in SharePoint, and briefing the advisory team.

naftiko: "0.5"
info:
  label: "Supply Chain Risk Advisory Pipeline"
  description: "Assesses client supply chain risk by analyzing supplier data in Databricks, cross-referencing geopolitical risk indicators, generating risk reports in SharePoint, and briefing the advisory team."
  tags:
    - advisory
    - supply-chain-risk
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-risk
      port: 8080
      tools:
        - name: assess-supply-chain-risk
          description: "Assess a client's supply chain risk profile."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: advisory_lead_email
              in: body
              type: string
              description: "Advisory lead email."
          steps:
            - name: analyze-suppliers
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM supply_chain_risk WHERE client_id = '{{client_id}}' ORDER BY risk_score DESC"
            - name: generate-risk-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "advisory-engagements"
                folder_path: "{{client_id}}/SupplyChainRisk"
                template: "supply_chain_risk_report"
            - name: brief-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{advisory_lead_email}}"
                text: "Supply chain risk assessment for {{client_id}}: {{analyze-suppliers.high_risk_count}} high-risk suppliers identified out of {{analyze-suppliers.total_suppliers}}. Report: {{generate-risk-report.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              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

Triggers a data extract refresh for a specified Tableau workbook on Tableau Server. Used by analytics teams to ensure audit and advisory dashboards have current data.

naftiko: "0.5"
info:
  label: "Tableau Workbook Data Extract Refresh"
  description: "Triggers a data extract refresh for a specified Tableau workbook on Tableau Server. Used by analytics teams to ensure audit and advisory dashboards have current data."
  tags:
    - analytics
    - tableau
    - reporting
    - data-refresh
capability:
  exposes:
    - type: mcp
      namespace: analytics-refresh
      port: 8080
      tools:
        - name: refresh-tableau-extract
          description: "Trigger a Tableau Server data extract refresh for a given site and workbook."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The Tableau Server site ID."
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook LUID."
          call: "tableau.refresh-workbook"
          with:
            site_id: "{{site_id}}"
            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.kpmg.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbook-refresh
          path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: site_id
              in: path
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST

Queries the Thomson Reuters ONESOURCE tax engine for a client entity filing status by jurisdiction and tax year, returning compliance deadlines and submission state.

naftiko: "0.5"
info:
  label: "Tax Filing Status Tracker"
  description: "Queries the Thomson Reuters ONESOURCE tax engine for a client entity filing status by jurisdiction and tax year, returning compliance deadlines and submission state."
  tags:
    - tax
    - compliance
    - thomson-reuters
    - filing-status
capability:
  exposes:
    - type: mcp
      namespace: tax-filing
      port: 8080
      tools:
        - name: get-filing-status
          description: "Look up a tax filing status by client entity ID, jurisdiction code, and tax year from Thomson Reuters ONESOURCE, and notify the tax manager via Microsoft Teams if the filing is overdue."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "The client entity identifier in ONESOURCE."
            - name: jurisdiction
              in: body
              type: string
              description: "Tax jurisdiction code (e.g., US-FED, US-NY, UK)."
            - name: tax_year
              in: body
              type: string
              description: "The tax year (YYYY)."
            - name: tax_manager_email
              in: body
              type: string
              description: "Email of the tax manager to notify."
          steps:
            - name: fetch-filing
              type: call
              call: "onesource.get-filing"
              with:
                entity_id: "{{entity_id}}"
                jurisdiction: "{{jurisdiction}}"
                tax_year: "{{tax_year}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{tax_manager_email}}"
                text: "Filing status for {{entity_id}} ({{jurisdiction}} TY{{tax_year}}): {{fetch-filing.status}}. Due: {{fetch-filing.dueDate}}. Extension: {{fetch-filing.extensionDate}}."
  consumes:
    - type: http
      namespace: onesource
      baseUri: "https://api.tax.thomsonreuters.com/onesource/v2"
      authentication:
        type: bearer
        token: "$secrets.onesource_token"
      resources:
        - name: filings
          path: "/entities/{{entity_id}}/filings?jurisdiction={{jurisdiction}}&taxYear={{tax_year}}"
          inputParameters:
            - name: entity_id
              in: path
            - name: jurisdiction
              in: query
            - name: tax_year
              in: query
          operations:
            - name: get-filing
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls trial balance data from SAP, runs the tax provision calculation in Thomson Reuters ONESOURCE, stores the provision workpaper in SharePoint, and notifies the tax senior manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tax Provision Calculation Pipeline"
  description: "Pulls trial balance data from SAP, runs the tax provision calculation in Thomson Reuters ONESOURCE, stores the provision workpaper in SharePoint, and notifies the tax senior manager via Microsoft Teams."
  tags:
    - tax
    - provision
    - sap
    - thomson-reuters
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tax-provision
      port: 8080
      tools:
        - name: calculate-tax-provision
          description: "Given a company code, fiscal year, and period, pull SAP trial balance, run ONESOURCE provision, store workpaper in SharePoint, and notify the tax senior manager."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year (YYYY)."
            - name: period
              in: body
              type: string
              description: "Fiscal period (e.g., Q1, Q2, Q3, Q4, FY)."
            - name: tax_manager_email
              in: body
              type: string
              description: "Email of the tax senior manager."
          steps:
            - name: get-trial-balance
              type: call
              call: "sap.get-trial-balance"
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
                period: "{{period}}"
            - name: run-provision
              type: call
              call: "onesource.calculate-provision"
              with:
                entity_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
                period: "{{period}}"
                pretax_income: "{{get-trial-balance.pretax_income}}"
            - name: store-workpaper
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "tax_provisions_site"
                file_path: "Provisions/{{company_code}}_{{fiscal_year}}_{{period}}_provision.xlsx"
                content: "Entity: {{company_code}}. Period: {{period}} FY{{fiscal_year}}. Pretax income: {{get-trial-balance.pretax_income}}. Current provision: {{run-provision.current_tax}}. Deferred provision: {{run-provision.deferred_tax}}. ETR: {{run-provision.effective_tax_rate}}."
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{tax_manager_email}}"
                text: "Tax provision for {{company_code}} {{period}} FY{{fiscal_year}} complete. Current: {{run-provision.current_tax}}. Deferred: {{run-provision.deferred_tax}}. ETR: {{run-provision.effective_tax_rate}}. Workpaper: {{store-workpaper.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-s4.sap.com/sap/opu/odata/sap/API_TRIALBALANCE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: trial-balance
          path: "/TrialBalanceSet?$filter=CompanyCode eq '{{company_code}}' and FiscalYear eq '{{fiscal_year}}'"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_year
              in: query
          operations:
            - name: get-trial-balance
              method: GET
    - type: http
      namespace: onesource
      baseUri: "https://api.tax.thomsonreuters.com/onesource/v2"
      authentication:
        type: bearer
        token: "$secrets.onesource_token"
      resources:
        - name: provisions
          path: "/provisions/calculate"
          operations:
            - name: calculate-provision
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates tax return preparation by extracting client financial data from SAP, running tax calculations in Databricks, generating draft returns in SharePoint, and notifying the engagement team via Teams.

naftiko: "0.5"
info:
  label: "Tax Return Preparation Orchestrator"
  description: "Orchestrates tax return preparation by extracting client financial data from SAP, running tax calculations in Databricks, generating draft returns in SharePoint, and notifying the engagement team via Teams."
  tags:
    - tax
    - preparation
    - sap
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tax-preparation
      port: 8080
      tools:
        - name: prepare-tax-return
          description: "Orchestrate tax return preparation workflow."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: tax_year
              in: body
              type: string
              description: "The tax year."
            - name: engagement_manager_email
              in: body
              type: string
              description: "Engagement manager email."
          steps:
            - name: extract-financials
              type: call
              call: "sap.get-trial-balance"
              with:
                client_id: "{{client_id}}"
                fiscal_year: "{{tax_year}}"
            - name: calculate-tax
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM tax_calculation WHERE client_id = '{{client_id}}' AND tax_year = '{{tax_year}}'"
            - name: generate-draft
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "tax-engagements"
                folder_path: "{{client_id}}/{{tax_year}}/Returns"
                template: "tax_return_draft"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{engagement_manager_email}}"
                text: "Tax return draft ready for {{client_id}} ({{tax_year}}). Taxable income: {{calculate-tax.taxable_income}}. Draft: {{generate-draft.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: trial-balance
          path: "/GL_SRV/TrialBalance"
          operations:
            - name: get-trial-balance
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the latest run status for a Terraform Cloud workspace, returning plan status, resource changes, and run ID. Used by cloud advisory teams for infrastructure-as-code governance.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Status"
  description: "Retrieves the latest run status for a Terraform Cloud workspace, returning plan status, resource changes, and run ID. Used by cloud advisory teams for infrastructure-as-code governance."
  tags:
    - cloud
    - terraform
    - infrastructure-as-code
    - governance
capability:
  exposes:
    - type: mcp
      namespace: iac-governance
      port: 8080
      tools:
        - name: get-terraform-run
          description: "Look up the latest Terraform Cloud run for a workspace and log any resource destructions in ServiceNow for governance review."
          inputParameters:
            - name: organization
              in: body
              type: string
              description: "Terraform Cloud organization name."
            - name: workspace_name
              in: body
              type: string
              description: "Terraform Cloud workspace name."
            - name: cloud_ops_email
              in: body
              type: string
              description: "Email of the cloud operations lead."
          steps:
            - name: fetch-run
              type: call
              call: "terraform.get-latest-run"
              with:
                organization: "{{organization}}"
                workspace_name: "{{workspace_name}}"
            - name: log-governance
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "IaC run: {{workspace_name}} — {{fetch-run.status}}"
                description: "Run: {{fetch-run.id}}. Additions: {{fetch-run.resource-additions}}. Destructions: {{fetch-run.resource-destructions}}."
                assigned_group: "Cloud_Governance"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{cloud_ops_email}}"
                text: "Terraform run {{fetch-run.id}} ({{workspace_name}}): {{fetch-run.status}}. Adds: {{fetch-run.resource-additions}}. Destroys: {{fetch-run.resource-destructions}}. ServiceNow: {{log-governance.number}}."
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/{{organization}}/workspaces/{{workspace_name}}/runs?page[size]=1"
          inputParameters:
            - name: organization
              in: path
            - name: workspace_name
              in: path
          operations:
            - name: get-latest-run
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.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: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

On vendor onboarding, screens the vendor in Dow Jones, retrieves their SOC 2 report from Box, creates a risk assessment in ServiceNow GRC, assigns a review task in Jira, and notifies the procurement team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Third-Party Risk Management Orchestrator"
  description: "On vendor onboarding, screens the vendor in Dow Jones, retrieves their SOC 2 report from Box, creates a risk assessment in ServiceNow GRC, assigns a review task in Jira, and notifies the procurement team via Microsoft Teams."
  tags:
    - risk
    - vendor-management
    - third-party-risk
    - dow-jones
    - box
    - servicenow
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tprm
      port: 8080
      tools:
        - name: onboard-vendor-risk
          description: "Given a vendor name and procurement contact, screen in DJ, retrieve SOC 2 from Box, create ServiceNow risk assessment, Jira review task, and notify procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "Legal name of the vendor."
            - name: vendor_country
              in: body
              type: string
              description: "Vendor country of incorporation."
            - name: soc2_folder_id
              in: body
              type: string
              description: "Box folder ID containing vendor SOC 2 reports."
            - name: procurement_contact_email
              in: body
              type: string
              description: "Email of the procurement contact."
          steps:
            - name: screen-vendor
              type: call
              call: "dowjones.screen-entity"
              with:
                entity_name: "{{vendor_name}}"
                country: "{{vendor_country}}"
            - name: get-soc2-report
              type: call
              call: "box.get-folder-items"
              with:
                folder_id: "{{soc2_folder_id}}"
            - name: create-risk-assessment
              type: call
              call: "servicenow.create-vendor-risk"
              with:
                short_description: "TPRM Assessment: {{vendor_name}}"
                description: "DJ risk score: {{screen-vendor.risk_score}}. DJ hits: {{screen-vendor.total_hits}}. SOC 2 files: {{get-soc2-report.file_count}}. Country: {{vendor_country}}."
                assigned_group: "Third_Party_Risk"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "TPRM"
                issue_type: "Task"
                summary: "Review: {{vendor_name}} TPRM Assessment"
                description: "ServiceNow: {{create-risk-assessment.number}}. DJ score: {{screen-vendor.risk_score}}. SOC 2 available: {{get-soc2-report.file_count}} files."
            - name: notify-procurement
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{procurement_contact_email}}"
                text: "TPRM initiated for {{vendor_name}} ({{vendor_country}}). DJ risk: {{screen-vendor.risk_score}}. SOC 2 reports: {{get-soc2-report.file_count}}. ServiceNow: {{create-risk-assessment.number}}. Jira: {{create-review-task.key}}."
  consumes:
    - type: http
      namespace: dowjones
      baseUri: "https://api.dowjones.com/riskandcompliance/v1"
      authentication:
        type: bearer
        token: "$secrets.dowjones_token"
      resources:
        - name: screening
          path: "/screenings"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://kpmg.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: vendor-risk
          path: "/table/sn_risk_risk"
          operations:
            - name: create-vendor-risk
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://kpmg.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Conducts transfer pricing benchmarking by extracting intercompany transactions from SAP, running comparability analysis in Databricks, and generating documentation in SharePoint.

naftiko: "0.5"
info:
  label: "Transfer Pricing Benchmarking Pipeline"
  description: "Conducts transfer pricing benchmarking by extracting intercompany transactions from SAP, running comparability analysis in Databricks, and generating documentation in SharePoint."
  tags:
    - tax
    - transfer-pricing
    - sap
    - azure-databricks
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: transfer-pricing
      port: 8080
      tools:
        - name: run-benchmarking
          description: "Run transfer pricing benchmarking analysis."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year."
          steps:
            - name: extract-intercompany
              type: call
              call: "sap.get-intercompany-transactions"
              with:
                client_id: "{{client_id}}"
                fiscal_year: "{{fiscal_year}}"
            - name: run-comparability
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM tp_benchmarking WHERE client_id = '{{client_id}}' AND fiscal_year = '{{fiscal_year}}'"
            - name: generate-documentation
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "tax-engagements"
                folder_path: "{{client_id}}/TransferPricing/{{fiscal_year}}"
                template: "tp_benchmarking_report"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-sap.kpmg.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: intercompany
          path: "/FI_SRV/IntercompanyTransactions"
          operations:
            - name: get-intercompany-transactions
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST

Pulls intercompany transaction data from SAP, retrieves comparable benchmarking from Bloomberg, generates a transfer pricing memo in SharePoint, and notifies the tax partner via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Transfer Pricing Document Generator"
  description: "Pulls intercompany transaction data from SAP, retrieves comparable benchmarking from Bloomberg, generates a transfer pricing memo in SharePoint, and notifies the tax partner via Microsoft Teams."
  tags:
    - tax
    - transfer-pricing
    - sap
    - bloomberg
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: transfer-pricing
      port: 8080
      tools:
        - name: generate-tp-documentation
          description: "Given a company code and fiscal year, retrieve SAP intercompany data, pull Bloomberg comparables, create the TP memo in SharePoint, and notify the tax partner."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code for the tested party."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year (YYYY)."
            - name: transaction_type
              in: body
              type: string
              description: "Intercompany transaction type (e.g., services, tangible_goods, royalties)."
            - name: tax_partner_email
              in: body
              type: string
              description: "Email of the responsible tax partner."
          steps:
            - name: get-ic-transactions
              type: call
              call: "sap.get-ic-transactions"
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
                transaction_type: "{{transaction_type}}"
            - name: get-comparables
              type: call
              call: "bloomberg.search-comparables"
              with:
                industry: "{{get-ic-transactions.industry_code}}"
                transaction_type: "{{transaction_type}}"
                region: "{{get-ic-transactions.region}}"
            - name: create-tp-memo
              type: call
              call: "sharepoint.create-file"
              with:
                site_id: "tax_transfer_pricing_site"
                file_path: "TP_Memos/{{company_code}}_FY{{fiscal_year}}_{{transaction_type}}.docx"
                content: "Transfer Pricing Documentation — {{company_code}} FY{{fiscal_year}}. IC volume: {{get-ic-transactions.total_amount}}. Arm's length range: {{get-comparables.interquartile_range}}."
            - name: notify-partner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{tax_partner_email}}"
                text: "TP memo generated for {{company_code}} FY{{fiscal_year}} ({{transaction_type}}). IC volume: {{get-ic-transactions.total_amount}}. Comparables range: {{get-comparables.interquartile_range}}. Document: {{create-tp-memo.url}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://kpmg-s4.sap.com/sap/opu/odata/sap/API_INTERCOMPANY_TRANSACTIONS"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: ic-transactions
          path: "/ICTransactionSet?$filter=CompanyCode eq '{{company_code}}' and FiscalYear eq '{{fiscal_year}}'"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_year
              in: query
            - name: transaction_type
              in: query
          operations:
            - name: get-ic-transactions
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: comparables
          path: "/fieldLists"
          operations:
            - name: search-comparables
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: create-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Assesses vendor risk by pulling vendor data from SAP Ariba, analyzing risk indicators in Databricks, creating assessment reports in SharePoint, and notifying the advisory team.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Orchestrator"
  description: "Assesses vendor risk by pulling vendor data from SAP Ariba, analyzing risk indicators in Databricks, creating assessment reports in SharePoint, and notifying the advisory team."
  tags:
    - advisory
    - vendor-risk
    - sap-ariba
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor-risk
          description: "Assess vendor risk for a client engagement."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier." 
            - name: vendor_id
              in: body
              type: string
              description: "The vendor ID." 
            - name: advisory_email
              in: body
              type: string
              description: "Advisory team email." 
          steps:
            - name: get-vendor-data
              type: call
              call: "ariba.get-vendor"
              with:
                vendor_id: "{{vendor_id}}"
            - name: analyze-risk
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM vendor_risk WHERE vendor_id = '{{vendor_id}}'"
            - name: create-assessment
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "advisory"
                folder_path: "{{client_id}}/VendorRisk/{{vendor_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{advisory_email}}"
                text: "Vendor risk for {{vendor_id}}: Score {{analyze-risk.risk_score}}/10. Report: {{create-assessment.url}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token" 
      resources:
        - name: vendors
          path: "/suppliers/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token" 
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a compensation report for a Workday worker by ID, returning base salary, bonus, total compensation, and pay grade. Used by HR advisory and audit teams.

naftiko: "0.5"
info:
  label: "Workday Compensation Report Lookup"
  description: "Retrieves a compensation report for a Workday worker by ID, returning base salary, bonus, total compensation, and pay grade. Used by HR advisory and audit teams."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-compensation
          description: "Look up a Workday employee compensation details by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-compensation"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: base_salary
              type: string
              mapping: "$.baseSalary"
            - name: bonus_target
              type: string
              mapping: "$.bonusTarget"
            - name: total_compensation
              type: string
              mapping: "$.totalCompensation"
            - name: pay_grade
              type: string
              mapping: "$.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

Retrieves a Workday employee profile by worker ID, returning full name, department, cost center, manager, and job title. Used across audit, tax, and advisory for engagement staffing.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves a Workday employee profile by worker ID, returning full name, department, cost center, manager, and job title. Used across audit, tax, and advisory for engagement staffing."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a Workday employee profile by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.fullName"
            - name: department
              type: string
              mapping: "$.department"
            - name: cost_center
              type: string
              mapping: "$.costCenter"
            - name: manager_name
              type: string
              mapping: "$.manager.fullName"
            - name: job_title
              type: string
              mapping: "$.jobTitle"
  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

Retrieves employee training and CPE completion records from Workday Learning for compliance tracking.

naftiko: "0.5"
info:
  label: "Workday Learning Completion Lookup"
  description: "Retrieves employee training and CPE completion records from Workday Learning for compliance tracking."
  tags:
    - training
    - workday
capability:
  exposes:
    - type: mcp
      namespace: learning
      port: 8080
      tools:
        - name: get-learning-completions
          description: "Look up training completions for an employee by ID."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday.get-completions"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: completions
              type: array
              mapping: "$.learningCompletions"
            - name: total_cpe_hours
              type: number
              mapping: "$.totalCPEHours"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/kpmg"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/workers/{{employee_id}}/learningCompletions"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-completions
              method: GET

Retrieves staff utilization rates from Workday for a given practice area and time period, returning billable hours, total hours, and utilization percentage.

naftiko: "0.5"
info:
  label: "Workday Utilization Rate Lookup"
  description: "Retrieves staff utilization rates from Workday for a given practice area and time period, returning billable hours, total hours, and utilization percentage."
  tags:
    - hr
    - finance
    - workday
    - utilization
capability:
  exposes:
    - type: mcp
      namespace: workforce-analytics
      port: 8080
      tools:
        - name: get-utilization-rate
          description: "Look up utilization rates by practice and period from Workday. Returns billable hours, total hours, and utilization percentage."
          inputParameters:
            - name: practice_area
              in: body
              type: string
              description: "The KPMG practice area code (e.g., audit, tax, advisory)."
            - name: period
              in: body
              type: string
              description: "Reporting period in YYYY-MM format."
          call: "workday.get-utilization"
          with:
            practice: "{{practice_area}}"
            period: "{{period}}"
          outputParameters:
            - name: billable_hours
              type: number
              mapping: "$.billableHours"
            - name: total_hours
              type: number
              mapping: "$.totalHours"
            - name: utilization_pct
              type: number
              mapping: "$.utilizationPercentage"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: utilization
          path: "/kpmg/utilization"
          inputParameters:
            - name: practice
              in: query
            - name: period
              in: query
          operations:
            - name: get-utilization
              method: GET

Assesses client workforce transformation by analyzing HR data in Databricks, generating assessment reports in SharePoint, and presenting to stakeholders via Teams.

naftiko: "0.5"
info:
  label: "Workforce Transformation Assessment Pipeline"
  description: "Assesses client workforce transformation by analyzing HR data in Databricks, generating assessment reports in SharePoint, and presenting to stakeholders via Teams."
  tags:
    - advisory
    - workforce
    - azure-databricks
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workforce-transformation
      port: 8080
      tools:
        - name: assess-workforce
          description: "Assess workforce transformation readiness."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier." 
            - name: advisory_email
              in: body
              type: string
              description: "Advisory team email." 
          steps:
            - name: analyze-workforce
              type: call
              call: "databricks.run-query"
              with:
                query: "SELECT * FROM workforce_assessment WHERE client_id = '{{client_id}}'"
            - name: generate-report
              type: call
              call: "sharepoint.create-document"
              with:
                site_id: "advisory"
                folder_path: "{{client_id}}/Workforce"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{advisory_email}}"
                text: "Workforce assessment for {{client_id}}: Readiness {{analyze-workforce.score}}/10. Report: {{generate-report.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://kpmg-analytics.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token" 
      resources:
        - name: sql-queries
          path: "/sql/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: documents
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-document
              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