EY Capabilities

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

Sort
Expand

Reviews access at EY via Okta, IAM, and Jira.

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at EY via Okta, IAM, and Jira."
  tags:
    - security
    - access-management
    - okta
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-rev
      port: 8080
      tools:
        - name: review
          description: "Review access at EY."
          inputParameters:
            - name: dept
              in: body
              type: string
              description: "Department."
          steps:
            - name: ent
              type: call
              call: "okta.get-users"
              with:
                dept: "{{dept}}"
            - name: compare
              type: call
              call: "iam.compare"
              with:
                data: "{{ent.data}}"
            - name: flag
              type: call
              call: "iam.flag"
              with:
                violations: "{{compare.violations}}"
            - name: fix
              type: call
              call: "jira.create-issue"
              with:
                project: "IAM"
                summary: "Violations in {{dept}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://ey.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: iam
      baseUri: "https://iam.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iam_token"
      resources:
        - name: reviews
          path: "/compare"
          operations:
            - name: compare
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Extracts payroll summary data from ADP for a specified pay period and employer. Used by EY tax teams to reconcile payroll tax liabilities.

naftiko: "0.5"
info:
  label: "ADP Payroll Data Extraction for Tax"
  description: "Extracts payroll summary data from ADP for a specified pay period and employer. Used by EY tax teams to reconcile payroll tax liabilities."
  tags:
    - tax
    - payroll
    - adp
    - reconciliation
capability:
  exposes:
    - type: mcp
      namespace: payroll-tax
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Retrieve ADP payroll summary by employer and pay period."
          inputParameters:
            - name: employer_id
              in: body
              type: string
              description: "The ADP employer ID."
            - name: pay_period
              in: body
              type: string
              description: "The pay period end date in YYYY-MM-DD format."
          call: "adp.get-payroll-summary"
          with:
            employer_id: "{{employer_id}}"
            pay_period: "{{pay_period}}"
          outputParameters:
            - name: gross_pay
              type: string
              mapping: "$.payrollSummary.grossPay.amount"
            - name: total_taxes
              type: string
              mapping: "$.payrollSummary.totalTaxes.amount"
            - name: net_pay
              type: string
              mapping: "$.payrollSummary.netPay.amount"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/payroll/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll-summaries
          path: "/employers/{{employer_id}}/pay-statements?payPeriodEndDate={{pay_period}}"
          inputParameters:
            - name: employer_id
              in: path
            - name: pay_period
              in: query
          operations:
            - name: get-payroll-summary
              method: GET

Triggers an Alteryx Server workflow for client data transformation and notifies the advisory team via Slack with the job ID and status.

naftiko: "0.5"
info:
  label: "Alteryx Workflow Execution"
  description: "Triggers an Alteryx Server workflow for client data transformation and notifies the advisory team via Slack with the job ID and status."
  tags:
    - advisory
    - data
    - alteryx
    - automation
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-workflows
      port: 8080
      tools:
        - name: run-alteryx-workflow
          description: "Execute an Alteryx Server workflow and notify the team via Slack."
          inputParameters:
            - name: workflow_id
              in: body
              type: string
              description: "The Alteryx Server workflow ID."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for job notifications."
          steps:
            - name: execute-workflow
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "{{workflow_id}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Alteryx workflow {{workflow_id}} submitted. Job ID: {{execute-workflow.job_id}}. Status: {{execute-workflow.status}}."
  consumes:
    - type: http
      namespace: alteryx
      baseUri: "https://ey-alteryx.gallery.alteryx.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Uploads finalized audit workpapers to an Amazon S3 bucket for long-term archival, following EY document retention policies.

naftiko: "0.5"
info:
  label: "Amazon S3 Audit Archive Upload"
  description: "Uploads finalized audit workpapers to an Amazon S3 bucket for long-term archival, following EY document retention policies."
  tags:
    - audit
    - archive
    - amazon-s3
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: audit-archive
      port: 8080
      tools:
        - name: archive-to-s3
          description: "Upload a finalized audit document to an S3 archive bucket."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The S3 bucket name."
            - name: object_key
              in: body
              type: string
              description: "The S3 object key (file path)."
            - name: file_content
              in: body
              type: string
              description: "Base64-encoded file content."
          call: "s3.put-object"
          with:
            bucket: "{{bucket_name}}"
            key: "{{object_key}}"
            body: "{{file_content}}"
          outputParameters:
            - name: etag
              type: string
              mapping: "$.ETag"
            - name: version_id
              type: string
              mapping: "$.VersionId"
  consumes:
    - type: http
      namespace: s3
      baseUri: "https://{{bucket}}.s3.amazonaws.com"
      authentication:
        type: awsSigV4
        accessKeyId: "$secrets.aws_access_key_id"
        secretAccessKey: "$secrets.aws_secret_access_key"
        region: "us-east-1"
      resources:
        - name: objects
          path: "/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT

Manages API deprecation at EY via consumer identification, notices, and tracking.

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at EY via consumer identification, notices, and tracking."
  tags:
    - api-management
    - communications
    - governance
capability:
  exposes:
    - type: mcp
      namespace: api-sunset
      port: 8080
      tools:
        - name: notify-sunset
          description: "Manage API sunset at EY."
          inputParameters:
            - name: api
              in: body
              type: string
              description: "API name."
            - name: date
              in: body
              type: string
              description: "Sunset date."
          steps:
            - name: consumers
              type: call
              call: "api-gw.consumers"
              with:
                api: "{{api}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{consumers.emails}}"
                subject: "{{api}} sunset: {{date}}"
            - name: track
              type: call
              call: "analytics.usage"
              with:
                api: "{{api}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "API"
                summary: "Sunset {{api}} by {{date}}"
  consumes:
    - type: http
      namespace: api-gw
      baseUri: "https://api-gw.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.api_gw_token"
      resources:
        - name: consumers
          path: "/apis/{{api}}/consumers"
          inputParameters:
            - name: api
              in: path
          operations:
            - name: consumers
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: usage
          path: "/api-usage"
          operations:
            - name: usage
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Creates a case in Appian for tracking a regulatory inquiry, links it to the client's Salesforce account, and notifies the case owner via Slack.

naftiko: "0.5"
info:
  label: "Appian Case Management Workflow"
  description: "Creates a case in Appian for tracking a regulatory inquiry, links it to the client's Salesforce account, and notifies the case owner via Slack."
  tags:
    - advisory
    - compliance
    - appian
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: case-management
      port: 8080
      tools:
        - name: create-regulatory-case
          description: "Create an Appian case for a regulatory inquiry, link to Salesforce, and notify via Slack."
          inputParameters:
            - name: case_title
              in: body
              type: string
              description: "Title for the regulatory case."
            - name: client_account_id
              in: body
              type: string
              description: "The Salesforce account ID for the client."
            - name: case_owner_email
              in: body
              type: string
              description: "Email of the case owner."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for case notifications."
          steps:
            - name: get-client
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{client_account_id}}"
            - name: create-case
              type: call
              call: "appian.create-record"
              with:
                record_type: "regulatory_case"
                title: "{{case_title}}"
                client_name: "{{get-client.Name}}"
                owner: "{{case_owner_email}}"
            - name: notify-owner
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "New regulatory case created: {{case_title}} for {{get-client.Name}}. Case ID: {{create-case.record_id}}. Owner: {{case_owner_email}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://ey.my.salesforce.com/services/data/v59.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: appian
      baseUri: "https://ey-appian.appiancloud.com/suite/webapi"
      authentication:
        type: bearer
        token: "$secrets.appian_token"
      resources:
        - name: records
          path: "/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

On new audit engagement creation in ServiceNow, provisions a SharePoint document library, creates a Microsoft Teams channel for the engagement team, and sends calendar invites via Outlook for the planning meeting.

naftiko: "0.5"
info:
  label: "Audit Engagement Kickoff Orchestrator"
  description: "On new audit engagement creation in ServiceNow, provisions a SharePoint document library, creates a Microsoft Teams channel for the engagement team, and sends calendar invites via Outlook for the planning meeting."
  tags:
    - audit
    - engagement
    - servicenow
    - sharepoint
    - microsoft-teams
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: audit-engagement
      port: 8080
      tools:
        - name: kickoff-audit-engagement
          description: "Given an engagement ID and client name, orchestrate the full audit kickoff sequence across ServiceNow, SharePoint, Microsoft Teams, and Outlook."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "The ServiceNow engagement record ID."
            - name: client_name
              in: body
              type: string
              description: "The client entity name for the audit engagement."
            - name: engagement_partner
              in: body
              type: string
              description: "Email of the engagement partner leading the audit."
            - name: planning_date
              in: body
              type: string
              description: "The planning meeting date in YYYY-MM-DD format."
          steps:
            - name: get-engagement
              type: call
              call: "servicenow.get-engagement"
              with:
                engagement_id: "{{engagement_id}}"
            - name: create-doc-library
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "ey_audit_engagements"
                folder_path: "Engagements/{{client_name}}_{{engagement_id}}"
            - name: create-team-channel
              type: call
              call: "msteams.create-channel"
              with:
                team_id: "ey-audit-team"
                display_name: "{{client_name}} - {{engagement_id}}"
                description: "Audit engagement channel for {{client_name}}"
            - name: send-planning-invite
              type: call
              call: "outlook.create-event"
              with:
                organizer: "{{engagement_partner}}"
                subject: "Audit Planning Meeting - {{client_name}}"
                start_date: "{{planning_date}}"
                body: "Kickoff planning for engagement {{engagement_id}}. Documents: {{create-doc-library.url}}. Channel: {{create-team-channel.url}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ey.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: engagements
          path: "/table/x_ey_engagement/{{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: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: create-channel
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/users/{{organizer}}/events"
          inputParameters:
            - name: organizer
              in: path
          operations:
            - name: create-event
              method: POST

Retrieves the applicable tax rate from Avalara for a given jurisdiction and transaction type. Used by EY indirect tax teams to validate client tax calculations.

naftiko: "0.5"
info:
  label: "Avalara Tax Rate Lookup"
  description: "Retrieves the applicable tax rate from Avalara for a given jurisdiction and transaction type. Used by EY indirect tax teams to validate client tax calculations."
  tags:
    - tax
    - indirect-tax
    - avalara
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: tax-rates
      port: 8080
      tools:
        - name: get-tax-rate
          description: "Look up the Avalara tax rate by jurisdiction and tax type."
          inputParameters:
            - name: jurisdiction
              in: body
              type: string
              description: "The tax jurisdiction (e.g., US-CA)."
            - name: tax_type
              in: body
              type: string
              description: "The tax type (e.g., SalesTax, UseTax)."
          call: "avalara.get-rate"
          with:
            jurisdiction: "{{jurisdiction}}"
            tax_type: "{{tax_type}}"
          outputParameters:
            - name: rate
              type: string
              mapping: "$.totalRate"
            - name: effective_date
              type: string
              mapping: "$.effectiveDate"
  consumes:
    - type: http
      namespace: avalara
      baseUri: "https://rest.avatax.com/api/v2"
      authentication:
        type: basic
        username: "$secrets.avalara_user"
        password: "$secrets.avalara_password"
      resources:
        - name: tax-rates
          path: "/taxrates/byaddress?country=US&region={{jurisdiction}}&taxType={{tax_type}}"
          inputParameters:
            - name: jurisdiction
              in: query
            - name: tax_type
              in: query
          operations:
            - name: get-rate
              method: GET

Checks whether a user is a member of a specified Azure Active Directory security group. Used for access control validation during IT audit engagements.

naftiko: "0.5"
info:
  label: "Azure Active Directory Group Membership Check"
  description: "Checks whether a user is a member of a specified Azure Active Directory security group. Used for access control validation during IT audit engagements."
  tags:
    - audit
    - security
    - azure-active-directory
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity-audit
      port: 8080
      tools:
        - name: check-group-membership
          description: "Check if a user is a member of an Azure AD security group."
          inputParameters:
            - name: user_upn
              in: body
              type: string
              description: "The user principal name (email)."
            - name: group_id
              in: body
              type: string
              description: "The Azure AD group object ID."
          call: "azuread.check-member"
          with:
            user_upn: "{{user_upn}}"
            group_id: "{{group_id}}"
          outputParameters:
            - name: is_member
              type: string
              mapping: "$.value"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/members?$filter=userPrincipalName eq '{{user_upn}}'"
          inputParameters:
            - name: group_id
              in: path
            - name: user_upn
              in: query
          operations:
            - name: check-member
              method: GET

Checks build at EY.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at EY."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at EY."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project."
            - name: build_id
              in: body
              type: string
              description: "Build ID."
          call: "azdo.get-build"
          with:
            project: "{{project}}"
            build_id: "{{build_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/ey.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET

Triggers an Azure DevOps build pipeline for EY internal tools and posts the build result to the development Slack channel.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Pipeline Trigger"
  description: "Triggers an Azure DevOps build pipeline for EY internal tools and posts the build result to the development Slack channel."
  tags:
    - development
    - ci-cd
    - azure-devops
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops-builds
      port: 8080
      tools:
        - name: trigger-build-pipeline
          description: "Trigger an Azure DevOps build pipeline and notify Slack with the result."
          inputParameters:
            - name: organization
              in: body
              type: string
              description: "The Azure DevOps organization name."
            - name: project
              in: body
              type: string
              description: "The Azure DevOps project name."
            - name: pipeline_id
              in: body
              type: string
              description: "The pipeline definition ID."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for build notifications."
          steps:
            - name: queue-build
              type: call
              call: "azuredevops.queue-build"
              with:
                organization: "{{organization}}"
                project: "{{project}}"
                definition_id: "{{pipeline_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Build #{{queue-build.build_number}} queued for pipeline {{pipeline_id}} in {{project}}. Status: {{queue-build.status}}."
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com"
      authentication:
        type: basic
        username: "$secrets.azuredevops_user"
        password: "$secrets.azuredevops_pat"
      resources:
        - name: builds
          path: "/{{organization}}/{{project}}/_apis/build/builds?api-version=7.0"
          inputParameters:
            - name: organization
              in: path
            - name: project
              in: path
          operations:
            - name: queue-build
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a secret value from Azure Key Vault by secret name. Used by EY platform engineering teams to manage credentials for engagement infrastructure.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Retrieval"
  description: "Retrieves a secret value from Azure Key Vault by secret name. Used by EY platform engineering teams to manage credentials for engagement infrastructure."
  tags:
    - security
    - azure-key-vault
    - infrastructure
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault-secrets
      port: 8080
      tools:
        - name: get-vault-secret
          description: "Retrieve a secret from Azure Key Vault by name."
          inputParameters:
            - name: vault_name
              in: body
              type: string
              description: "The Azure Key Vault name."
            - name: secret_name
              in: body
              type: string
              description: "The secret name to retrieve."
          call: "keyvault.get-secret"
          with:
            vault_name: "{{vault_name}}"
            secret_name: "{{secret_name}}"
          outputParameters:
            - name: value
              type: string
              mapping: "$.value"
            - name: content_type
              type: string
              mapping: "$.contentType"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://{{vault_name}}.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}?api-version=7.4"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: get-secret
              method: GET

Verifies backups at EY.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at EY."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at EY."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: date
              in: body
              type: string
              description: "Backup date."
          steps:
            - name: status
              type: call
              call: "backup.get-status"
              with:
                db: "{{db}}"
                date: "{{date}}"
            - name: verify
              type: call
              call: "backup.verify"
              with:
                id: "{{status.backup_id}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#dba"
                text: "Backup {{db}}: {{verify.status}}"
  consumes:
    - type: http
      namespace: backup
      baseUri: "https://backup.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.backup_token"
      resources:
        - name: backups
          path: "/databases/{{db}}/status"
          inputParameters:
            - name: db
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://ey.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Downloads a specific audit evidence file from Box and logs the retrieval in the engagement Confluence space for chain of custody documentation.

naftiko: "0.5"
info:
  label: "Box Audit Evidence Retrieval"
  description: "Downloads a specific audit evidence file from Box and logs the retrieval in the engagement Confluence space for chain of custody documentation."
  tags:
    - audit
    - document-management
    - box
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: evidence-retrieval
      port: 8080
      tools:
        - name: get-box-file
          description: "Retrieve an audit evidence file from Box and log the access in Confluence."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file ID."
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence page ID for evidence tracking."
          steps:
            - name: fetch-file
              type: call
              call: "box.get-file"
              with:
                file_id: "{{file_id}}"
            - name: log-retrieval
              type: call
              call: "confluence.add-comment"
              with:
                page_id: "{{confluence_page_id}}"
                body: "Evidence retrieved: {{fetch-file.file_name}} (Box ID: {{file_id}}). Last modified: {{fetch-file.modified_date}}. Download: {{fetch-file.download_url}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://ey-collab.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: comments
          path: "/content/{{page_id}}/child/comment"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: add-comment
              method: POST

Analyzes budget variance at EY via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at EY via Oracle, Workday, and Slack."
  tags:
    - finance
    - budget
    - oracle
    - workday
capability:
  exposes:
    - type: mcp
      namespace: budget-var
      port: 8080
      tools:
        - name: analyze-variance
          description: "Check budget variance at EY."
          inputParameters:
            - name: cc
              in: body
              type: string
              description: "Cost center."
            - name: period
              in: body
              type: string
              description: "Period."
          steps:
            - name: actuals
              type: call
              call: "oracle.get-actuals"
              with:
                cc: "{{cc}}"
                period: "{{period}}"
            - name: budget
              type: call
              call: "workday.get-budget"
              with:
                cc: "{{cc}}"
            - name: compute
              type: call
              call: "analytics.variance"
              with:
                a: "{{actuals.total}}"
                b: "{{budget.total}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Variance {{cc}}: ${{compute.variance}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/actuals"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/budgets"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: var
          path: "/compute"
          operations:
            - name: variance
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Plans capacity at EY by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at EY by collecting utilization and forecasting."
  tags:
    - infrastructure
    - capacity-planning
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: capacity
      port: 8080
      tools:
        - name: plan-capacity
          description: "Plan capacity at EY."
          inputParameters:
            - name: resource
              in: body
              type: string
              description: "Resource type."
            - name: months
              in: body
              type: number
              description: "Forecast months."
          steps:
            - name: util
              type: call
              call: "monitoring.get-util"
              with:
                resource: "{{resource}}"
            - name: forecast
              type: call
              call: "analytics.forecast"
              with:
                current: "{{util.pct}}"
                months: "{{months}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "capacity"
                resource: "{{resource}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "capacity"
  consumes:
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: util
          path: "/resources/{{resource}}/util"
          inputParameters:
            - name: resource
              in: path
          operations:
            - name: get-util
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: forecast
          path: "/demand"
          operations:
            - name: forecast
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Monitors cert expiry at EY.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at EY."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at EY."
          inputParameters:
            - name: domains
              in: body
              type: string
              description: "Domains to check."
          steps:
            - name: scan
              type: call
              call: "cert-scanner.scan"
              with:
                domains: "{{domains}}"
            - name: filter
              type: call
              call: "analytics.filter-expiring"
              with:
                certs: "{{scan.results}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "{{filter.count}} certs expiring"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Cert alert: {{filter.count}} expiring"
  consumes:
    - type: http
      namespace: cert-scanner
      baseUri: "https://certs.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cert_token"
      resources:
        - name: scans
          path: "/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Routes changes at EY through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at EY through ServiceNow and CAB approval."
  tags:
    - change-management
    - servicenow
    - itil
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: process-change
          description: "Process changes at EY."
          inputParameters:
            - name: change_id
              in: body
              type: string
              description: "Change ID."
            - name: date
              in: body
              type: string
              description: "Date."
          steps:
            - name: get
              type: call
              call: "servicenow.get-change"
              with:
                id: "{{change_id}}"
            - name: conflicts
              type: call
              call: "servicenow.check-conflicts"
              with:
                date: "{{date}}"
            - name: submit
              type: call
              call: "servicenow.update"
              with:
                id: "{{change_id}}"
                state: "approval"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "cab@co.com"
                subject: "CAB: {{change_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Creates a Google Forms survey for post-engagement client feedback and sends the form link to the client contact via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Client Feedback Survey via Google Forms"
  description: "Creates a Google Forms survey for post-engagement client feedback and sends the form link to the client contact via Microsoft Outlook."
  tags:
    - client-engagement
    - google-forms
    - microsoft-outlook
    - feedback
capability:
  exposes:
    - type: mcp
      namespace: client-feedback
      port: 8080
      tools:
        - name: send-feedback-survey
          description: "Create a Google Forms feedback survey and send the link to the client contact."
          inputParameters:
            - name: form_template_id
              in: body
              type: string
              description: "The Google Forms template ID."
            - name: client_email
              in: body
              type: string
              description: "The client contact email."
            - name: engagement_name
              in: body
              type: string
              description: "The engagement name for context."
          steps:
            - name: create-form
              type: call
              call: "googleforms.create-form"
              with:
                template_id: "{{form_template_id}}"
                title: "EY Engagement Feedback - {{engagement_name}}"
            - name: send-email
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{client_email}}"
                subject: "We value your feedback - {{engagement_name}}"
                body: "Thank you for working with EY. Please share your feedback: {{create-form.responder_uri}}"
  consumes:
    - type: http
      namespace: googleforms
      baseUri: "https://forms.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_forms_token"
      resources:
        - name: forms
          path: "/forms"
          operations:
            - name: create-form
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Pulls client financial data from Bloomberg, retrieves engagement history from Salesforce, generates a risk score summary, and posts findings to the engagement Confluence space.

naftiko: "0.5"
info:
  label: "Client Risk Assessment Pipeline"
  description: "Pulls client financial data from Bloomberg, retrieves engagement history from Salesforce, generates a risk score summary, and posts findings to the engagement Confluence space."
  tags:
    - advisory
    - risk-management
    - bloomberg
    - salesforce
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: risk-assessment
      port: 8080
      tools:
        - name: assess-client-risk
          description: "Given a Bloomberg ticker and Salesforce account ID, compile client financial indicators and engagement history into a risk summary posted to Confluence."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Bloomberg ticker symbol for the client entity."
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID for the client."
            - name: confluence_space
              in: body
              type: string
              description: "Confluence space key for the engagement."
          steps:
            - name: get-financials
              type: call
              call: "bloomberg.get-company-data"
              with:
                ticker: "{{ticker}}"
            - name: get-engagement-history
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{account_id}}"
            - name: publish-assessment
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space}}"
                title: "Risk Assessment - {{get-financials.company_name}}"
                body: "Revenue: {{get-financials.revenue}}. Debt-to-equity: {{get-financials.debt_equity_ratio}}. Last engagement: {{get-engagement-history.last_engagement_date}}. Engagement count: {{get-engagement-history.opportunity_count}}."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: company-data
          path: "/catalogs/bbg/fields?identifier={{ticker}}"
          inputParameters:
            - name: ticker
              in: query
          operations:
            - name: get-company-data
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://ey.my.salesforce.com/services/data/v59.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: confluence
      baseUri: "https://ey-collab.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Optimizes cloud costs at EY via Azure, FinOps, Jira, and Power BI.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at EY via Azure, FinOps, Jira, and Power BI."
  tags:
    - cloud
    - cost-management
    - finops
capability:
  exposes:
    - type: mcp
      namespace: cloud-opt
      port: 8080
      tools:
        - name: optimize
          description: "Optimize cloud costs at EY."
          inputParameters:
            - name: provider
              in: body
              type: string
              description: "Provider."
            - name: range
              in: body
              type: string
              description: "Range."
          steps:
            - name: spend
              type: call
              call: "cloud.get-costs"
              with:
                provider: "{{provider}}"
                range: "{{range}}"
            - name: savings
              type: call
              call: "finops.analyze"
              with:
                data: "{{spend.data}}"
            - name: action
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Save ${{savings.potential}}"
            - name: report
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cloud"
  consumes:
    - type: http
      namespace: cloud
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: costs
          path: "/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-costs
              method: POST
    - type: http
      namespace: finops
      baseUri: "https://finops.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.finops_token"
      resources:
        - name: analysis
          path: "/savings"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Searches Confluence at EY.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at EY."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at EY."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://ey.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

Creates a new knowledge article in Confluence from audit methodology updates, then notifies the relevant Microsoft Teams channel with a link to the published page.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Article Publisher"
  description: "Creates a new knowledge article in Confluence from audit methodology updates, then notifies the relevant Microsoft Teams channel with a link to the published page."
  tags:
    - knowledge-management
    - confluence
    - microsoft-teams
    - audit
capability:
  exposes:
    - type: mcp
      namespace: km-publish
      port: 8080
      tools:
        - name: publish-knowledge-article
          description: "Create a Confluence page with the given title and body content, then notify the specified Teams channel."
          inputParameters:
            - name: space_key
              in: body
              type: string
              description: "The Confluence space key."
            - name: title
              in: body
              type: string
              description: "The page title."
            - name: body_content
              in: body
              type: string
              description: "The page body in Confluence storage format."
            - name: teams_channel_webhook
              in: body
              type: string
              description: "The Microsoft Teams incoming webhook URL."
          steps:
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{space_key}}"
                title: "{{title}}"
                body: "{{body_content}}"
            - name: notify-teams
              type: call
              call: "msteams.send-webhook"
              with:
                webhook_url: "{{teams_channel_webhook}}"
                text: "New knowledge article published: [{{title}}]({{create-page.url}})"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://ey-collab.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: webhooks
          path: "/{{webhook_url}}"
          inputParameters:
            - name: webhook_url
              in: path
          operations:
            - name: send-webhook
              method: POST

Tracks contract renewals at EY via contracts system, email, Jira, and Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at EY via contracts system, email, Jira, and Salesforce."
  tags:
    - procurement
    - contracts
    - salesforce
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renew
      port: 8080
      tools:
        - name: track
          description: "Track renewals at EY."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Contract ID."
            - name: owner
              in: body
              type: string
              description: "Owner email."
          steps:
            - name: get
              type: call
              call: "contracts.get"
              with:
                id: "{{contract_id}}"
            - name: remind
              type: call
              call: "email.send"
              with:
                to: "{{owner}}"
                subject: "Renewal: {{contract_id}}"
            - name: task
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                summary: "Renew {{contract_id}}"
            - name: crm
              type: call
              call: "salesforce.update"
              with:
                id: "{{contract_id}}"
                stage: "Renewal"
  consumes:
    - type: http
      namespace: contracts
      baseUri: "https://contracts.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.contracts_token"
      resources:
        - name: contracts
          path: "/contracts/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://ey.com.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opps
          path: "/sobjects/Opportunity"
          operations:
            - name: update
              method: PATCH

Reallocates costs at EY.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at EY."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at EY."
          inputParameters:
            - name: source
              in: body
              type: string
              description: "Source CC."
            - name: target
              in: body
              type: string
              description: "Target CC."
            - name: amount
              in: body
              type: number
              description: "Amount."
          steps:
            - name: current
              type: call
              call: "oracle.get-alloc"
              with:
                cc: "{{source}}"
            - name: compute
              type: call
              call: "analytics.realloc"
              with:
                source: "{{source}}"
                target: "{{target}}"
                amount: "{{amount}}"
            - name: post
              type: call
              call: "oracle.post-journal"
              with:
                entries: "{{compute.entries}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Reallocated ${{amount}} from {{source}} to {{target}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: allocations
          path: "/cost-centers/{{cc}}/allocations"
          inputParameters:
            - name: cc
              in: path
          operations:
            - name: get-alloc
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: realloc
          path: "/compute"
          operations:
            - name: realloc
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a pending invoice from Coupa, validates against the SAP purchase order, and routes for approval via Microsoft Power Automate.

naftiko: "0.5"
info:
  label: "Coupa Invoice Processing Workflow"
  description: "Retrieves a pending invoice from Coupa, validates against the SAP purchase order, and routes for approval via Microsoft Power Automate."
  tags:
    - finance
    - procurement
    - coupa
    - sap
    - microsoft-power-automate
capability:
  exposes:
    - type: mcp
      namespace: invoice-processing
      port: 8080
      tools:
        - name: process-invoice
          description: "Validate a Coupa invoice against SAP PO data and trigger approval workflow."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Coupa invoice ID."
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: flow_url
              in: body
              type: string
              description: "The Power Automate flow trigger URL."
          steps:
            - name: get-invoice
              type: call
              call: "coupa.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: trigger-approval
              type: call
              call: "powerautomate.trigger-flow"
              with:
                flow_url: "{{flow_url}}"
                invoice_amount: "{{get-invoice.total}}"
                po_amount: "{{get-po.total_value}}"
                vendor: "{{get-invoice.supplier_name}}"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://ey-client.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: sap
      baseUri: "https://ey-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      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: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: powerautomate
      baseUri: "https://prod-00.westus.logic.azure.com"
      authentication:
        type: none
      resources:
        - name: flows
          path: "/{{flow_url}}"
          inputParameters:
            - name: flow_url
              in: path
          operations:
            - name: trigger-flow
              method: POST

Monitors data pipelines at EY via Databricks, Snowflake, Slack, and ServiceNow.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at EY via Databricks, Snowflake, Slack, and ServiceNow."
  tags:
    - data-engineering
    - databricks
    - monitoring
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pipeline-mon
      port: 8080
      tools:
        - name: monitor
          description: "Monitor pipelines at EY."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          steps:
            - name: status
              type: call
              call: "databricks.get-run"
              with:
                id: "{{pipeline_id}}"
            - name: quality
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT COUNT(*) FROM out WHERE p='{{pipeline_id}}'"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#data"
                text: "Pipeline {{pipeline_id}}: {{status.state}}"
            - name: incident
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "Pipeline {{pipeline_id}} issue"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://ey.com.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/get"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://ey.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Runs a Databricks notebook to perform audit analytics on client data and posts the run URL to the engagement Slack channel.

naftiko: "0.5"
info:
  label: "Databricks Notebook Execution for Audit Analytics"
  description: "Runs a Databricks notebook to perform audit analytics on client data and posts the run URL to the engagement Slack channel."
  tags:
    - audit
    - analytics
    - databricks
    - slack
capability:
  exposes:
    - type: mcp
      namespace: audit-analytics
      port: 8080
      tools:
        - name: run-audit-notebook
          description: "Execute a Databricks notebook for audit analytics and notify the team via Slack."
          inputParameters:
            - name: notebook_path
              in: body
              type: string
              description: "The Databricks notebook path."
            - name: cluster_id
              in: body
              type: string
              description: "The Databricks cluster ID."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for notification."
          steps:
            - name: submit-run
              type: call
              call: "databricks.submit-run"
              with:
                notebook_path: "{{notebook_path}}"
                cluster_id: "{{cluster_id}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Audit analytics notebook submitted. Run ID: {{submit-run.run_id}}. Track at: {{submit-run.run_page_url}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://ey-workspace.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs-runs
          path: "/jobs/runs/submit"
          operations:
            - name: submit-run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current health status of monitored infrastructure from Datadog and posts an alert to Slack if the host is down. Used by EY technology consulting teams.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Monitoring Check"
  description: "Retrieves the current health status of monitored infrastructure from Datadog and posts an alert to Slack if the host is down. Used by EY technology consulting teams."
  tags:
    - consulting
    - monitoring
    - datadog
    - infrastructure
    - slack
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-host-status
          description: "Check a Datadog host status and alert the Slack channel if the host is unhealthy."
          inputParameters:
            - name: hostname
              in: body
              type: string
              description: "The hostname to check in Datadog."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for infrastructure alerts."
          steps:
            - name: check-host
              type: call
              call: "datadog.get-host"
              with:
                hostname: "{{hostname}}"
            - name: alert-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Host {{hostname}} status: {{check-host.status}}. Apps: {{check-host.apps}}. Last reported: {{check-host.last_reported}}."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: "DD-API-KEY"
        in: header
        value: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: hosts
          path: "/hosts?filter={{hostname}}"
          inputParameters:
            - name: hostname
              in: query
          operations:
            - name: get-host
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks Datadog monitor at EY.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at EY."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at EY."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Sends an engagement letter via DocuSign for client signature and logs the envelope status in ServiceNow.

naftiko: "0.5"
info:
  label: "DocuSign Engagement Letter Sender"
  description: "Sends an engagement letter via DocuSign for client signature and logs the envelope status in ServiceNow."
  tags:
    - client-engagement
    - docusign
    - servicenow
    - legal
capability:
  exposes:
    - type: mcp
      namespace: engagement-letters
      port: 8080
      tools:
        - name: send-engagement-letter
          description: "Send an engagement letter for electronic signature via DocuSign and log to ServiceNow."
          inputParameters:
            - name: template_id
              in: body
              type: string
              description: "The DocuSign template ID for the engagement letter."
            - name: signer_email
              in: body
              type: string
              description: "The client signer email address."
            - name: signer_name
              in: body
              type: string
              description: "The client signer full name."
            - name: engagement_id
              in: body
              type: string
              description: "The ServiceNow engagement record ID."
          steps:
            - name: send-envelope
              type: call
              call: "docusign.create-envelope"
              with:
                template_id: "{{template_id}}"
                signer_email: "{{signer_email}}"
                signer_name: "{{signer_name}}"
            - name: log-to-servicenow
              type: call
              call: "servicenow.update-engagement"
              with:
                engagement_id: "{{engagement_id}}"
                docusign_envelope_id: "{{send-envelope.envelope_id}}"
                letter_status: "sent"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/$secrets.docusign_account_id/envelopes"
          operations:
            - name: create-envelope
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: engagements
          path: "/table/x_ey_engagement/{{engagement_id}}"
          inputParameters:
            - name: engagement_id
              in: path
          operations:
            - name: update-engagement
              method: PATCH

Tests disaster recovery at EY via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at EY via failover, health checks, and reporting."
  tags:
    - disaster-recovery
    - business-continuity
    - testing
capability:
  exposes:
    - type: mcp
      namespace: dr-test
      port: 8080
      tools:
        - name: test-dr
          description: "Test DR at EY."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Plan ID."
            - name: type
              in: body
              type: string
              description: "Test type."
          steps:
            - name: failover
              type: call
              call: "dr.failover"
              with:
                plan: "{{plan_id}}"
                type: "{{type}}"
            - name: validate
              type: call
              call: "monitoring.check"
              with:
                scope: "critical"
            - name: measure
              type: call
              call: "dr.metrics"
              with:
                id: "{{failover.id}}"
            - name: report
              type: call
              call: "confluence.create-page"
              with:
                title: "DR - {{plan_id}}"
                body: "RTO:{{measure.rto}}m RPO:{{measure.rpo}}m"
  consumes:
    - type: http
      namespace: dr
      baseUri: "https://dr.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.dr_token"
      resources:
        - name: failovers
          path: "/failovers"
          operations:
            - name: failover
              method: POST
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: health
          path: "/checks"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://ey.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Detects infrastructure drift at EY via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at EY via Terraform, Slack, and Jira."
  tags:
    - infrastructure
    - terraform
    - drift-detection
    - devops
capability:
  exposes:
    - type: mcp
      namespace: drift-det
      port: 8080
      tools:
        - name: detect
          description: "Detect drift at EY."
          inputParameters:
            - name: ws_id
              in: body
              type: string
              description: "Workspace ID."
            - name: env
              in: body
              type: string
              description: "Environment."
          steps:
            - name: plan
              type: call
              call: "terraform.run"
              with:
                ws: "{{ws_id}}"
            - name: check
              type: call
              call: "terraform.get-plan"
              with:
                run: "{{plan.id}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#infra"
                text: "Drift {{env}}: {{check.changes}} changes"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                summary: "Drift in {{env}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks ES index at EY.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at EY."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at EY."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "Index name."
          call: "es.get-health"
          with:
            index: "{{index}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: docs
              type: number
              mapping: "$.docs.count"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://es.ey.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

Offboards employees at EY via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at EY via Okta, Slack, ServiceNow, and storage."
  tags:
    - hr
    - offboarding
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: offboard
          description: "Offboard employees at EY."
          inputParameters:
            - name: emp_id
              in: body
              type: string
              description: "Employee ID."
            - name: last_day
              in: body
              type: string
              description: "Last day."
          steps:
            - name: disable
              type: call
              call: "okta.deactivate"
              with:
                user: "{{emp_id}}"
            - name: revoke
              type: call
              call: "slack.remove"
              with:
                user: "{{emp_id}}"
            - name: return
              type: call
              call: "servicenow.create-request"
              with:
                type: "return"
                emp: "{{emp_id}}"
            - name: archive
              type: call
              call: "storage.archive"
              with:
                user: "{{emp_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://ey.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user}}/lifecycle/deactivate"
          inputParameters:
            - name: user
              in: path
          operations:
            - name: deactivate
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.remove"
          operations:
            - name: remove
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: storage
      baseUri: "https://storage.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

Audits expenses at EY via Concur, compliance checks, and email.

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at EY via Concur, compliance checks, and email."
  tags:
    - finance
    - travel
    - sap-concur
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit
          description: "Audit expenses at EY."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Report ID."
          steps:
            - name: get
              type: call
              call: "concur.get-report"
              with:
                id: "{{report_id}}"
            - name: check
              type: call
              call: "compliance.check"
              with:
                expenses: "{{get.entries}}"
            - name: flag
              type: call
              call: "workflow.flag"
              with:
                id: "{{report_id}}"
                violations: "{{check.violations}}"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "{{get.approver}}"
                subject: "Expense {{report_id}} violations"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: policies
          path: "/check"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: reviews
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Retrieves financial fundamentals from FactSet for a client entity. Used by EY valuation and advisory teams for comparable company analysis.

naftiko: "0.5"
info:
  label: "FactSet Financial Data Retrieval"
  description: "Retrieves financial fundamentals from FactSet for a client entity. Used by EY valuation and advisory teams for comparable company analysis."
  tags:
    - advisory
    - valuation
    - factset
    - financial-analysis
capability:
  exposes:
    - type: mcp
      namespace: financial-data
      port: 8080
      tools:
        - name: get-factset-financials
          description: "Retrieve financial fundamentals from FactSet by entity identifier."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "The FactSet entity identifier."
            - name: metrics
              in: body
              type: string
              description: "Comma-separated list of financial metrics (e.g., revenue,ebitda,net_income)."
          call: "factset.get-fundamentals"
          with:
            ids: "{{entity_id}}"
            metrics: "{{metrics}}"
          outputParameters:
            - name: data
              type: string
              mapping: "$.data"
  consumes:
    - type: http
      namespace: factset
      baseUri: "https://api.factset.com/content/factset-fundamentals/v2"
      authentication:
        type: basic
        username: "$secrets.factset_user"
        password: "$secrets.factset_api_key"
      resources:
        - name: fundamentals
          path: "/fundamentals?ids={{ids}}&metrics={{metrics}}"
          inputParameters:
            - name: ids
              in: query
            - name: metrics
              in: query
          operations:
            - name: get-fundamentals
              method: GET

Analyzes feedback at EY via surveys, AI sentiment, and Power BI.

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at EY via surveys, AI sentiment, and Power BI."
  tags:
    - customer-experience
    - analytics
    - sentiment-analysis
capability:
  exposes:
    - type: mcp
      namespace: feedback
      port: 8080
      tools:
        - name: analyze
          description: "Analyze feedback at EY."
          inputParameters:
            - name: survey_id
              in: body
              type: string
              description: "Survey ID."
          steps:
            - name: collect
              type: call
              call: "survey.get"
              with:
                id: "{{survey_id}}"
            - name: sentiment
              type: call
              call: "ai.analyze"
              with:
                text: "{{collect.responses}}"
            - name: themes
              type: call
              call: "ai.themes"
              with:
                data: "{{collect.responses}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cx"
  consumes:
    - type: http
      namespace: survey
      baseUri: "https://surveys.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.survey_token"
      resources:
        - name: responses
          path: "/surveys/{{id}}/responses"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Checks GitHub repo at EY.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at EY."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at EY."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo."
            - name: branch
              in: body
              type: string
              description: "Branch."
          call: "github.get-branch"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
          outputParameters:
            - name: sha
              type: string
              mapping: "$.commit.sha"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branches
          path: "/repos/org/{{repo}}/branches/{{branch}}"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch
              method: GET

Retrieves call analytics from Gong for a specific engagement opportunity. Used by EY business development teams to review client interaction insights and improve win rates.

naftiko: "0.5"
info:
  label: "Gong Sales Call Intelligence Lookup"
  description: "Retrieves call analytics from Gong for a specific engagement opportunity. Used by EY business development teams to review client interaction insights and improve win rates."
  tags:
    - business-development
    - gong
    - sales
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: call-intelligence
      port: 8080
      tools:
        - name: get-call-analytics
          description: "Retrieve Gong call analytics for a specific call ID."
          inputParameters:
            - name: call_id
              in: body
              type: string
              description: "The Gong call ID."
          call: "gong.get-call"
          with:
            call_id: "{{call_id}}"
          outputParameters:
            - name: duration
              type: string
              mapping: "$.call.duration"
            - name: talk_ratio
              type: string
              mapping: "$.call.talkRatio"
            - name: topics
              type: string
              mapping: "$.call.topics"
            - name: action_items
              type: string
              mapping: "$.call.actionItems"
  consumes:
    - type: http
      namespace: gong
      baseUri: "https://api.gong.io/v2"
      authentication:
        type: bearer
        token: "$secrets.gong_token"
      resources:
        - name: calls
          path: "/calls/{{call_id}}/transcript"
          inputParameters:
            - name: call_id
              in: path
          operations:
            - name: get-call
              method: GET

Retrieves website traffic metrics from Google Analytics for a client property. Used by EY digital consulting teams to benchmark client web performance.

naftiko: "0.5"
info:
  label: "Google Analytics Client Website Metrics"
  description: "Retrieves website traffic metrics from Google Analytics for a client property. Used by EY digital consulting teams to benchmark client web performance."
  tags:
    - consulting
    - analytics
    - google-analytics
    - digital
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-website-metrics
          description: "Retrieve Google Analytics metrics for a client property by date range."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The Google Analytics property ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "ga.run-report"
          with:
            property_id: "{{property_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: sessions
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: users
              type: string
              mapping: "$.rows[0].metricValues[1].value"
            - name: bounce_rate
              type: string
              mapping: "$.rows[0].metricValues[2].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

Checks Grafana dashboard at EY.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at EY."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at EY."
          inputParameters:
            - name: uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dash"
          with:
            uid: "{{uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.ey.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dash
              method: GET

When a new lead is captured in HubSpot, syncs the contact to Salesforce as a lead record and notifies the business development team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "HubSpot Lead Capture to Salesforce Sync"
  description: "When a new lead is captured in HubSpot, syncs the contact to Salesforce as a lead record and notifies the business development team via Microsoft Teams."
  tags:
    - business-development
    - hubspot
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lead-sync
      port: 8080
      tools:
        - name: sync-lead-to-salesforce
          description: "Sync a HubSpot contact to Salesforce as a lead and notify the BD team."
          inputParameters:
            - name: hubspot_contact_id
              in: body
              type: string
              description: "The HubSpot contact ID."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Microsoft Teams channel ID for notifications."
          steps:
            - name: get-hubspot-contact
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{hubspot_contact_id}}"
            - name: create-sf-lead
              type: call
              call: "salesforce.create-lead"
              with:
                first_name: "{{get-hubspot-contact.firstname}}"
                last_name: "{{get-hubspot-contact.lastname}}"
                email: "{{get-hubspot-contact.email}}"
                company: "{{get-hubspot-contact.company}}"
            - name: notify-bd-team
              type: call
              call: "msteams.post-channel-message"
              with:
                team_id: "ey-business-development"
                channel_id: "{{teams_channel_id}}"
                text: "New lead synced: {{get-hubspot-contact.firstname}} {{get-hubspot-contact.lastname}} from {{get-hubspot-contact.company}}. Salesforce Lead ID: {{create-sf-lead.id}}."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://ey.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers an Informatica Cloud data quality job for client data validation during audit engagements and posts the run status to the audit Slack channel.

naftiko: "0.5"
info:
  label: "Informatica Data Quality Job Runner"
  description: "Triggers an Informatica Cloud data quality job for client data validation during audit engagements and posts the run status to the audit Slack channel."
  tags:
    - audit
    - data-quality
    - informatica
    - automation
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-job
          description: "Execute an Informatica Cloud data quality task and notify the team via Slack."
          inputParameters:
            - name: task_id
              in: body
              type: string
              description: "The Informatica Cloud task ID."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for job status notifications."
          steps:
            - name: start-job
              type: call
              call: "informatica.start-job"
              with:
                task_id: "{{task_id}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Informatica data quality job started. Task: {{task_id}}. Run ID: {{start-job.run_id}}. Status: {{start-job.status}}."
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: jobs
          path: "/job"
          operations:
            - name: start-job
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Escalates IT incidents at EY via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at EY via ServiceNow, PagerDuty, and Slack."
  tags:
    - incident-management
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Escalate incidents at EY."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: page
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{get-incident.description}}"
                urgency: "{{severity}}"
            - name: channel
              type: call
              call: "slack.create-channel"
              with:
                name: "inc-{{incident_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#inc-{{incident_id}}"
                text: "P{{severity}}: {{get-incident.description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST

Creates a Jira issue for a new audit or advisory task, assigns it to the specified team member, and links the issue to the engagement Confluence page.

naftiko: "0.5"
info:
  label: "Jira Engagement Task Creator"
  description: "Creates a Jira issue for a new audit or advisory task, assigns it to the specified team member, and links the issue to the engagement Confluence page."
  tags:
    - project-management
    - jira
    - confluence
    - engagement
capability:
  exposes:
    - type: mcp
      namespace: task-management
      port: 8080
      tools:
        - name: create-engagement-task
          description: "Create a Jira issue for an engagement task, assign it, and link to the Confluence engagement page."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "The Jira project key."
            - name: summary
              in: body
              type: string
              description: "The task summary."
            - name: assignee_email
              in: body
              type: string
              description: "Email of the assignee."
            - name: confluence_page_id
              in: body
              type: string
              description: "The Confluence page ID to link."
          steps:
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                project_key: "{{project_key}}"
                summary: "{{summary}}"
                assignee: "{{assignee_email}}"
                issue_type: "Task"
            - name: add-confluence-link
              type: call
              call: "jira.add-remote-link"
              with:
                issue_key: "{{create-issue.key}}"
                url: "https://ey-collab.atlassian.net/wiki/pages/viewpage.action?pageId={{confluence_page_id}}"
                title: "Engagement Documentation"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://ey-collab.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
        - name: remote-links
          path: "/issue/{{issue_key}}/remotelink"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-remote-link
              method: POST

Retrieves sprint progress at EY.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at EY."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at EY."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Project key."
          call: "jira.get-sprints"
          with:
            project: "{{project_key}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.values[0].name"
            - name: state
              type: string
              mapping: "$.values[0].state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/agile/1.0"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/1/sprint"
          operations:
            - name: get-sprints
              method: GET

Maintains KB at EY by finding stale articles and notifying owners.

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at EY by finding stale articles and notifying owners."
  tags:
    - knowledge-management
    - confluence
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: kb-maint
      port: 8080
      tools:
        - name: maintain-kb
          description: "Maintain KB at EY."
          inputParameters:
            - name: space
              in: body
              type: string
              description: "Confluence space."
            - name: stale_days
              in: body
              type: number
              description: "Days threshold."
          steps:
            - name: find
              type: call
              call: "confluence.search-stale"
              with:
                space: "{{space}}"
                days: "{{stale_days}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{find.owners}}"
                subject: "KB review needed"
            - name: flag
              type: call
              call: "confluence.add-label"
              with:
                pages: "{{find.ids}}"
                label: "needs-review"
            - name: report
              type: call
              call: "slack.post-message"
              with:
                channel: "#kb"
                text: "KB: {{find.count}} stale articles"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://ey.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search-stale
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates KPI digest at EY from Snowflake, Oracle, Power BI, and email.

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at EY from Snowflake, Oracle, Power BI, and email."
  tags:
    - reporting
    - kpi
    - snowflake
    - executive
capability:
  exposes:
    - type: mcp
      namespace: kpi-digest
      port: 8080
      tools:
        - name: gen-digest
          description: "Generate KPI digest at EY."
          inputParameters:
            - name: week
              in: body
              type: string
              description: "Week ending."
            - name: dist
              in: body
              type: string
              description: "Distribution list."
          steps:
            - name: ops
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM kpis WHERE w='{{week}}'"
            - name: fin
              type: call
              call: "oracle.get-summary"
              with:
                period: "{{week}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "exec_kpis"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "{{dist}}"
                subject: "KPIs - {{week}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://ey.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/summary"
          operations:
            - name: get-summary
              method: GET
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks K8s pod health at EY.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at EY."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at EY."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod
              in: body
              type: string
              description: "Pod name."
          call: "k8s.get-pod"
          with:
            namespace: "{{namespace}}"
            pod: "{{pod}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.status.phase"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://k8s.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: pods
          path: "/namespaces/{{namespace}}/pods/{{pod}}"
          inputParameters:
            - name: namespace
              in: path
            - name: pod
              in: path
          operations:
            - name: get-pod
              method: GET

Checks license compliance at EY via scanning, entitlements, and procurement.

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at EY via scanning, entitlements, and procurement."
  tags:
    - compliance
    - licensing
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: license-comp
      port: 8080
      tools:
        - name: check-licenses
          description: "Check license compliance at EY."
          inputParameters:
            - name: software
              in: body
              type: string
              description: "Software."
            - name: vendor
              in: body
              type: string
              description: "Vendor."
          steps:
            - name: scan
              type: call
              call: "assets.installations"
              with:
                sw: "{{software}}"
            - name: entitlements
              type: call
              call: "licenses.get"
              with:
                sw: "{{software}}"
            - name: flag
              type: call
              call: "compliance.flag"
              with:
                installed: "{{scan.count}}"
                entitled: "{{entitlements.count}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "license"
                sw: "{{software}}"
  consumes:
    - type: http
      namespace: assets
      baseUri: "https://assets.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_token"
      resources:
        - name: installations
          path: "/installations"
          operations:
            - name: installations
              method: GET
    - type: http
      namespace: licenses
      baseUri: "https://licenses.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.license_token"
      resources:
        - name: ent
          path: "/entitlements"
          operations:
            - name: get
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: overages
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Retrieves the current compliance score from Microsoft Purview for an EY client tenant. Used during regulatory advisory engagements to benchmark compliance posture.

naftiko: "0.5"
info:
  label: "Microsoft Purview Compliance Score Check"
  description: "Retrieves the current compliance score from Microsoft Purview for an EY client tenant. Used during regulatory advisory engagements to benchmark compliance posture."
  tags:
    - advisory
    - compliance
    - microsoft-purview
    - governance
capability:
  exposes:
    - type: mcp
      namespace: compliance-scoring
      port: 8080
      tools:
        - name: get-compliance-score
          description: "Retrieve the Microsoft Purview compliance score for a tenant."
          inputParameters:
            - name: tenant_id
              in: body
              type: string
              description: "The Azure AD tenant ID."
          call: "purview.get-compliance-score"
          with:
            tenant_id: "{{tenant_id}}"
          outputParameters:
            - name: score
              type: string
              mapping: "$.complianceScore"
            - name: max_score
              type: string
              mapping: "$.maxScore"
            - name: assessment_count
              type: string
              mapping: "$.assessmentCount"
  consumes:
    - type: http
      namespace: purview
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: compliance
          path: "/security/secureScores?$top=1"
          operations:
            - name: get-compliance-score
              method: GET

Retrieves high-severity security alerts from Microsoft Sentinel and creates corresponding ServiceNow incidents for the EY cybersecurity advisory team to investigate.

naftiko: "0.5"
info:
  label: "Microsoft Sentinel Security Alert Triage"
  description: "Retrieves high-severity security alerts from Microsoft Sentinel and creates corresponding ServiceNow incidents for the EY cybersecurity advisory team to investigate."
  tags:
    - advisory
    - security
    - microsoft-sentinel
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: security-triage
      port: 8080
      tools:
        - name: triage-sentinel-alerts
          description: "Pull high-severity Sentinel alerts and create ServiceNow incidents for investigation."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Log Analytics workspace ID for Sentinel."
            - name: severity
              in: body
              type: string
              description: "Alert severity filter (e.g., High, Critical)."
          steps:
            - name: get-alerts
              type: call
              call: "sentinel.get-alerts"
              with:
                workspace_id: "{{workspace_id}}"
                severity: "{{severity}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Sentinel Alert: {{get-alerts.alerts[0].title}}"
                category: "security_incident"
                priority: "1"
                description: "Severity: {{severity}}. Alert count: {{get-alerts.alert_count}}. First alert: {{get-alerts.alerts[0].description}}."
  consumes:
    - type: http
      namespace: sentinel
      baseUri: "https://management.azure.com/subscriptions/$secrets.azure_subscription_id/resourceGroups/$secrets.azure_resource_group/providers/Microsoft.OperationalInsights/workspaces"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: alerts
          path: "/{{workspace_id}}/providers/Microsoft.SecurityInsights/incidents?api-version=2023-11-01&$filter=properties/severity eq '{{severity}}'"
          inputParameters:
            - name: workspace_id
              in: path
            - name: severity
              in: query
          operations:
            - name: get-alerts
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://ey.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

Creates a Microsoft Teams meeting for engagement team members with a specified agenda and sends calendar invites via Outlook.

naftiko: "0.5"
info:
  label: "Microsoft Teams Meeting Scheduler"
  description: "Creates a Microsoft Teams meeting for engagement team members with a specified agenda and sends calendar invites via Outlook."
  tags:
    - collaboration
    - microsoft-teams
    - microsoft-outlook
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: meeting-scheduler
      port: 8080
      tools:
        - name: schedule-teams-meeting
          description: "Schedule a Teams meeting and send calendar invites to attendees."
          inputParameters:
            - name: organizer_email
              in: body
              type: string
              description: "Email of the meeting organizer."
            - name: subject
              in: body
              type: string
              description: "Meeting subject."
            - name: start_time
              in: body
              type: string
              description: "Meeting start time in ISO 8601 format."
            - name: end_time
              in: body
              type: string
              description: "Meeting end time in ISO 8601 format."
            - name: attendees
              in: body
              type: string
              description: "Comma-separated list of attendee emails."
          call: "outlook.create-online-meeting"
          with:
            organizer: "{{organizer_email}}"
            subject: "{{subject}}"
            start: "{{start_time}}"
            end: "{{end_time}}"
            attendees: "{{attendees}}"
            is_online: true
          outputParameters:
            - name: meeting_url
              type: string
              mapping: "$.onlineMeeting.joinUrl"
            - name: event_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: events
          path: "/users/{{organizer}}/events"
          inputParameters:
            - name: organizer
              in: path
          operations:
            - name: create-online-meeting
              method: POST

Generates monthly security reports at EY from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at EY from Splunk and Qualys."
  tags:
    - security
    - reporting
    - splunk
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sec-report
      port: 8080
      tools:
        - name: gen-sec-report
          description: "Generate security report at EY."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "Month."
          steps:
            - name: splunk
              type: call
              call: "splunk.search"
              with:
                query: "index=security earliest=-30d"
            - name: scans
              type: call
              call: "qualys.results"
              with:
                month: "{{month}}"
            - name: compile
              type: call
              call: "analytics.compile-security"
              with:
                events: "{{splunk.count}}"
                vulns: "{{scans.critical}}"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "ciso@co.com"
                subject: "Security - {{month}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.ey.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: results
          path: "/fo/scan/results"
          operations:
            - name: results
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: security
          path: "/compile"
          operations:
            - name: compile-security
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks the health status of a MuleSoft API deployment. Used by EY technology consulting teams to monitor client integration platform health during transformation projects.

naftiko: "0.5"
info:
  label: "MuleSoft API Health Check"
  description: "Checks the health status of a MuleSoft API deployment. Used by EY technology consulting teams to monitor client integration platform health during transformation projects."
  tags:
    - consulting
    - integration
    - mulesoft
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: api-health
      port: 8080
      tools:
        - name: check-mulesoft-api-health
          description: "Check the deployment status and health of a MuleSoft API by environment and application name."
          inputParameters:
            - name: environment_id
              in: body
              type: string
              description: "The MuleSoft environment ID."
            - name: app_name
              in: body
              type: string
              description: "The application name."
          call: "mulesoft.get-deployment-status"
          with:
            environment_id: "{{environment_id}}"
            app_name: "{{app_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_update
              type: string
              mapping: "$.lastUpdateTime"
            - name: worker_count
              type: string
              mapping: "$.workers.amount"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/cloudhub/api/v2"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: applications
          path: "/applications/{{app_name}}?environmentId={{environment_id}}"
          inputParameters:
            - name: app_name
              in: path
            - name: environment_id
              in: query
          operations:
            - name: get-deployment-status
              method: GET

Onboards employees at EY with Okta, ServiceNow, Slack, and calendar.

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at EY with Okta, ServiceNow, Slack, and calendar."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: it-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Onboard employees at EY."
          inputParameters:
            - name: name
              in: body
              type: string
              description: "Name."
            - name: dept
              in: body
              type: string
              description: "Department."
            - name: start
              in: body
              type: string
              description: "Start date."
          steps:
            - name: okta
              type: call
              call: "okta.create-user"
              with:
                name: "{{name}}"
                department: "{{dept}}"
            - name: equip
              type: call
              call: "servicenow.create-request"
              with:
                type: "new_hire"
                for: "{{name}}"
            - name: slack
              type: call
              call: "slack.invite"
              with:
                email: "{{okta.email}}"
            - name: orient
              type: call
              call: "calendar.create-event"
              with:
                title: "Orientation - {{name}}"
                date: "{{start}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://ey.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.invite"
          operations:
            - name: invite
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/hr/events"
          operations:
            - name: create-event
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for employee documents, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for employee documents, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department or service line the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "ey_hr_onboarding"
                folder_path: "NewHires/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to EY, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Documents are ready at {{provision-folder.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: servicenow
      baseUri: "https://ey.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks New Relic APM at EY.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at EY."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at EY."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "App ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: health
              type: string
              mapping: "$.application.health_status"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Checks Okta user at EY.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at EY."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at EY."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email."
          call: "okta.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://ey.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves vendor details from Oracle E-Business Suite by vendor ID. Used by EY audit teams to validate accounts payable vendor master data.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Vendor Lookup"
  description: "Retrieves vendor details from Oracle E-Business Suite by vendor ID. Used by EY audit teams to validate accounts payable vendor master data."
  tags:
    - audit
    - erp
    - oracle-e-business-suite
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ebs-vendors
      port: 8080
      tools:
        - name: get-vendor
          description: "Look up a vendor in Oracle E-Business Suite by vendor ID."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The Oracle EBS vendor ID."
          call: "ebs.get-vendor"
          with:
            vendor_id: "{{vendor_id}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.VendorName"
            - name: vendor_type
              type: string
              mapping: "$.VendorType"
            - name: payment_terms
              type: string
              mapping: "$.PaymentTerms"
            - name: active_flag
              type: string
              mapping: "$.EnabledFlag"
  consumes:
    - type: http
      namespace: ebs
      baseUri: "https://ey-ebs.oraclecloud.com/webservices/rest"
      authentication:
        type: basic
        username: "$secrets.ebs_user"
        password: "$secrets.ebs_password"
      resources:
        - name: vendors
          path: "/suppliers/{{vendor_id}}"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Extracts a financial consolidation report from Oracle Hyperion by entity and period, then uploads the report data to a SharePoint audit workpaper library for engagement documentation.

naftiko: "0.5"
info:
  label: "Oracle Hyperion Financial Report Extract"
  description: "Extracts a financial consolidation report from Oracle Hyperion by entity and period, then uploads the report data to a SharePoint audit workpaper library for engagement documentation."
  tags:
    - audit
    - finance
    - oracle-hyperion
    - consolidation
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: hyperion-reports
      port: 8080
      tools:
        - name: get-hyperion-report
          description: "Extract an Oracle Hyperion consolidation report and upload to SharePoint."
          inputParameters:
            - name: entity
              in: body
              type: string
              description: "The Hyperion entity name."
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g., FY2025)."
            - name: scenario
              in: body
              type: string
              description: "The scenario (e.g., Actual, Budget)."
            - name: sharepoint_site
              in: body
              type: string
              description: "The SharePoint site ID for workpaper storage."
          steps:
            - name: fetch-report
              type: call
              call: "hyperion.get-report"
              with:
                entity: "{{entity}}"
                period: "{{period}}"
                scenario: "{{scenario}}"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "{{sharepoint_site}}"
                folder_path: "Workpapers/Hyperion"
                file_name: "Hyperion_{{entity}}_{{period}}_{{scenario}}.json"
                content: "{{fetch-report.report_data}}"
  consumes:
    - type: http
      namespace: hyperion
      baseUri: "https://ey-hyperion.oraclecloud.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.hyperion_user"
        password: "$secrets.hyperion_password"
      resources:
        - name: reports
          path: "/applications/HFM/reports?entity={{entity}}&period={{period}}&scenario={{scenario}}"
          inputParameters:
            - name: entity
              in: query
            - name: period
              in: query
            - name: scenario
              in: query
          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: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Checks on-call at EY.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at EY."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at EY."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user
              type: string
              mapping: "$.oncalls[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Creates postmortems at EY.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at EY."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at EY."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          steps:
            - name: timeline
              type: call
              call: "pagerduty.get-log"
              with:
                id: "{{incident_id}}"
            - name: metrics
              type: call
              call: "datadog.get-metrics"
              with:
                incident: "{{incident_id}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Postmortem: {{timeline.title}}"
                body: "Impact: {{metrics.impact}}"
            - name: review
              type: call
              call: "calendar.create-event"
              with:
                title: "Review: {{timeline.title}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}/log_entries"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-log
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://ey.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Checks Power BI refresh at EY.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at EY."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at EY."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "power-bi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Triggers a dataset refresh in Power BI and notifies the consulting team via Slack when the refresh is queued. Used by EY consulting teams to ensure dashboards reflect the latest client data.

naftiko: "0.5"
info:
  label: "Power BI Report Refresh Trigger"
  description: "Triggers a dataset refresh in Power BI and notifies the consulting team via Slack when the refresh is queued. Used by EY consulting teams to ensure dashboards reflect the latest client data."
  tags:
    - consulting
    - analytics
    - power-bi
    - reporting
    - slack
capability:
  exposes:
    - type: mcp
      namespace: analytics-refresh
      port: 8080
      tools:
        - name: refresh-powerbi-dataset
          description: "Trigger a Power BI dataset refresh and notify the team via Slack."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for refresh notifications."
          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: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Power BI dataset refresh queued. Workspace: {{workspace_id}}, Dataset: {{dataset_id}}. Refresh ID: {{trigger-refresh.refresh_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates compliance reports at EY from Snowflake, Power BI, and email.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at EY from Snowflake, Power BI, and email."
  tags:
    - compliance
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: compliance-rpt
      port: 8080
      tools:
        - name: gen-report
          description: "Generate compliance reports at EY."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Quarter."
            - name: type
              in: body
              type: string
              description: "Type."
          steps:
            - name: data
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM compliance WHERE q='{{quarter}}'"
            - name: metrics
              type: call
              call: "analytics.compute"
              with:
                data: "{{data.results}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "compliance"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "compliance@co.com"
                subject: "{{type}} - {{quarter}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://ey.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: metrics
          path: "/compute"
          operations:
            - name: compute
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks Redis at EY.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at EY."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at EY."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "redis.get-info"
          with:
            instance: "{{instance}}"
          outputParameters:
            - name: memory
              type: string
              mapping: "$.used_memory_human"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: instances
          path: "/instances/{{instance}}/info"
          inputParameters:
            - name: instance
              in: path
          operations:
            - name: get-info
              method: GET

Retrieves real-time market data from Refinitiv Eikon for a given instrument. Used by EY transaction advisory teams for deal valuation and market analysis.

naftiko: "0.5"
info:
  label: "Refinitiv Eikon Market Data Lookup"
  description: "Retrieves real-time market data from Refinitiv Eikon for a given instrument. Used by EY transaction advisory teams for deal valuation and market analysis."
  tags:
    - advisory
    - transactions
    - refinitiv
    - market-data
capability:
  exposes:
    - type: mcp
      namespace: market-data
      port: 8080
      tools:
        - name: get-market-data
          description: "Retrieve market data from Refinitiv Eikon by instrument RIC."
          inputParameters:
            - name: ric
              in: body
              type: string
              description: "The Reuters Instrument Code (RIC)."
          call: "refinitiv.get-instrument"
          with:
            ric: "{{ric}}"
          outputParameters:
            - name: last_price
              type: string
              mapping: "$.data[0].fields.TRDPRC_1"
            - name: market_cap
              type: string
              mapping: "$.data[0].fields.MKT_CAP"
            - name: pe_ratio
              type: string
              mapping: "$.data[0].fields.PE_RATIO"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/data/pricing/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: instruments
          path: "/views/summary/{{ric}}"
          inputParameters:
            - name: ric
              in: path
          operations:
            - name: get-instrument
              method: GET

Checks release readiness at EY.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at EY."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at EY."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Release ID."
            - name: project
              in: body
              type: string
              description: "Project."
          steps:
            - name: tests
              type: call
              call: "azdo.get-tests"
              with:
                project: "{{project}}"
                release: "{{release_id}}"
            - name: quality
              type: call
              call: "sonarqube.get-gate"
              with:
                project: "{{project}}"
            - name: security
              type: call
              call: "security.get-scan"
              with:
                project: "{{project}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Release - {{release_id}}"
                body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/ey.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: tests
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-tests
              method: GET
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.ey.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality
          path: "/qualitygates/project_status"
          operations:
            - name: get-gate
              method: GET
    - type: http
      namespace: security
      baseUri: "https://security.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: scans
          path: "/results"
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://ey.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves pending access certification campaigns from SailPoint for IT audit review. Used by EY teams to validate client identity governance controls.

naftiko: "0.5"
info:
  label: "SailPoint Access Certification Review"
  description: "Retrieves pending access certification campaigns from SailPoint for IT audit review. Used by EY teams to validate client identity governance controls."
  tags:
    - audit
    - identity
    - sailpoint
    - governance
capability:
  exposes:
    - type: mcp
      namespace: identity-governance
      port: 8080
      tools:
        - name: get-certification-campaigns
          description: "Retrieve active access certification campaigns from SailPoint."
          inputParameters:
            - name: campaign_status
              in: body
              type: string
              description: "Campaign status filter (e.g., ACTIVE, COMPLETED)."
          call: "sailpoint.list-campaigns"
          with:
            status: "{{campaign_status}}"
          outputParameters:
            - name: campaigns
              type: string
              mapping: "$.value"
            - name: total_count
              type: string
              mapping: "$.count"
  consumes:
    - type: http
      namespace: sailpoint
      baseUri: "https://ey-client.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: campaigns
          path: "/campaigns?filters=status eq \"{{status}}\""
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-campaigns
              method: GET

Retrieves open opportunities from Salesforce for a given account and posts a pipeline summary to the business development Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Pipeline Lookup"
  description: "Retrieves open opportunities from Salesforce for a given account and posts a pipeline summary to the business development Microsoft Teams channel."
  tags:
    - sales
    - business-development
    - salesforce
    - pipeline
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bd-pipeline
      port: 8080
      tools:
        - name: get-opportunity-pipeline
          description: "Retrieve open Salesforce opportunities and post a summary to the BD Teams channel."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
            - name: teams_channel_webhook
              in: body
              type: string
              description: "The Microsoft Teams webhook for BD notifications."
          steps:
            - name: fetch-opportunities
              type: call
              call: "salesforce.query-opportunities"
              with:
                account_id: "{{account_id}}"
            - name: post-summary
              type: call
              call: "msteams.send-webhook"
              with:
                webhook_url: "{{teams_channel_webhook}}"
                text: "Pipeline for account {{account_id}}: {{fetch-opportunities.total_size}} open opportunities. Total value: {{fetch-opportunities.total_value}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://ey.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query?q=SELECT+Name,StageName,Amount,CloseDate+FROM+Opportunity+WHERE+AccountId='{{account_id}}'+AND+IsClosed=false"
          inputParameters:
            - name: account_id
              in: query
          operations:
            - name: query-opportunities
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: webhooks
          path: "/{{webhook_url}}"
          inputParameters:
            - name: webhook_url
              in: path
          operations:
            - name: send-webhook
              method: POST

Retrieves supplier risk data from SAP Ariba for a specified vendor, pulls additional financial data from Bloomberg, and posts a consolidated risk summary to the advisory Confluence space.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Risk Review"
  description: "Retrieves supplier risk data from SAP Ariba for a specified vendor, pulls additional financial data from Bloomberg, and posts a consolidated risk summary to the advisory Confluence space."
  tags:
    - advisory
    - procurement
    - sap-ariba
    - bloomberg
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: supplier-risk
      port: 8080
      tools:
        - name: review-supplier-risk
          description: "Compile supplier risk data from SAP Ariba and Bloomberg financial indicators into a Confluence summary."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: ticker
              in: body
              type: string
              description: "Bloomberg ticker for the supplier entity."
            - name: confluence_space
              in: body
              type: string
              description: "Confluence space key for the advisory engagement."
          steps:
            - name: get-supplier-data
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{supplier_id}}"
            - name: get-financial-data
              type: call
              call: "bloomberg.get-company-data"
              with:
                ticker: "{{ticker}}"
            - name: publish-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space}}"
                title: "Supplier Risk Review - {{get-supplier-data.supplier_name}}"
                body: "Supplier: {{get-supplier-data.supplier_name}}. Risk score: {{get-supplier-data.risk_score}}. Revenue: {{get-financial-data.revenue}}. Credit rating: {{get-financial-data.credit_rating}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      inputParameters:
        - name: apiKey
          in: header
          value: "$secrets.ariba_api_key"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: company-data
          path: "/catalogs/bbg/fields?identifier={{ticker}}"
          inputParameters:
            - name: ticker
              in: query
          operations:
            - name: get-company-data
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://ey-collab.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Creates a new expense report in SAP Concur for an EY professional, attaches receipt details, and notifies the approving manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Submission"
  description: "Creates a new expense report in SAP Concur for an EY professional, attaches receipt details, and notifies the approving manager via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-management
      port: 8080
      tools:
        - name: submit-expense-report
          description: "Create an expense report in SAP Concur with line items and notify the approver via Teams."
          inputParameters:
            - name: employee_email
              in: body
              type: string
              description: "The EY employee email address."
            - name: report_name
              in: body
              type: string
              description: "Name for the expense report."
            - name: total_amount
              in: body
              type: string
              description: "Total expense amount."
            - name: currency
              in: body
              type: string
              description: "Currency code (e.g., USD)."
            - name: approver_email
              in: body
              type: string
              description: "Email of the approving manager."
          steps:
            - name: create-report
              type: call
              call: "concur.create-expense-report"
              with:
                employee_email: "{{employee_email}}"
                report_name: "{{report_name}}"
                total: "{{total_amount}}"
                currency: "{{currency}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{approver_email}}"
                text: "New expense report '{{report_name}}' submitted by {{employee_email}} for {{total_amount}} {{currency}}. Report ID: {{create-report.report_id}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          operations:
            - name: create-expense-report
              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

Extracts data from a SAP HANA view for EY advisory analytics. Returns a result set used for client data modeling and transformation projects.

naftiko: "0.5"
info:
  label: "SAP HANA Data Extraction for Analytics"
  description: "Extracts data from a SAP HANA view for EY advisory analytics. Returns a result set used for client data modeling and transformation projects."
  tags:
    - advisory
    - data
    - sap-hana
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: hana-analytics
      port: 8080
      tools:
        - name: query-hana-view
          description: "Execute a query against a SAP HANA calculation view and return the result set."
          inputParameters:
            - name: schema
              in: body
              type: string
              description: "The HANA schema name."
            - name: view_name
              in: body
              type: string
              description: "The calculation view name."
            - name: top_rows
              in: body
              type: string
              description: "Number of rows to return."
          call: "hana.query-view"
          with:
            schema: "{{schema}}"
            view_name: "{{view_name}}"
            top: "{{top_rows}}"
          outputParameters:
            - name: row_count
              type: string
              mapping: "$.d.__count"
            - name: results
              type: string
              mapping: "$.d.results"
  consumes:
    - type: http
      namespace: hana
      baseUri: "https://ey-hana.sap.com/sap/hana/xs/odata"
      authentication:
        type: basic
        username: "$secrets.hana_user"
        password: "$secrets.hana_password"
      resources:
        - name: views
          path: "/{{schema}}/{{view_name}}.xsodata/Query?$top={{top}}&$format=json"
          inputParameters:
            - name: schema
              in: path
            - name: view_name
              in: path
            - name: top
              in: query
          operations:
            - name: query-view
              method: GET

Checks SAP PO at EY.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at EY."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at EY."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: vendor
              type: string
              mapping: "$.order.vendor"
            - name: status
              type: string
              mapping: "$.order.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-orders
          path: "/purchase-orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Retrieves a general ledger account balance from SAP S/4HANA by company code and fiscal year, then posts the balance summary to the audit engagement Slack channel for team visibility.

naftiko: "0.5"
info:
  label: "SAP S/4HANA General Ledger Lookup"
  description: "Retrieves a general ledger account balance from SAP S/4HANA by company code and fiscal year, then posts the balance summary to the audit engagement Slack channel for team visibility."
  tags:
    - audit
    - finance
    - sap
    - sap-s4hana
    - general-ledger
    - slack
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 and notify the audit team via Slack."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code (4-digit)."
            - name: gl_account
              in: body
              type: string
              description: "The general ledger account number."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year (YYYY)."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel for audit notifications."
          steps:
            - name: fetch-balance
              type: call
              call: "sap.get-gl-balance"
              with:
                company_code: "{{company_code}}"
                gl_account: "{{gl_account}}"
                fiscal_year: "{{fiscal_year}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "GL {{gl_account}} ({{company_code}}, FY{{fiscal_year}}): Balance {{fetch-balance.balance}} {{fetch-balance.currency}}. Debits: {{fetch-balance.debit_total}}, Credits: {{fetch-balance.credit_total}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://ey-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}}',GLAccount='{{gl_account}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: gl_account
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-gl-balance
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Remediates vulnerabilities at EY via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at EY via scanning, Jira, and Slack."
  tags:
    - security
    - vulnerability-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-fix
      port: 8080
      tools:
        - name: remediate
          description: "Fix vulnerabilities at EY."
          inputParameters:
            - name: target
              in: body
              type: string
              description: "Target."
            - name: policy
              in: body
              type: string
              description: "Policy."
          steps:
            - name: scan
              type: call
              call: "qualys.scan"
              with:
                target: "{{target}}"
                policy: "{{policy}}"
            - name: prioritize
              type: call
              call: "security.prioritize"
              with:
                scan: "{{scan.id}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Vulns: {{prioritize.critical}} critical"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Scan: {{prioritize.critical}} critical"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: scans
          path: "/fo/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: security
      baseUri: "https://security.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: vulns
          path: "/prioritize"
          operations:
            - name: prioritize
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://ey.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates a ServiceNow change request for a client IT environment change, routes it for CAB approval, and notifies the implementation team in Microsoft Teams once approved.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Pipeline"
  description: "Creates a ServiceNow change request for a client IT environment change, routes it for CAB approval, and notifies the implementation team in Microsoft Teams once approved."
  tags:
    - consulting
    - it-service-management
    - servicenow
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Create a ServiceNow change request and notify the implementation team in Teams."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Short description of the change."
            - name: change_type
              in: body
              type: string
              description: "Type of change (Normal, Standard, Emergency)."
            - name: assigned_group
              in: body
              type: string
              description: "The group responsible for implementation."
            - name: teams_channel_webhook
              in: body
              type: string
              description: "The Microsoft Teams webhook URL for notifications."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "{{short_description}}"
                type: "{{change_type}}"
                assignment_group: "{{assigned_group}}"
            - name: notify-team
              type: call
              call: "msteams.send-webhook"
              with:
                webhook_url: "{{teams_channel_webhook}}"
                text: "Change request {{create-change.number}} created: {{short_description}}. Type: {{change_type}}. Assigned to: {{assigned_group}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ey.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: webhooks
          path: "/{{webhook_url}}"
          inputParameters:
            - name: webhook_url
              in: path
          operations:
            - name: send-webhook
              method: POST

Checks IT incident in ServiceNow for EY.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for EY."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at EY."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Retrieves a ServiceNow incident by number and posts the status summary to the specified Microsoft Teams channel. Used by EY IT support and engagement teams to share ticket updates.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup and Teams Alert"
  description: "Retrieves a ServiceNow incident by number and posts the status summary to the specified Microsoft Teams channel. Used by EY IT support and engagement teams to share ticket updates."
  tags:
    - it-service-management
    - servicenow
    - incident
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-incidents
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident and post status to a Teams channel."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
            - name: teams_channel_webhook
              in: body
              type: string
              description: "The Microsoft Teams incoming webhook URL."
          steps:
            - name: fetch-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: post-to-teams
              type: call
              call: "msteams.send-webhook"
              with:
                webhook_url: "{{teams_channel_webhook}}"
                text: "Incident {{incident_number}}: {{fetch-incident.short_description}}. Priority: {{fetch-incident.priority}}. State: {{fetch-incident.state}}. Assigned to: {{fetch-incident.assigned_group}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://ey.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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: webhooks
          path: "/{{webhook_url}}"
          inputParameters:
            - name: webhook_url
              in: path
          operations:
            - name: send-webhook
              method: POST

Uploads an audit workpaper document to a SharePoint engagement site and notifies the engagement manager via Outlook email.

naftiko: "0.5"
info:
  label: "SharePoint Audit Workpaper Upload"
  description: "Uploads an audit workpaper document to a SharePoint engagement site and notifies the engagement manager via Outlook email."
  tags:
    - audit
    - document-management
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: workpaper-mgmt
      port: 8080
      tools:
        - name: upload-workpaper
          description: "Upload a workpaper to SharePoint and notify the engagement manager."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: folder_path
              in: body
              type: string
              description: "The folder path within the document library."
            - name: file_name
              in: body
              type: string
              description: "Name of the file to upload."
            - name: file_content
              in: body
              type: string
              description: "Base64-encoded file content."
            - name: manager_email
              in: body
              type: string
              description: "Email of the engagement manager."
          steps:
            - name: upload-file
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "{{site_id}}"
                folder_path: "{{folder_path}}"
                file_name: "{{file_name}}"
                content: "{{file_content}}"
            - name: send-notification
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{manager_email}}"
                subject: "Workpaper uploaded: {{file_name}}"
                body: "A new workpaper has been uploaded to {{folder_path}}/{{file_name}}. View at: {{upload-file.webUrl}}"
  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}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves SharePoint metadata at EY.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at EY."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at EY."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "Path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            path: "{{file_path}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: number
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET

Monitors SLAs at EY via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at EY via Datadog and Slack."
  tags:
    - operations
    - sla
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sla-monitor
      port: 8080
      tools:
        - name: check-sla
          description: "Monitor SLAs at EY."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service."
            - name: target
              in: body
              type: number
              description: "SLA target %."
          steps:
            - name: metrics
              type: call
              call: "datadog.get-sla"
              with:
                service: "{{service}}"
            - name: check
              type: call
              call: "analytics.check-sla"
              with:
                uptime: "{{metrics.uptime}}"
                target: "{{target}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#ops"
                text: "SLA: {{service}} at {{metrics.uptime}}% (target: {{target}}%)"
            - name: log
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "SLA breach: {{service}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/metrics"
          operations:
            - name: get-sla
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Executes a SQL query against Snowflake to retrieve client analytics data and uploads the results as a Google Sheet for sharing with the engagement team.

naftiko: "0.5"
info:
  label: "Snowflake Client Data Query"
  description: "Executes a SQL query against Snowflake to retrieve client analytics data and uploads the results as a Google Sheet for sharing with the engagement team."
  tags:
    - analytics
    - data
    - snowflake
    - google-sheets
    - consulting
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: query-snowflake
          description: "Execute a SQL statement against Snowflake and export results to Google Sheets."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse name."
            - name: database
              in: body
              type: string
              description: "The Snowflake database name."
            - name: sql_statement
              in: body
              type: string
              description: "The SQL query to execute."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID for results export."
          steps:
            - name: run-query
              type: call
              call: "snowflake.execute-sql"
              with:
                warehouse: "{{warehouse}}"
                database: "{{database}}"
                statement: "{{sql_statement}}"
            - name: export-to-sheets
              type: call
              call: "googlesheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "QueryResults!A1"
                values: "{{run-query.data}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://ey-partner.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-sql
              method: POST
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT

Searches Splunk at EY.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at EY."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at EY."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "SPL query."
          call: "splunk.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.results.count"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.ey.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Executes a Splunk search query against security event logs and creates a ServiceNow incident if anomalies are detected. Used by EY cybersecurity teams during IT audit engagements.

naftiko: "0.5"
info:
  label: "Splunk Security Log Query"
  description: "Executes a Splunk search query against security event logs and creates a ServiceNow incident if anomalies are detected. Used by EY cybersecurity teams during IT audit engagements."
  tags:
    - audit
    - security
    - splunk
    - log-analysis
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: security-logs
      port: 8080
      tools:
        - name: search-splunk-logs
          description: "Execute a Splunk search and create a ServiceNow incident with findings."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The Splunk SPL search query."
            - name: earliest_time
              in: body
              type: string
              description: "Earliest time for the search (e.g., -24h)."
            - name: latest_time
              in: body
              type: string
              description: "Latest time for the search (e.g., now)."
          steps:
            - name: run-search
              type: call
              call: "splunk.create-search"
              with:
                search: "{{search_query}}"
                earliest_time: "{{earliest_time}}"
                latest_time: "{{latest_time}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Splunk security log findings - Search {{run-search.search_id}}"
                category: "security_review"
                description: "Splunk search completed. Search ID: {{run-search.search_id}}. Query: {{search_query}}. Time range: {{earliest_time}} to {{latest_time}}."
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://ey-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://ey.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

Exports a Tableau workbook view as a PDF and stores it in Google Drive. Used by EY consulting teams to share client-facing analytics deliverables.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Export"
  description: "Exports a Tableau workbook view as a PDF and stores it in Google Drive. Used by EY consulting teams to share client-facing analytics deliverables."
  tags:
    - consulting
    - analytics
    - tableau
    - google-drive
capability:
  exposes:
    - type: mcp
      namespace: analytics-export
      port: 8080
      tools:
        - name: export-tableau-to-drive
          description: "Export a Tableau view as PDF and upload it to a Google Drive folder."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The Tableau site ID."
            - name: view_id
              in: body
              type: string
              description: "The Tableau view ID to export."
            - name: drive_folder_id
              in: body
              type: string
              description: "The Google Drive folder ID for upload."
          steps:
            - name: export-pdf
              type: call
              call: "tableau.export-view-pdf"
              with:
                site_id: "{{site_id}}"
                view_id: "{{view_id}}"
            - name: upload-to-drive
              type: call
              call: "googledrive.upload-file"
              with:
                folder_id: "{{drive_folder_id}}"
                file_name: "tableau_export_{{view_id}}.pdf"
                content: "{{export-pdf.content}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://ey-tableau.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: views
          path: "/sites/{{site_id}}/views/{{view_id}}/pdf"
          inputParameters:
            - name: site_id
              in: path
            - name: view_id
              in: path
          operations:
            - name: export-view-pdf
              method: GET
    - type: http
      namespace: googledrive
      baseUri: "https://www.googleapis.com/upload/drive/v3"
      authentication:
        type: bearer
        token: "$secrets.google_drive_token"
      resources:
        - name: files
          path: "/files?uploadType=multipart"
          operations:
            - name: upload-file
              method: POST

Queries Oracle Financials for a client's tax return filing status and posts an update to the engagement Slack channel. Enables tax professionals to monitor deadlines without logging into Oracle.

naftiko: "0.5"
info:
  label: "Tax Filing Status Tracker"
  description: "Queries Oracle Financials for a client's tax return filing status and posts an update to the engagement Slack channel. Enables tax professionals to monitor deadlines without logging into Oracle."
  tags:
    - tax
    - oracle
    - oracle-financials
    - slack
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: tax-filing
      port: 8080
      tools:
        - name: check-tax-filing-status
          description: "Given a client entity ID and tax period, retrieve filing status from Oracle Financials and post an update to the engagement Slack channel."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "The Oracle Financials entity identifier."
            - name: tax_period
              in: body
              type: string
              description: "The tax period in YYYY-MM format."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the engagement team."
          steps:
            - name: get-filing-status
              type: call
              call: "oracle.get-tax-filing"
              with:
                entity_id: "{{entity_id}}"
                tax_period: "{{tax_period}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Tax filing for entity {{entity_id}} (period {{tax_period}}): Status is {{get-filing-status.status}}. Due date: {{get-filing-status.due_date}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://ey-oracle.fa.us2.oraclecloud.com/fscmRestApi/resources"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: tax-filings
          path: "/taxReturns?q=EntityId={{entity_id}};TaxPeriod={{tax_period}}"
          inputParameters:
            - name: entity_id
              in: query
            - name: tax_period
              in: query
          operations:
            - name: get-tax-filing
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves Teams activity at EY.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at EY."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at EY."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
          call: "teams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Checks Terraform workspace at EY.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at EY."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at EY."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Workspace ID."
          call: "terraform.get-ws"
          with:
            workspace_id: "{{workspace_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.attributes.name"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-ws
              method: GET

Retrieves transfer pricing data from SAP S/4HANA, generates a summary in Microsoft Excel via Graph API, and stores the workbook in SharePoint for the tax team to review.

naftiko: "0.5"
info:
  label: "Transfer Pricing Document Workflow"
  description: "Retrieves transfer pricing data from SAP S/4HANA, generates a summary in Microsoft Excel via Graph API, and stores the workbook in SharePoint for the tax team to review."
  tags:
    - tax
    - transfer-pricing
    - sap-s4hana
    - microsoft-excel
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: transfer-pricing
      port: 8080
      tools:
        - name: generate-tp-workbook
          description: "Extract transfer pricing data from SAP, create an Excel workbook, and store in SharePoint."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year."
            - name: sharepoint_site
              in: body
              type: string
              description: "The SharePoint site ID for the tax engagement."
          steps:
            - name: get-tp-data
              type: call
              call: "sap.get-intercompany-transactions"
              with:
                company_code: "{{company_code}}"
                fiscal_year: "{{fiscal_year}}"
            - name: create-workbook
              type: call
              call: "msgraph.create-excel-workbook"
              with:
                site_id: "{{sharepoint_site}}"
                file_name: "TP_Analysis_{{company_code}}_{{fiscal_year}}.xlsx"
            - name: populate-data
              type: call
              call: "msgraph.update-excel-range"
              with:
                item_id: "{{create-workbook.id}}"
                sheet_name: "IntercoTransactions"
                range: "A1"
                values: "{{get-tp-data.transactions}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://ey-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      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: journal-entries
          path: "/A_JournalEntryItemBasic?$filter=CompanyCode eq '{{company_code}}' and FiscalYear eq '{{fiscal_year}}' and IsIntercompanyTransaction eq true"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_year
              in: query
          operations:
            - name: get-intercompany-transactions
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root:/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_name
              in: path
          operations:
            - name: create-excel-workbook
              method: PUT
        - name: excel-ranges
          path: "/drives/items/{{item_id}}/workbook/worksheets/{{sheet_name}}/range(address='{{range}}')"
          inputParameters:
            - name: item_id
              in: path
            - name: sheet_name
              in: path
            - name: range
              in: path
          operations:
            - name: update-excel-range
              method: PATCH

Checks Vault secret at EY.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at EY."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at EY."
          inputParameters:
            - name: path
              in: body
              type: string
              description: "Secret path."
          call: "vault.get-metadata"
          with:
            path: "{{path}}"
          outputParameters:
            - name: version
              type: number
              mapping: "$.data.current_version"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.ey.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/metadata/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: get-metadata
              method: GET

Processes invoices at EY via OCR, SAP matching, approval, and Oracle recording.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at EY via OCR, SAP matching, approval, and Oracle recording."
  tags:
    - finance
    - accounts-payable
    - sap
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: invoice-proc
      port: 8080
      tools:
        - name: process-invoice
          description: "Process invoices at EY."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Invoice ID."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
          steps:
            - name: extract
              type: call
              call: "ocr.extract"
              with:
                doc: "{{invoice_id}}"
            - name: match
              type: call
              call: "sap.match-po"
              with:
                vendor: "{{vendor_id}}"
                amount: "{{extract.total}}"
            - name: approve
              type: call
              call: "workflow.submit"
              with:
                invoice: "{{invoice_id}}"
            - name: record
              type: call
              call: "oracle.create-payment"
              with:
                invoice: "{{invoice_id}}"
  consumes:
    - type: http
      namespace: ocr
      baseUri: "https://ocr.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ocr_token"
      resources:
        - name: invoices
          path: "/extract"
          operations:
            - name: extract
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: pos
          path: "/match"
          operations:
            - name: match-po
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: approvals
          path: "/submit"
          operations:
            - name: submit
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Reviews vendors at EY.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at EY."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at EY."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter."
          steps:
            - name: perf
              type: call
              call: "procurement.get-metrics"
              with:
                vendor: "{{vendor_id}}"
                q: "{{quarter}}"
            - name: scorecard
              type: call
              call: "analytics.scorecard"
              with:
                data: "{{perf.data}}"
            - name: invite
              type: call
              call: "email.send"
              with:
                to: "{{perf.contact}}"
                subject: "QBR - {{quarter}}"
            - name: schedule
              type: call
              call: "calendar.create-event"
              with:
                title: "QBR - {{perf.name}}"
  consumes:
    - type: http
      namespace: procurement
      baseUri: "https://procurement.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor}}/metrics"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: scorecards
          path: "/compute"
          operations:
            - name: scorecard
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/proc/events"
          operations:
            - name: create-event
              method: POST

Retrieves employee compensation data from Workday, compares against market benchmarks in a Snowflake analytics warehouse, and generates a summary report posted to the HR Confluence space.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Pipeline"
  description: "Retrieves employee compensation data from Workday, compares against market benchmarks in a Snowflake analytics warehouse, and generates a summary report posted to the HR Confluence space."
  tags:
    - hr
    - compensation
    - workday
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: compensation-review
      port: 8080
      tools:
        - name: run-compensation-review
          description: "Compare employee compensation against market benchmarks and publish a summary to Confluence."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: job_profile
              in: body
              type: string
              description: "The job profile code for benchmark comparison."
            - name: confluence_space
              in: body
              type: string
              description: "The Confluence space key for the HR team."
          steps:
            - name: get-compensation
              type: call
              call: "workday.get-compensation"
              with:
                worker_id: "{{worker_id}}"
            - name: get-benchmark
              type: call
              call: "snowflake.execute-sql"
              with:
                warehouse: "EY_HR_WH"
                database: "COMPENSATION_DB"
                statement: "SELECT median_salary, p75_salary FROM market_benchmarks WHERE job_profile = '{{job_profile}}'"
            - name: publish-review
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space}}"
                title: "Compensation Review - {{get-compensation.employee_name}}"
                body: "Current base: {{get-compensation.base_salary}}. Market median: {{get-benchmark.data[0][0]}}. Market P75: {{get-benchmark.data[0][1]}}."
  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
    - type: http
      namespace: snowflake
      baseUri: "https://ey-partner.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-sql
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://ey-collab.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves employee profile details from Workday by worker ID and logs the lookup in ServiceNow for audit trail compliance. Used by engagement teams to look up staff availability, skills, and current assignments.

naftiko: "0.5"
info:
  label: "Workday Employee Directory Lookup"
  description: "Retrieves employee profile details from Workday by worker ID and logs the lookup in ServiceNow for audit trail compliance. Used by engagement teams to look up staff availability, skills, and current assignments."
  tags:
    - hr
    - workday
    - employee-directory
    - staffing
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a Workday employee profile by worker ID and log the access in ServiceNow."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: requestor_email
              in: body
              type: string
              description: "Email of the person requesting the lookup."
          steps:
            - name: fetch-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: log-access
              type: call
              call: "servicenow.create-record"
              with:
                table: "x_ey_access_log"
                worker_id: "{{worker_id}}"
                requestor: "{{requestor_email}}"
                accessed_name: "{{fetch-worker.full_name}}"
  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: servicenow
      baseUri: "https://ey.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves employee profile from Workday for EY.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for EY."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up EY employee in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "workday.get-worker"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.worker.name"
            - name: title
              type: string
              mapping: "$.worker.title"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5.ey.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET

Submits time entries for EY professionals against engagement codes in Workday and sends a confirmation message via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Time Entry Submission"
  description: "Submits time entries for EY professionals against engagement codes in Workday and sends a confirmation message via Microsoft Teams."
  tags:
    - hr
    - time-tracking
    - workday
    - engagement
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: time-entry
      port: 8080
      tools:
        - name: submit-time-entry
          description: "Submit a time entry in Workday and send a Teams confirmation."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: engagement_code
              in: body
              type: string
              description: "The engagement billing code."
            - name: hours
              in: body
              type: string
              description: "Number of hours to log."
            - name: work_date
              in: body
              type: string
              description: "The date worked in YYYY-MM-DD format."
            - name: worker_email
              in: body
              type: string
              description: "The employee email for Teams confirmation."
          steps:
            - name: log-time
              type: call
              call: "workday.submit-time"
              with:
                worker_id: "{{worker_id}}"
                engagement_code: "{{engagement_code}}"
                hours: "{{hours}}"
                work_date: "{{work_date}}"
            - name: confirm-entry
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{worker_email}}"
                text: "Time entry confirmed: {{hours}} hours logged to {{engagement_code}} for {{work_date}}. Entry ID: {{log-time.time_entry_id}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-entries
          path: "/workers/{{worker_id}}/timeEntries"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: submit-time
              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 Zoom webinar attendance report and exports the participant list to Google Sheets for CPE credit tracking by EY learning and development teams.

naftiko: "0.5"
info:
  label: "Zoom Webinar Attendance Report"
  description: "Retrieves a Zoom webinar attendance report and exports the participant list to Google Sheets for CPE credit tracking by EY learning and development teams."
  tags:
    - learning
    - zoom
    - reporting
    - cpe
    - google-sheets
capability:
  exposes:
    - type: mcp
      namespace: webinar-attendance
      port: 8080
      tools:
        - name: get-webinar-attendance
          description: "Retrieve Zoom webinar attendance and export participants to Google Sheets."
          inputParameters:
            - name: webinar_id
              in: body
              type: string
              description: "The Zoom webinar ID."
            - name: spreadsheet_id
              in: body
              type: string
              description: "The Google Sheets spreadsheet ID for attendance export."
          steps:
            - name: fetch-attendance
              type: call
              call: "zoom.get-webinar-report"
              with:
                webinar_id: "{{webinar_id}}"
            - name: export-to-sheets
              type: call
              call: "googlesheets.update-values"
              with:
                spreadsheet_id: "{{spreadsheet_id}}"
                range: "Attendance!A1"
                values: "{{fetch-attendance.participants}}"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: webinar-reports
          path: "/report/webinars/{{webinar_id}}/participants"
          inputParameters:
            - name: webinar_id
              in: path
          operations:
            - name: get-webinar-report
              method: GET
    - type: http
      namespace: googlesheets
      baseUri: "https://sheets.googleapis.com/v4"
      authentication:
        type: bearer
        token: "$secrets.google_sheets_token"
      resources:
        - name: values
          path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
          inputParameters:
            - name: spreadsheet_id
              in: path
            - name: range
              in: path
          operations:
            - name: update-values
              method: PUT