PwC Capabilities

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

Sort
Expand

Given an audit working paper or client document in SharePoint, uses Anthropic Claude to extract key findings, risks, and control observations, posting a summary to the audit team's Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Audit Document Review"
  description: "Given an audit working paper or client document in SharePoint, uses Anthropic Claude to extract key findings, risks, and control observations, posting a summary to the audit team's Teams channel."
  tags:
    - ai
    - audit
    - anthropic
    - sharepoint
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: audit-ai
      port: 8080
      tools:
        - name: review-audit-document
          description: "Given a SharePoint document ID and audit engagement code, retrieve the document and use Anthropic Claude to extract key findings, control deficiencies, and risk observations for the audit team."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The SharePoint document item ID for the audit working paper."
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID containing the audit document."
            - name: engagement_code
              in: body
              type: string
              description: "The PwC engagement code for the audit (e.g., 'ENG-2026-00123')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the audit team review."
          steps:
            - name: get-document
              type: call
              call: sharepoint.get-file-content
              with:
                site_id: "{{site_id}}"
                document_id: "{{document_id}}"
            - name: generate-review
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "You are a PwC audit manager reviewing working papers for engagement {{engagement_code}}. Extract: 1) Key findings, 2) Control deficiencies identified, 3) Risks noted, 4) Recommended action items. Document: {{get-document.content}}"
            - name: post-review
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Audit Document Review — {{get-document.name}} ({{engagement_code}}):\n{{generate-review.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/items/{{document_id}}/content"
          inputParameters:
            - name: site_id
              in: path
            - name: document_id
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Uses Anthropic Claude to review contract terms, identifies risk clauses, and posts summary to the legal team.

naftiko: "0.5"
info:
  label: "AI-Assisted Contract Review"
  description: "Uses Anthropic Claude to review contract terms, identifies risk clauses, and posts summary to the legal team."
  tags:
    - legal
    - anthropic
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: ai_assisted_contract_review
          description: "Uses Anthropic Claude to review contract terms, identifies risk clauses, and posts summary to the legal team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "AI-Assisted Contract Review: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "AI-Assisted Contract Review for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Given an engagement proposal document in SharePoint, uses Anthropic Claude to identify delivery risks, independence conflicts, and compliance considerations, then posts the assessment to the risk management Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Engagement Risk Assessment"
  description: "Given an engagement proposal document in SharePoint, uses Anthropic Claude to identify delivery risks, independence conflicts, and compliance considerations, then posts the assessment to the risk management Teams channel."
  tags:
    - ai
    - risk-management
    - anthropic
    - sharepoint
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: risk-ai
      port: 8080
      tools:
        - name: assess-engagement-risk
          description: "Given a SharePoint proposal document and client name, use Anthropic Claude to identify delivery risks, independence conflicts, and regulatory compliance considerations."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "The SharePoint document ID for the engagement proposal."
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID containing the proposal."
            - name: client_name
              in: body
              type: string
              description: "The prospective client's name for independence analysis."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the risk management team."
          steps:
            - name: get-proposal
              type: call
              call: sharepoint.get-file-content
              with:
                site_id: "{{site_id}}"
                document_id: "{{document_id}}"
            - name: assess-risks
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "You are a PwC engagement risk manager. Review this proposal for client {{client_name}} and identify: 1) Delivery risks (complexity, resourcing, timeline), 2) Potential independence or conflict-of-interest issues, 3) Regulatory or ethical compliance considerations, 4) Risk mitigation recommendations. Proposal: {{get-proposal.content}}"
            - name: post-assessment
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Engagement Risk Assessment — {{client_name}} ({{get-proposal.name}}):\n{{assess-risks.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/items/{{document_id}}/content"
          inputParameters:
            - name: site_id
              in: path
            - name: document_id
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Uses Anthropic Claude to review financial statement data from Snowflake and posts findings to the audit team.

naftiko: "0.5"
info:
  label: "AI-Assisted Financial Statement Review"
  description: "Uses Anthropic Claude to review financial statement data from Snowflake and posts findings to the audit team."
  tags:
    - audit
    - anthropic
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: ai_assisted_financial_statement_review
          description: "Uses Anthropic Claude to review financial statement data from Snowflake and posts findings to the audit team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "AI-Assisted Financial Statement Review: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "AI-Assisted Financial Statement Review for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Uses Anthropic Claude to generate research memos from Snowflake data, uploads to SharePoint, and notifies the team.

naftiko: "0.5"
info:
  label: "AI-Assisted Research Memo Generation"
  description: "Uses Anthropic Claude to generate research memos from Snowflake data, uploads to SharePoint, and notifies the team."
  tags:
    - research
    - anthropic
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: ai_assisted_research_memo_generation
          description: "Uses Anthropic Claude to generate research memos from Snowflake data, uploads to SharePoint, and notifies the team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "AI-Assisted Research Memo Generation: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "AI-Assisted Research Memo Generation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Uses Anthropic Claude to analyze engagement risk factors from Snowflake and generates risk scores for the quality team.

naftiko: "0.5"
info:
  label: "AI-Assisted Risk Assessment Scoring"
  description: "Uses Anthropic Claude to analyze engagement risk factors from Snowflake and generates risk scores for the quality team."
  tags:
    - risk
    - anthropic
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: ai_assisted_risk_assessment_scoring
          description: "Uses Anthropic Claude to analyze engagement risk factors from Snowflake and generates risk scores for the quality team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "AI-Assisted Risk Assessment Scoring: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "AI-Assisted Risk Assessment Scoring for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Given a tax research query and jurisdiction, uses Anthropic Claude to generate a structured tax position summary, posting the result to the tax team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Tax Research Summary"
  description: "Given a tax research query and jurisdiction, uses Anthropic Claude to generate a structured tax position summary, posting the result to the tax team's Microsoft Teams channel."
  tags:
    - ai
    - tax
    - anthropic
    - microsoft-teams
    - research
capability:
  exposes:
    - type: mcp
      namespace: tax-ai
      port: 8080
      tools:
        - name: summarize-tax-research
          description: "Given a tax research question and jurisdiction, invoke Anthropic Claude to generate a structured tax position analysis with relevant authority citations and risk assessment."
          inputParameters:
            - name: research_query
              in: body
              type: string
              description: "The tax research question to analyze (e.g., 'Transfer pricing treatment for intercompany IP licensing')."
            - name: jurisdiction
              in: body
              type: string
              description: "The tax jurisdiction for the analysis (e.g., 'United States', 'United Kingdom', 'Germany')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the tax team research digest."
          steps:
            - name: generate-analysis
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "You are a senior PwC tax advisor. Analyze the following tax research question for {{jurisdiction}}: {{research_query}}. Provide: 1) Tax position analysis, 2) Relevant statutory or regulatory authority, 3) Key risks and uncertainties, 4) Recommended next steps. Note: This is preliminary research only."
            - name: post-analysis
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Tax Research Analysis — {{jurisdiction}}:\nQuery: {{research_query}}\n\n{{generate-analysis.content}}\n\nNote: AI-assisted research — human review required before client delivery."
  consumes:
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Lists objects in an S3 bucket with a given prefix for data governance reviews.

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

When Datadog detects API gateway degradation, creates ServiceNow incident and notifies the platform team.

naftiko: "0.5"
info:
  label: "API Gateway Performance Alert"
  description: "When Datadog detects API gateway degradation, creates ServiceNow incident and notifies the platform team."
  tags:
    - devops
    - api
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: api_gateway_performance_alert
          description: "When Datadog detects API gateway degradation, creates ServiceNow incident and notifies the platform team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "API Gateway Performance Alert: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "API Gateway Performance Alert for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

When an audit finding is logged, creates a Jira remediation ticket, assigns to the responsible owner from Workday, creates a ServiceNow change request, and notifies audit leadership via Teams.

naftiko: "0.5"
info:
  label: "Audit Finding Remediation Workflow"
  description: "When an audit finding is logged, creates a Jira remediation ticket, assigns to the responsible owner from Workday, creates a ServiceNow change request, and notifies audit leadership via Teams."
  tags:
    - audit
    - compliance
    - jira
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: audit-remediation
      port: 8080
      tools:
        - name: process-audit-finding
          description: "Given audit finding details, create remediation tracking across systems and notify leadership."
          inputParameters:
            - name: finding_id
              in: body
              type: string
              description: "Audit finding identifier."
            - name: severity
              in: body
              type: string
              description: "Finding severity (Critical, High, Medium, Low)."
            - name: responsible_employee_id
              in: body
              type: string
              description: "Workday ID of responsible person."
            - name: description
              in: body
              type: string
              description: "Finding description."
          steps:
            - name: get-owner
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{responsible_employee_id}}"
            - name: create-remediation-ticket
              type: call
              call: jira.create-issue
              with:
                project: AUDIT
                issuetype: Task
                summary: "Remediate finding {{finding_id}} [{{severity}}]"
                description: "{{description}}"
                assignee: "{{get-owner.work_email}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change
              with:
                short_description: "Audit remediation: {{finding_id}}"
                category: audit
                assigned_to: "{{get-owner.work_email}}"
            - name: notify-leadership
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.audit_team_id"
                channel_id: "$secrets.audit_findings_channel_id"
                text: "Audit finding {{finding_id}} [{{severity}}] assigned to {{get-owner.full_name}}. Jira: {{create-remediation-ticket.key}}, Change: {{create-change-request.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Azure Cost Management detects a spend anomaly on a PwC subscription, creates a ServiceNow financial incident and posts a FinOps alert to the Microsoft Teams cost management channel.

naftiko: "0.5"
info:
  label: "Azure Cloud Cost Anomaly Responder"
  description: "When Azure Cost Management detects a spend anomaly on a PwC subscription, creates a ServiceNow financial incident and posts a FinOps alert to the Microsoft Teams cost management channel."
  tags:
    - finops
    - cloud
    - azure
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: handle-azure-cost-anomaly
          description: "Given an Azure subscription, resource group, and estimated overage in USD, create a ServiceNow financial incident and post a FinOps alert to the Teams cost management channel."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID where the cost anomaly was detected."
            - name: resource_group
              in: body
              type: string
              description: "The resource group generating the cost anomaly."
            - name: estimated_overage_usd
              in: body
              type: number
              description: "Estimated spend overage in US dollars."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure Cost Anomaly — {{resource_group}} — ${{estimated_overage_usd}}"
                category: "cloud_cost"
                urgency: "2"
            - name: post-finops-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "finops-alerts"
                text: "Azure Cost Anomaly: {{resource_group}} ({{subscription_id}}) | Overage: ${{estimated_overage_usd}} | SNOW: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

Queries Azure security center for posture score, creates Jira remediation tasks, and notifies the cloud security team.

naftiko: "0.5"
info:
  label: "Azure Security Posture Assessment"
  description: "Queries Azure security center for posture score, creates Jira remediation tasks, and notifies the cloud security team."
  tags:
    - security
    - azure
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: azure_security_posture_assessment
          description: "Queries Azure security center for posture score, creates Jira remediation tasks, and notifies the cloud security team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Azure Security Posture Assessment: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Azure Security Posture Assessment for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Reconciles client billing between Salesforce time entries and Oracle financials, posting exceptions to the finance team.

naftiko: "0.5"
info:
  label: "Client Billing Reconciliation Workflow"
  description: "Reconciles client billing between Salesforce time entries and Oracle financials, posting exceptions to the finance team."
  tags:
    - finance
    - billing
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: client_billing_reconciliation_workflow
          description: "Reconciles client billing between Salesforce time entries and Oracle financials, posting exceptions to the finance team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Client Billing Reconciliation Workflow: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Client Billing Reconciliation Workflow for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Provisions a secure SharePoint data room for client engagements, sets Okta access controls, and notifies the engagement team.

naftiko: "0.5"
info:
  label: "Client Data Room Provisioning"
  description: "Provisions a secure SharePoint data room for client engagements, sets Okta access controls, and notifies the engagement team."
  tags:
    - engagement
    - sharepoint
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: client_data_room_provisioning
          description: "Provisions a secure SharePoint data room for client engagements, sets Okta access controls, and notifies the engagement team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Client Data Room Provisioning: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Client Data Room Provisioning for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Validates client independence requirements against Salesforce relationships, checks Snowflake records, and notifies ethics team.

naftiko: "0.5"
info:
  label: "Client Independence Check Workflow"
  description: "Validates client independence requirements against Salesforce relationships, checks Snowflake records, and notifies ethics team."
  tags:
    - compliance
    - independence
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: client_independence_check_workflow
          description: "Validates client independence requirements against Salesforce relationships, checks Snowflake records, and notifies ethics team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Client Independence Check Workflow: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Client Independence Check Workflow for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

Pulls client data from Salesforce, retrieves relevant case studies from Confluence, checks team availability in Workday, and creates a proposal tracking task in Jira.

naftiko: "0.5"
info:
  label: "Client Proposal Generation Workflow"
  description: "Pulls client data from Salesforce, retrieves relevant case studies from Confluence, checks team availability in Workday, and creates a proposal tracking task in Jira."
  tags:
    - sales
    - proposals
    - salesforce
    - confluence
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: sales-proposals
      port: 8080
      tools:
        - name: prepare-proposal
          description: "Given a Salesforce opportunity, gather supporting data and set up proposal tracking."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{opportunity_id}}"
            - name: find-case-studies
              type: call
              call: confluence.search-page
              with:
                title: "case study {{get-opportunity.Industry__c}}"
            - name: check-availability
              type: call
              call: workday.get-practice-headcount
              with:
                practice: "{{get-opportunity.Practice__c}}"
            - name: create-proposal-task
              type: call
              call: jira.create-issue
              with:
                project: PROPOSALS
                issuetype: Task
                summary: "Proposal: {{get-opportunity.Name}} - {{get-opportunity.Account.Name}}"
                description: "Value: {{get-opportunity.Amount}}, Industry: {{get-opportunity.Industry__c}}, Case studies found: {{find-case-studies.results.length}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://pwc.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content?title={{title}}&expand=space"
          inputParameters:
            - name: title
              in: query
          operations:
            - name: search-page
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/workers?practice={{practice}}"
          inputParameters:
            - name: practice
              in: query
          operations:
            - name: get-practice-headcount
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://pwc.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

Analyzes Azure cloud costs, identifies optimization opportunities in Snowflake, creates Jira action items, and posts savings recommendations to the FinOps Teams channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Orchestration"
  description: "Analyzes Azure cloud costs, identifies optimization opportunities in Snowflake, creates Jira action items, and posts savings recommendations to the FinOps Teams channel."
  tags:
    - cloud
    - finops
    - microsoft-azure
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: cloud-optimization
      port: 8080
      tools:
        - name: optimize-cloud-costs
          description: "Analyze cloud costs and create optimization action items."
          inputParameters:
            - name: billing_month
              in: body
              type: string
              description: "Billing month to analyze."
          steps:
            - name: get-costs
              type: call
              call: azure.get-cost
              with:
                subscription: "$secrets.azure_subscription_id"
                rg: "all"
            - name: analyze-savings
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM finops.cost_optimization_recommendations WHERE billing_month = '{{billing_month}}'"
                warehouse: "FINOPS_WH"
            - name: create-actions
              type: call
              call: jira.create-issue
              with:
                project: FINOPS
                issuetype: Task
                summary: "Cloud cost optimization actions for {{billing_month}}"
            - name: post-recommendations
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.finops_team_id"
                channel_id: "$secrets.finops_channel_id"
                text: "Cloud cost analysis for {{billing_month}}: Total={{get-costs.total_cost}}, Optimization opportunities={{analyze-savings.row_count}}. Jira: {{create-actions.key}}"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription}}/providers/Microsoft.CostManagement/query?api-version=2023-03-01"
          inputParameters:
            - name: subscription
              in: path
          operations:
            - name: get-cost
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Workday for overdue compliance training, creates ServiceNow ticket, and notifies managers.

naftiko: "0.5"
info:
  label: "Compliance Training Overdue Alert"
  description: "Queries Workday for overdue compliance training, creates ServiceNow ticket, and notifies managers."
  tags:
    - hr
    - compliance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: compliance_training_overdue_alert
          description: "Queries Workday for overdue compliance training, creates ServiceNow ticket, and notifies managers."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Compliance Training Overdue Alert: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Compliance Training Overdue Alert for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Audits Confluence pages for outdated content, creates Jira update tasks, and notifies content owners.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Audit"
  description: "Audits Confluence pages for outdated content, creates Jira update tasks, and notifies content owners."
  tags:
    - collaboration
    - confluence
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: confluence_knowledge_base_audit
          description: "Audits Confluence pages for outdated content, creates Jira update tasks, and notifies content owners."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Confluence Knowledge Base Audit: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Confluence Knowledge Base Audit for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

Monitors upcoming contract renewals in Salesforce, creates Jira tracking tickets, and notifies account managers via Teams.

naftiko: "0.5"
info:
  label: "Contract Renewal Tracking Orchestration"
  description: "Monitors upcoming contract renewals in Salesforce, creates Jira tracking tickets, and notifies account managers via Teams."
  tags:
    - sales
    - contract-management
    - salesforce
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: contract-renewals
      port: 8080
      tools:
        - name: process-upcoming-renewals
          description: "Find contracts expiring soon and create tracking tickets."
          inputParameters:
            - name: days_ahead
              in: body
              type: integer
              description: "Days ahead to look for renewals."
          steps:
            - name: get-expiring
              type: call
              call: salesforce.query-contracts
              with:
                days: "{{days_ahead}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: RENEWALS
                issuetype: Task
                summary: "{{get-expiring.totalSize}} contracts expiring within {{days_ahead}} days"
            - name: notify
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.sales_team_id"
                channel_id: "$secrets.renewals_channel_id"
                text: "{{get-expiring.totalSize}} contracts expiring within {{days_ahead}} days. Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contracts
          path: "/query?q=SELECT+Id,Name,EndDate+FROM+Contract+WHERE+EndDate=NEXT_N_DAYS:{{days}}"
          inputParameters:
            - name: days
              in: query
          operations:
            - name: query-contracts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a DLP alert fires, queries Splunk for context, creates ServiceNow security incident, and notifies the security team.

naftiko: "0.5"
info:
  label: "Data Loss Prevention Alert Response"
  description: "When a DLP alert fires, queries Splunk for context, creates ServiceNow security incident, and notifies the security team."
  tags:
    - security
    - dlp
    - splunk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: data_loss_prevention_alert_response
          description: "When a DLP alert fires, queries Splunk for context, creates ServiceNow security incident, and notifies the security team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Data Loss Prevention Alert Response: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Data Loss Prevention Alert Response for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Data Pipeline Failure Recovery"
  description: "When a Snowflake pipeline task fails, retrieves error details, creates a Jira bug ticket, notifies the data team in Teams, and triggers a retry."
  tags:
    - data-engineering
    - incident-response
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-recovery
      port: 8080
      tools:
        - name: recover-failed-pipeline
          description: "Given a failed pipeline task ID, capture errors, create ticket, notify team, and retry."
          inputParameters:
            - name: task_id
              in: body
              type: string
              description: "Snowflake task ID that failed."
          steps:
            - name: get-task-history
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM table(information_schema.task_history(task_name=>'{{task_id}}')) ORDER BY scheduled_time DESC LIMIT 1"
                warehouse: "DATA_ENG_WH"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issuetype: Bug
                summary: "Pipeline failure: {{task_id}}"
                description: "Error: {{get-task-history.data[0]}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.data_eng_team_id"
                channel_id: "$secrets.data_alerts_channel_id"
                text: "Pipeline {{task_id}} failed. Jira: {{create-bug.key}}. Investigating..."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a Databricks job fails, creates a Jira ticket and notifies the data platform team.

naftiko: "0.5"
info:
  label: "Databricks Job Failure Alert"
  description: "When a Databricks job fails, creates a Jira ticket and notifies the data platform team."
  tags:
    - data-engineering
    - databricks
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: databricks_job_failure_alert
          description: "When a Databricks job fails, creates a Jira ticket and notifies the data platform team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Databricks Job Failure Alert: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Databricks Job Failure Alert for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

Fetches the current Datadog monitor status for PwC's internal platforms and posts a health digest to the IT operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Platform Monitoring Digest"
  description: "Fetches the current Datadog monitor status for PwC's internal platforms and posts a health digest to the IT operations Microsoft Teams channel."
  tags:
    - observability
    - datadog
    - reporting
    - microsoft-teams
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: platform-reporting
      port: 8080
      tools:
        - name: digest-platform-health
          description: "Given a Datadog environment tag, list all monitors and post a health digest with OK, Warning, and Critical counts to the IT operations Teams channel."
          inputParameters:
            - name: environment_tag
              in: body
              type: string
              description: "The Datadog environment tag to filter monitors (e.g., 'env:production')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the IT operations digest."
          steps:
            - name: list-monitors
              type: call
              call: datadog.list-monitors
              with:
                tags: "{{environment_tag}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Platform Health ({{environment_tag}}): Total: {{list-monitors.total}} | OK: {{list-monitors.ok_count}} | Warning: {{list-monitors.warning_count}} | Critical: {{list-monitors.critical_count}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: list-monitors
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

When Dynatrace detects performance degradation, fetches details, creates a ServiceNow incident, and alerts SRE via Teams.

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

When an employee departs, revokes Okta access, closes Workday record, and notifies IT and HR.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee departs, revokes Okta access, closes Workday record, and notifies IT and HR."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: employee_offboarding_workflow
          description: "When an employee departs, revokes Okta access, closes Workday record, and notifies IT and HR."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Employee Offboarding Workflow: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Employee Offboarding Workflow for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

When an employee transfers practices in Workday, updates Okta groups, reassigns Jira issues, and notifies both old and new managers via Teams.

naftiko: "0.5"
info:
  label: "Employee Role Transfer Orchestration"
  description: "When an employee transfers practices in Workday, updates Okta groups, reassigns Jira issues, and notifies both old and new managers via Teams."
  tags:
    - hr
    - access-management
    - workday
    - okta
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-transfers
      port: 8080
      tools:
        - name: process-role-transfer
          description: "Given a Workday employee ID and new practice, update access and notify managers."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
            - name: new_practice
              in: body
              type: string
              description: "New practice name."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: update-okta
              type: call
              call: okta.update-user-groups
              with:
                user_id: "{{get-employee.work_email}}"
                new_group: "{{new_practice}}"
            - name: reassign-work
              type: call
              call: jira.bulk-reassign
              with:
                current_assignee: "{{get-employee.work_email}}"
            - name: notify-managers
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.hr_team_id"
                channel_id: "$secrets.hr_transfers_channel_id"
                text: "{{get-employee.full_name}} transferring from {{get-employee.department}} to {{new_practice}}. Access updated."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://pwc.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: user-groups
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user-groups
              method: PUT
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: bulk-operations
          path: "/bulk/issues/reassign"
          operations:
            - name: bulk-reassign
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Closes out an engagement by updating Salesforce stage, archiving Jira project, and notifying stakeholders via Teams.

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

Pulls engagement metrics from Salesforce, workpaper status from SharePoint, team utilization from Workday, and compiles a quality review summary posted to Teams.

naftiko: "0.5"
info:
  label: "Engagement Quality Review Workflow"
  description: "Pulls engagement metrics from Salesforce, workpaper status from SharePoint, team utilization from Workday, and compiles a quality review summary posted to Teams."
  tags:
    - quality
    - audit
    - salesforce
    - sharepoint
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-review
      port: 8080
      tools:
        - name: run-quality-review
          description: "Given an engagement ID, compile quality metrics from all systems and post review summary."
          inputParameters:
            - name: engagement_id
              in: body
              type: string
              description: "Salesforce engagement opportunity ID."
          steps:
            - name: get-engagement
              type: call
              call: salesforce.get-opportunity
              with:
                opp_id: "{{engagement_id}}"
            - name: check-workpapers
              type: call
              call: sharepoint.search
              with:
                query: "{{get-engagement.Name}} workpaper"
            - name: get-team-utilization
              type: call
              call: workday.get-project-hours
              with:
                project_id: "{{get-engagement.Project_Code__c}}"
            - name: post-review
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.quality_team_id"
                channel_id: "$secrets.quality_review_channel_id"
                text: "EQR for {{get-engagement.Name}}: Workpapers found={{check-workpapers.count}}, Team hours={{get-team-utilization.total_hours}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/search/query"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: project-hours
          path: "/projects/{{project_id}}/hours"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-hours
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Workday for available staff, matches skills in Snowflake, and posts staffing recommendations to engagement leads.

naftiko: "0.5"
info:
  label: "Engagement Staffing Optimization"
  description: "Queries Workday for available staff, matches skills in Snowflake, and posts staffing recommendations to engagement leads."
  tags:
    - engagement
    - workday
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: engagement_staffing_optimization
          description: "Queries Workday for available staff, matches skills in Snowflake, and posts staffing recommendations to engagement leads."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Engagement Staffing Optimization: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Engagement Staffing Optimization for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

When a GitHub Dependabot or code scanning alert is raised in a PwC internal repository, creates a Jira security task and notifies the information security team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Code Repository Security Scan Alert"
  description: "When a GitHub Dependabot or code scanning alert is raised in a PwC internal repository, creates a Jira security task and notifies the information security team in Microsoft Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-devops
      port: 8080
      tools:
        - name: handle-security-alert
          description: "Given a GitHub repository, security alert number, and severity, create a Jira security task and notify the PwC information security team in Teams."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in 'org/repo' format."
            - name: alert_number
              in: body
              type: integer
              description: "The GitHub security alert number."
            - name: severity
              in: body
              type: string
              description: "Alert severity: 'critical', 'high', 'medium', or 'low'."
          steps:
            - name: get-alert
              type: call
              call: github.get-security-alert
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-jira-task
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                issuetype: "Task"
                summary: "[{{severity}}] Security alert — {{repo}} — {{get-alert.rule_id}}"
                description: "Alert {{alert_number}} in {{repo}}. Severity: {{severity}}. Rule: {{get-alert.rule_description}}. URL: {{get-alert.html_url}}"
            - name: notify-infosec
              type: call
              call: msteams.send-message
              with:
                channel_id: "security-alerts"
                text: "Security Alert [{{severity}}]: {{repo}} | Rule: {{get-alert.rule_id}} | Jira: {{create-jira-task.key}} | GitHub: {{get-alert.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-security-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When Dependabot finds a vulnerability, creates Jira ticket and alerts security team.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Vulnerability Triage"
  description: "When Dependabot finds a vulnerability, creates Jira ticket and alerts security team."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: github_dependabot_vulnerability_triage
          description: "When Dependabot finds a vulnerability, creates Jira ticket and alerts security team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "GitHub Dependabot Vulnerability Triage: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "GitHub Dependabot Vulnerability Triage for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Retrieves the latest repository info from GitHub including default branch, open issues count, and last update.

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

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

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

Tracks IT asset lifecycles in ServiceNow CMDB, identifies end-of-life assets, and creates replacement requests.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Management"
  description: "Tracks IT asset lifecycles in ServiceNow CMDB, identifies end-of-life assets, and creates replacement requests."
  tags:
    - itsm
    - asset-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: it_asset_lifecycle_management
          description: "Tracks IT asset lifecycles in ServiceNow CMDB, identifies end-of-life assets, and creates replacement requests."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "IT Asset Lifecycle Management: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "IT Asset Lifecycle Management for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

When a pod crash is detected, gathers Splunk logs, creates ServiceNow incident, and alerts platform team.

naftiko: "0.5"
info:
  label: "Kubernetes Pod Failure Escalation"
  description: "When a pod crash is detected, gathers Splunk logs, creates ServiceNow incident, and alerts platform team."
  tags:
    - devops
    - kubernetes
    - splunk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: kubernetes_pod_failure_escalation
          description: "When a pod crash is detected, gathers Splunk logs, creates ServiceNow incident, and alerts platform team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Kubernetes Pod Failure Escalation: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Kubernetes Pod Failure Escalation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Pulls open positions from Workday, creates LinkedIn postings, and posts summary to talent team.

naftiko: "0.5"
info:
  label: "LinkedIn Talent Acquisition Campaign"
  description: "Pulls open positions from Workday, creates LinkedIn postings, and posts summary to talent team."
  tags:
    - hr
    - talent-acquisition
    - workday
    - linkedin
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: linkedin_talent_acquisition_campaign
          description: "Pulls open positions from Workday, creates LinkedIn postings, and posts summary to talent team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "LinkedIn Talent Acquisition Campaign: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "LinkedIn Talent Acquisition Campaign for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Fetches PwC LinkedIn company page engagement metrics for thought leadership content and posts a monthly digest to the brand and communications Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Thought Leadership Engagement Digest"
  description: "Fetches PwC LinkedIn company page engagement metrics for thought leadership content and posts a monthly digest to the brand and communications Microsoft Teams channel."
  tags:
    - marketing
    - linkedin
    - social
    - reporting
    - microsoft-teams
    - thought-leadership
capability:
  exposes:
    - type: mcp
      namespace: brand-reporting
      port: 8080
      tools:
        - name: digest-thought-leadership-engagement
          description: "Retrieve LinkedIn organization page share statistics for the past 30 days and post a thought leadership performance digest to the communications Teams channel."
          inputParameters:
            - name: organization_id
              in: body
              type: string
              description: "The LinkedIn organization ID for PwC's company page."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for brand and communications team."
          steps:
            - name: get-share-stats
              type: call
              call: linkedin.get-share-statistics
              with:
                organization_id: "{{organization_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "LinkedIn Thought Leadership (30d): Impressions: {{get-share-stats.impressions}} | Reactions: {{get-share-stats.likes}} | Shares: {{get-share-stats.shares}} | Comments: {{get-share-stats.comments}} | Follower Growth: +{{get-share-stats.follower_gain}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: share-statistics
          path: "/organizationalEntityShareStatistics"
          inputParameters:
            - name: organization_id
              in: query
          operations:
            - name: get-share-statistics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Microsoft 365 license usage, identifies unused licenses, and posts optimization report to IT.

naftiko: "0.5"
info:
  label: "Microsoft 365 License Optimization"
  description: "Queries Microsoft 365 license usage, identifies unused licenses, and posts optimization report to IT."
  tags:
    - it
    - microsoft-365
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: microsoft_365_license_optimization
          description: "Queries Microsoft 365 license usage, identifies unused licenses, and posts optimization report to IT."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Microsoft 365 License Optimization: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Microsoft 365 License Optimization for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

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

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

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint workspace, and sends a Microsoft Teams welcome message to the new staff member.

naftiko: "0.5"
info:
  label: "New Staff Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint workspace, and sends a Microsoft Teams welcome message to the new staff member."
  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 PwC onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the new PwC staff member."
            - name: start_date
              in: body
              type: string
              description: "The staff member's start date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-snow-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New staff onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: create-sharepoint-workspace
              type: call
              call: sharepoint.create-folder
              with:
                site_id: "hr-onboarding-site"
                folder_path: "NewStaff/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                channel_id: "hr-new-staff"
                text: "Welcome to PwC, {{get-employee.full_name}}! Your IT onboarding ticket: {{create-snow-ticket.number}}. Start date: {{start_date}}."
  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: "/pwc/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.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"
      authentication:
        type: bearer
        token: "$secrets.sharepoint_token"
      resources:
        - name: folders
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Identifies Okta users who are non-compliant with MFA policy and creates a ServiceNow security task for the information security team to remediate.

naftiko: "0.5"
info:
  label: "Okta MFA Non-Compliance Alert"
  description: "Identifies Okta users who are non-compliant with MFA policy and creates a ServiceNow security task for the information security team to remediate."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - compliance
    - mfa
capability:
  exposes:
    - type: mcp
      namespace: security-compliance
      port: 8080
      tools:
        - name: alert-mfa-non-compliance
          description: "Given an Okta group ID, list users without MFA enrolled and create a ServiceNow security task listing the non-compliant accounts for remediation."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta group ID to audit for MFA compliance."
          steps:
            - name: list-non-mfa-users
              type: call
              call: okta.list-users-without-mfa
              with:
                group_id: "{{okta_group_id}}"
            - name: create-remediation-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "MFA Non-Compliance — {{list-non-mfa-users.count}} users in group {{okta_group_id}}"
                category: "security_compliance"
                description: "Non-compliant users: {{list-non-mfa-users.emails}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://pwc.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_key"
        placement: header
      resources:
        - name: users
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-users-without-mfa
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.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

Runs quarterly access certification for privileged Okta accounts, creates ServiceNow audit records, and notifies security.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Certification"
  description: "Runs quarterly access certification for privileged Okta accounts, creates ServiceNow audit records, and notifies security."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: okta_privileged_access_certification
          description: "Runs quarterly access certification for privileged Okta accounts, creates ServiceNow audit records, and notifies security."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Okta Privileged Access Certification: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Okta Privileged Access Certification for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Lists Okta users in privileged access groups and creates a ServiceNow access review task for the security team to certify quarterly.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Review"
  description: "Lists Okta users in privileged access groups and creates a ServiceNow access review task for the security team to certify quarterly."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - access-review
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-review
      port: 8080
      tools:
        - name: run-access-review
          description: "Given an Okta privileged group ID and review quarter label, list all members and create a ServiceNow access review task for certification."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta privileged access group ID to audit."
            - name: review_quarter
              in: body
              type: string
              description: "The access review quarter label (e.g., 'Q2-2026')."
          steps:
            - name: list-group-members
              type: call
              call: okta.list-group-users
              with:
                group_id: "{{okta_group_id}}"
            - name: create-review-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Access Review {{review_quarter}} — Group {{okta_group_id}}"
                category: "security_access_review"
                description: "{{list-group-members.count}} users require certification. Emails: {{list-group-members.emails}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://pwc.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_key"
        placement: header
      resources:
        - name: group-users
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: list-group-users
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When a new hire's Workday record is confirmed, provisions the appropriate Okta group membership for their service line and practice, notifying IT in Teams.

naftiko: "0.5"
info:
  label: "Okta Staff Access Provisioning"
  description: "When a new hire's Workday record is confirmed, provisions the appropriate Okta group membership for their service line and practice, notifying IT in Teams."
  tags:
    - identity
    - security
    - okta
    - workday
    - microsoft-teams
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: access-provisioning
      port: 8080
      tools:
        - name: provision-staff-access
          description: "Given a Workday worker ID and target Okta group ID for the staff member's service line, add the user to the group and notify IT via Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID for the new staff member."
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta group ID corresponding to the staff member's service line."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: add-to-group
              type: call
              call: okta.add-user-to-group
              with:
                group_id: "{{okta_group_id}}"
                user_email: "{{get-employee.email}}"
            - name: notify-it
              type: call
              call: msteams.send-message
              with:
                channel_id: "it-ops-channel"
                text: "Access provisioned for {{get-employee.full_name}} — Okta group {{okta_group_id}} added. Email: {{get-employee.email}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/pwc/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://pwc.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_key"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_id}}/users/{{user_email}}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_email
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

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

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

When a P1 IT incident is raised at PwC, creates a ServiceNow P1 incident, annotates Datadog, and alerts the IT engineering team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "P1 IT Incident Response Chain"
  description: "When a P1 IT incident is raised at PwC, creates a ServiceNow P1 incident, annotates Datadog, and alerts the IT engineering team in Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-ops
      port: 8080
      tools:
        - name: handle-p1-incident
          description: "Given an affected PwC system and impact description, create a ServiceNow P1 incident, create a Datadog event annotation, and alert the IT engineering team via Teams."
          inputParameters:
            - name: affected_system
              in: body
              type: string
              description: "The PwC system or service experiencing the P1 incident."
            - name: impact_description
              in: body
              type: string
              description: "Brief description of the business impact."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the engineering on-call team."
          steps:
            - name: create-p1-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "P1: {{affected_system}} — {{impact_description}}"
                urgency: "1"
                priority: "1"
                category: "application"
            - name: annotate-datadog
              type: call
              call: datadog.create-event
              with:
                title: "P1 Incident: {{affected_system}}"
                text: "SNOW {{create-p1-incident.number}} — {{impact_description}}"
                alert_type: "error"
            - name: alert-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "P1 INCIDENT: {{affected_system}} | Impact: {{impact_description}} | SNOW: {{create-p1-incident.number}} | Datadog: {{annotate-datadog.url}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

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

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

Triggers a Power BI dataset refresh for the PwC global engagement revenue dashboard and notifies the finance team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Engagement Revenue Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the PwC global engagement revenue dashboard and notifies the finance team in Microsoft Teams."
  tags:
    - data
    - analytics
    - power-bi
    - finance
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: bi-ops
      port: 8080
      tools:
        - name: refresh-revenue-dashboard
          description: "Trigger a Power BI refresh for the PwC global engagement revenue dashboard and post a Teams confirmation to the finance analytics team."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the global engagement revenue dashboard."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the finance analytics notification."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-finance
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Engagement revenue dashboard refresh initiated. Dataset: {{dataset_id}} | Status: {{trigger-refresh.status}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for partner billing and utilization data, refreshes Power BI dashboard, and posts to leadership.

naftiko: "0.5"
info:
  label: "Power BI Partner Performance Dashboard"
  description: "Queries Snowflake for partner billing and utilization data, refreshes Power BI dashboard, and posts to leadership."
  tags:
    - reporting
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: power_bi_partner_performance_dashboard
          description: "Queries Snowflake for partner billing and utilization data, refreshes Power BI dashboard, and posts to leadership."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Power BI Partner Performance Dashboard: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Power BI Partner Performance Dashboard for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Triggers a Power BI dataset refresh for the PwC practice performance dashboard and notifies the operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Practice Performance Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the PwC practice performance dashboard and notifies the operations team in Microsoft Teams."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - microsoft-teams
    - operations
capability:
  exposes:
    - type: mcp
      namespace: operations-bi
      port: 8080
      tools:
        - name: refresh-practice-dashboard
          description: "Trigger a Power BI refresh for the PwC practice performance dashboard and notify the operations analytics team in Teams."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the practice performance dashboard."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the operations analytics team."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.refresh-dataset
              with:
                dataset_id: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Practice performance dashboard refresh initiated. Dataset: {{dataset_id}} | Status: {{trigger-refresh.status}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Quarterly Financial Close Orchestration"
  description: "Orchestrates quarterly close by verifying SAP period status, running Snowflake reconciliation, refreshing Power BI dashboards, and posting summary to Teams."
  tags:
    - finance
    - accounting
    - sap
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-quarterly-close
          description: "Execute quarterly close checklist across finance systems."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period (e.g., 2026-Q1)."
          steps:
            - name: run-reconciliation
              type: call
              call: snowflake.execute-query
              with:
                statement: "CALL finance.reconciliation_check('{{fiscal_period}}')"
                warehouse: "FINANCE_WH"
            - name: refresh-dashboard
              type: call
              call: powerbi.refresh-dataset
              with:
                group_id: "$secrets.finance_workspace_id"
                dataset_id: "$secrets.close_dataset_id"
            - name: post-summary
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.finance_team_id"
                channel_id: "$secrets.finance_close_channel_id"
                text: "Q close for {{fiscal_period}}: Reconciliation rows={{run-reconciliation.row_count}}, Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Runs compliance checks by pulling access logs from Okta, change records from ServiceNow, queries Snowflake for policy violations, and publishes a compliance report to Confluence.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Check Orchestration"
  description: "Runs compliance checks by pulling access logs from Okta, change records from ServiceNow, queries Snowflake for policy violations, and publishes a compliance report to Confluence."
  tags:
    - compliance
    - regulatory
    - okta
    - servicenow
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: compliance-checks
      port: 8080
      tools:
        - name: run-compliance-check
          description: "Execute a regulatory compliance check across identity, change management, and data systems."
          inputParameters:
            - name: regulation
              in: body
              type: string
              description: "Regulation identifier (e.g., SOX, GDPR)."
            - name: check_period_start
              in: body
              type: string
              description: "Check period start date."
            - name: check_period_end
              in: body
              type: string
              description: "Check period end date."
          steps:
            - name: get-access-logs
              type: call
              call: okta.get-system-logs
              with:
                since: "{{check_period_start}}"
                until: "{{check_period_end}}"
            - name: get-changes
              type: call
              call: servicenow.query-changes
              with:
                start_date: "{{check_period_start}}"
                end_date: "{{check_period_end}}"
            - name: check-violations
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM compliance.policy_violations WHERE regulation = '{{regulation}}' AND check_date BETWEEN '{{check_period_start}}' AND '{{check_period_end}}'"
                warehouse: "COMPLIANCE_WH"
            - name: publish-report
              type: call
              call: confluence.create-page
              with:
                spaceKey: COMPLIANCE
                title: "{{regulation}} Compliance Check: {{check_period_start}} to {{check_period_end}}"
                body: "Access events: {{get-access-logs.length}}, Changes: {{get-changes.count}}, Violations: {{check-violations.row_count}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://pwc.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: logs
          path: "/logs?since={{since}}&until={{until}}"
          inputParameters:
            - name: since
              in: query
            - name: until
              in: query
          operations:
            - name: get-system-logs
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request?sysparm_query=sys_created_onBETWEEN{{start_date}}@{{end_date}}"
          inputParameters:
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: query-changes
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://pwc.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

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

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

Retrieves Salesforce client account metrics and posts an account health digest to the engagement partner's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Client Account Health Digest"
  description: "Retrieves Salesforce client account metrics and posts an account health digest to the engagement partner's Microsoft Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
    - microsoft-teams
    - client-management
capability:
  exposes:
    - type: mcp
      namespace: client-reporting
      port: 8080
      tools:
        - name: digest-client-health
          description: "Given a Salesforce account ID and engagement partner's Teams UPN, fetch client account metrics and post a health digest to the partner's Teams channel."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the client."
            - name: partner_teams_upn
              in: body
              type: string
              description: "The Teams UPN of the engagement partner to notify."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{partner_teams_upn}}"
                text: "Client Health: {{get-account.Name}} | Revenue: ${{get-account.AnnualRevenue}} | Open Cases: {{get-account.OpenCasesCount}} | Last Activity: {{get-account.LastActivityDate}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Salesforce for open client engagement opportunities by service line and posts a pipeline digest to the practice leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Client Opportunity Pipeline Digest"
  description: "Queries Salesforce for open client engagement opportunities by service line and posts a pipeline digest to the practice leadership Microsoft Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
    - microsoft-teams
    - client-engagement
capability:
  exposes:
    - type: mcp
      namespace: engagement-reporting
      port: 8080
      tools:
        - name: digest-engagement-pipeline
          description: "Given a PwC service line and Teams channel, query Salesforce for open client engagement opportunities and post a pipeline digest with deal counts and total value."
          inputParameters:
            - name: service_line
              in: body
              type: string
              description: "The PwC service line to filter opportunities (e.g., 'Audit & Assurance', 'Tax', 'Advisory', 'Consulting')."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the practice leadership digest."
          steps:
            - name: query-opportunities
              type: call
              call: salesforce.query-records
              with:
                q: "SELECT Id,Name,StageName,Amount,CloseDate FROM Opportunity WHERE Service_Line__c = '{{service_line}}' AND IsClosed = false"
            - name: post-digest
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Engagement Pipeline — {{service_line}}: {{query-opportunities.totalSize}} open opportunities | Total pipeline: ${{query-opportunities.total_amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-records
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

When a new Salesforce engagement opportunity is created, fetches the client company's LinkedIn organization data to enrich the account record with industry and employee count.

naftiko: "0.5"
info:
  label: "Salesforce Engagement Opportunity Enrichment from LinkedIn"
  description: "When a new Salesforce engagement opportunity is created, fetches the client company's LinkedIn organization data to enrich the account record with industry and employee count."
  tags:
    - sales
    - crm
    - salesforce
    - linkedin
    - lead-enrichment
    - client-engagement
capability:
  exposes:
    - type: mcp
      namespace: opportunity-enrichment
      port: 8080
      tools:
        - name: enrich-opportunity-account
          description: "Given a Salesforce opportunity ID and the client LinkedIn organization URN, fetch LinkedIn company data and update the Salesforce account with industry, employee count, and headquarters location."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID for the new client engagement."
            - name: linkedin_org_urn
              in: body
              type: string
              description: "The LinkedIn organization URN for the client company (e.g., 'urn:li:organization:12345')."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: get-linkedin-org
              type: call
              call: linkedin.get-organization
              with:
                org_urn: "{{linkedin_org_urn}}"
            - name: update-account
              type: call
              call: salesforce.update-account
              with:
                account_id: "{{get-opportunity.AccountId}}"
                industry: "{{get-linkedin-org.industries[0].localizedName}}"
                number_of_employees: "{{get-linkedin-org.staffCount}}"
                description: "{{get-linkedin-org.localizedDescription}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: organizations
          path: "/organizations/{{org_urn}}"
          inputParameters:
            - name: org_urn
              in: path
          operations:
            - name: get-organization
              method: GET

Creates a new client account and primary contact in Salesforce, opens a ServiceNow client onboarding task, and notifies the engagement partner in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce New Client Onboarding"
  description: "Creates a new client account and primary contact in Salesforce, opens a ServiceNow client onboarding task, and notifies the engagement partner in Microsoft Teams."
  tags:
    - sales
    - crm
    - salesforce
    - servicenow
    - onboarding
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-onboarding
      port: 8080
      tools:
        - name: onboard-client
          description: "Given client company name, primary contact details, service line, and engagement partner's Teams UPN, create a Salesforce account and contact, open a ServiceNow onboarding task, and notify the partner."
          inputParameters:
            - name: company_name
              in: body
              type: string
              description: "The client's legal company name."
            - name: contact_name
              in: body
              type: string
              description: "Primary contact's full name at the client."
            - name: contact_email
              in: body
              type: string
              description: "Primary contact's business email address."
            - name: service_line
              in: body
              type: string
              description: "The PwC service line for this engagement (e.g., 'Audit & Assurance', 'Tax')."
            - name: partner_teams_upn
              in: body
              type: string
              description: "The Teams UPN of the engagement partner to notify."
          steps:
            - name: create-account
              type: call
              call: salesforce.create-account
              with:
                name: "{{company_name}}"
                type: "Client"
                service_line: "{{service_line}}"
            - name: create-contact
              type: call
              call: salesforce.create-contact
              with:
                account_id: "{{create-account.id}}"
                name: "{{contact_name}}"
                email: "{{contact_email}}"
            - name: open-onboarding-task
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Client Onboarding: {{company_name}} — {{service_line}}"
                category: "client_onboarding"
                description: "Salesforce Account: {{create-account.id}}. Contact: {{contact_name}} ({{contact_email}})."
            - name: notify-partner
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{partner_teams_upn}}"
                text: "New client onboarded: {{company_name}} ({{service_line}}). Salesforce: {{create-account.id}}. SNOW task: {{open-onboarding-task.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://pwc.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
        - name: contacts
          path: "/sobjects/Contact"
          operations:
            - name: create-contact
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Pulls pipeline data from Salesforce, queries Snowflake for historical trends, and posts forecast to leadership.

naftiko: "0.5"
info:
  label: "Salesforce Pipeline Forecast Digest"
  description: "Pulls pipeline data from Salesforce, queries Snowflake for historical trends, and posts forecast to leadership."
  tags:
    - sales
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: salesforce_pipeline_forecast_digest
          description: "Pulls pipeline data from Salesforce, queries Snowflake for historical trends, and posts forecast to leadership."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Salesforce Pipeline Forecast Digest: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Salesforce Pipeline Forecast Digest for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Retrieves an expense report from SAP Concur by report ID, returning the total amount, status, and owner.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Lookup"
  description: "Retrieves an expense report from SAP Concur by report ID, returning the total amount, status, and owner."
  tags:
    - finance
    - expenses
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: finance-expenses
      port: 8080
      tools:
        - name: get-expense-report
          description: "Given a Concur expense report ID, return the total, currency, status, and owner."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Concur expense report ID."
          call: concur.get-report
          with:
            report_id: "{{report_id}}"
          outputParameters:
            - name: total
              type: string
              mapping: "$.Total"
            - name: currency
              type: string
              mapping: "$.CurrencyCode"
            - name: status
              type: string
              mapping: "$.ApprovalStatusName"
  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/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET

Retrieves a pending SAP Concur expense report, approves it, and notifies the submitter via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "Retrieves a pending SAP Concur expense report, approves it, and notifies the submitter via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - approval
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: approve-expense-report
          description: "Given a SAP Concur report ID and approver comment, retrieve the report, approve it, and notify the submitter via Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to approve."
            - name: approver_comment
              in: body
              type: string
              description: "Approval comment to attach to the submission."
          steps:
            - name: get-report
              type: call
              call: concur.get-report
              with:
                report_id: "{{report_id}}"
            - name: approve-report
              type: call
              call: concur.approve-report
              with:
                report_id: "{{report_id}}"
                comment: "{{approver_comment}}"
            - name: notify-submitter
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{get-report.submitter_email}}"
                text: "Your expense report '{{get-report.name}}' (${{get-report.total}}) has been approved in SAP Concur."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET
            - name: approve-report
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Audits SAP Concur expense reports for missing receipts, creates compliance tickets, and notifies expense owners.

naftiko: "0.5"
info:
  label: "SAP Concur Receipt Compliance Audit"
  description: "Audits SAP Concur expense reports for missing receipts, creates compliance tickets, and notifies expense owners."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: sap_concur_receipt_compliance_audit
          description: "Audits SAP Concur expense reports for missing receipts, creates compliance tickets, and notifies expense owners."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "SAP Concur Receipt Compliance Audit: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "SAP Concur Receipt Compliance Audit for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Detects travel policy violations in SAP Concur, creates ServiceNow compliance tickets, and notifies managers.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Policy Violation Alert"
  description: "Detects travel policy violations in SAP Concur, creates ServiceNow compliance tickets, and notifies managers."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: sap_concur_travel_policy_violation_alert
          description: "Detects travel policy violations in SAP Concur, creates ServiceNow compliance tickets, and notifies managers."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "SAP Concur Travel Policy Violation Alert: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "SAP Concur Travel Policy Violation Alert for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

Submits a ServiceNow change request for updates to PwC's audit or tax systems and notifies the change advisory board in Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request for Audit System Updates"
  description: "Submits a ServiceNow change request for updates to PwC's audit or tax systems and notifies the change advisory board in Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - audit
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-ops
      port: 8080
      tools:
        - name: submit-audit-system-change
          description: "Given a change description, affected audit or tax system, planned start, and CAB Teams channel, create a ServiceNow change request and notify the CAB."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Full description of the system change, scope, and rollback plan."
            - name: affected_system
              in: body
              type: string
              description: "The PwC audit or tax system being changed (e.g., 'Aura Audit', 'PwC Tax Connect')."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start datetime in ISO 8601 format."
            - name: cab_channel_id
              in: body
              type: string
              description: "Teams channel ID for the change advisory board notification."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Change: {{affected_system}} — {{change_description}}"
                planned_start: "{{planned_start}}"
                category: "audit_systems"
            - name: notify-cab
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{cab_channel_id}}"
                text: "Change Request: {{affected_system}} | CHG: {{create-change.number}} | Planned: {{planned_start}} | Scope: {{change_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.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.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

Retrieves a ServiceNow incident by ticket number and returns its current state, priority, assignment group, and description.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by ticket number and returns its current state, priority, assignment group, and description."
  tags:
    - itsm
    - servicenow
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: itsm-lookup
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, return the incident's state, priority, assigned group, and short description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., 'INC0067890')."
          call: servicenow.get-incident
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: short_description
              type: string
              mapping: "$.result.short_description"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

Coordinates major incident response by creating ServiceNow bridge, paging on-call via PagerDuty, and notifying leadership.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Management"
  description: "Coordinates major incident response by creating ServiceNow bridge, paging on-call via PagerDuty, and notifying leadership."
  tags:
    - itsm
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: servicenow_major_incident_management
          description: "Coordinates major incident response by creating ServiceNow bridge, paging on-call via PagerDuty, and notifying leadership."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "ServiceNow Major Incident Management: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "ServiceNow Major Incident Management for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Audits SharePoint document retention against policies, creates Jira remediation tasks, and notifies compliance.

naftiko: "0.5"
info:
  label: "SharePoint Document Retention Compliance"
  description: "Audits SharePoint document retention against policies, creates Jira remediation tasks, and notifies compliance."
  tags:
    - compliance
    - sharepoint
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: sharepoint_document_retention_compliance
          description: "Audits SharePoint document retention against policies, creates Jira remediation tasks, and notifies compliance."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "SharePoint Document Retention Compliance: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "SharePoint Document Retention Compliance for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

Monitors Snowflake data quality metrics, creates Jira tickets for anomalies, and notifies the data team.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Monitoring"
  description: "Monitors Snowflake data quality metrics, creates Jira tickets for anomalies, and notifies the data team."
  tags:
    - data-engineering
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: snowflake_data_quality_monitoring
          description: "Monitors Snowflake data quality metrics, creates Jira tickets for anomalies, and notifies the data team."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Snowflake Data Quality Monitoring: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Snowflake Data Quality Monitoring for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Monitors Snowflake pipeline task health for PwC engagement analytics and alerts the data engineering team in Teams if failures are detected.

naftiko: "0.5"
info:
  label: "Snowflake Engagement Analytics Pipeline Monitor"
  description: "Monitors Snowflake pipeline task health for PwC engagement analytics and alerts the data engineering team in Teams if failures are detected."
  tags:
    - data
    - analytics
    - snowflake
    - monitoring
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: monitor-analytics-pipelines
          description: "Given a Snowflake database and schema for engagement analytics, check for task failures in the past 24 hours and post an alert to the data engineering Teams channel."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "The Snowflake database name for engagement analytics (e.g., 'ENGAGEMENT_ANALYTICS')."
            - name: schema
              in: body
              type: string
              description: "The Snowflake schema containing analytics pipeline tasks."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for data engineering alerts."
          steps:
            - name: check-task-failures
              type: call
              call: snowflake.query-task-history
              with:
                database: "{{database}}"
                schema: "{{schema}}"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Analytics Pipeline Health ({{database}}.{{schema}}): {{check-task-failures.failed_count}} failures in 24h. Failed tasks: {{check-task-failures.failed_task_names}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/{{schema}}/tasks"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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

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

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

Compiles sprint metrics from Jira, creates a Confluence retro page, and posts highlights to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Sprint Retrospective Digest Orchestration"
  description: "Compiles sprint metrics from Jira, creates a Confluence retro page, and posts highlights to the engineering Teams channel."
  tags:
    - engineering
    - agile
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: agile-retro
      port: 8080
      tools:
        - name: generate-retro-digest
          description: "Given a Jira sprint ID, compile metrics and create retro documentation."
          inputParameters:
            - name: sprint_id
              in: body
              type: string
              description: "Jira sprint ID."
            - name: board_id
              in: body
              type: string
              description: "Jira board ID."
          steps:
            - name: get-sprint-report
              type: call
              call: jira.get-sprint-report
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: create-retro-page
              type: call
              call: confluence.create-page
              with:
                spaceKey: ENG
                title: "Sprint {{sprint_id}} Retrospective"
                body: "Completed: {{get-sprint-report.completedIssues.length}}, Incomplete: {{get-sprint-report.incompleteIssues.length}}"
            - name: post-highlights
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.eng_team_id"
                channel_id: "$secrets.eng_retro_channel_id"
                text: "Sprint {{sprint_id}} retro: {{get-sprint-report.completedIssues.length}} completed. Report: {{create-retro-page.url}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-reports
          path: "/board/{{board_id}}/sprint/{{sprint_id}}/report"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-report
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://pwc.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a staff departure is processed in Workday, creates a ServiceNow offboarding ticket and notifies IT security in Microsoft Teams to revoke access.

naftiko: "0.5"
info:
  label: "Staff Offboarding Workflow"
  description: "When a staff departure is processed in Workday, creates a ServiceNow offboarding ticket and notifies IT security in Microsoft Teams to revoke access."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday worker ID and last day date, create a ServiceNow offboarding task and alert IT security in Teams to begin access revocation for the departing staff member."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the departing staff member."
            - name: last_day
              in: body
              type: string
              description: "The staff member's last working date in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-offboard-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Offboarding: {{get-employee.full_name}} — last day {{last_day}}"
                category: "hr_offboarding"
                assigned_group: "IT_Security"
            - name: alert-it-security
              type: call
              call: msteams.send-message
              with:
                channel_id: "it-security-channel"
                text: "Offboarding initiated: {{get-employee.full_name}} (last day: {{last_day}}). SNOW: {{create-offboard-ticket.number}}. Begin access revocation."
  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: "/pwc/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a Tableau workbook refresh fails, creates a Jira ticket and notifies the BI team via Teams.

naftiko: "0.5"
info:
  label: "Tableau Workbook Failure Alert"
  description: "When a Tableau workbook refresh fails, creates a Jira ticket and notifies the BI team via Teams."
  tags:
    - reporting
    - tableau
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: tableau_workbook_failure_alert
          description: "When a Tableau workbook refresh fails, creates a Jira ticket and notifies the BI team via Teams."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Tableau Workbook Failure Alert: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Tableau Workbook Failure Alert for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

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

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

Processes incoming tax documents by extracting data via AI, storing in Snowflake, creating a Jira review task, and notifying the tax team via Teams.

naftiko: "0.5"
info:
  label: "Tax Document Processing Orchestration"
  description: "Processes incoming tax documents by extracting data via AI, storing in Snowflake, creating a Jira review task, and notifying the tax team via Teams."
  tags:
    - tax
    - document-processing
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tax-processing
      port: 8080
      tools:
        - name: process-tax-document
          description: "Given a document reference, extract tax data, store results, create review task, and notify team."
          inputParameters:
            - name: document_id
              in: body
              type: string
              description: "Document ID in the document management system."
            - name: client_name
              in: body
              type: string
              description: "Client name for the tax engagement."
            - name: tax_year
              in: body
              type: string
              description: "Tax year."
          steps:
            - name: store-extraction
              type: call
              call: snowflake.execute-query
              with:
                statement: "INSERT INTO tax.document_extractions (document_id, client_name, tax_year, status) VALUES ('{{document_id}}', '{{client_name}}', '{{tax_year}}', 'pending_review')"
                warehouse: "TAX_WH"
            - name: create-review-task
              type: call
              call: jira.create-issue
              with:
                project: TAX
                issuetype: Task
                summary: "Review tax document: {{client_name}} - {{tax_year}}"
                description: "Document ID: {{document_id}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.tax_team_id"
                channel_id: "$secrets.tax_processing_channel_id"
                text: "Tax document for {{client_name}} ({{tax_year}}) ready for review. Jira: {{create-review-task.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://pwc.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Assesses vendor risk by pulling vendor data from SAP, checking compliance records in Snowflake, creating a risk assessment in ServiceNow, and notifying procurement.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Workflow"
  description: "Assesses vendor risk by pulling vendor data from SAP, checking compliance records in Snowflake, creating a risk assessment in ServiceNow, and notifying procurement."
  tags:
    - procurement
    - risk-management
    - sap
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vendor-risk
      port: 8080
      tools:
        - name: assess-vendor-risk
          description: "Given a SAP vendor number, run a risk assessment across compliance and procurement data."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "SAP vendor number."
          steps:
            - name: get-vendor
              type: call
              call: sap.get-vendor
              with:
                vendor_id: "{{vendor_number}}"
            - name: check-compliance
              type: call
              call: snowflake.execute-query
              with:
                statement: "SELECT * FROM procurement.vendor_compliance WHERE vendor_id = '{{vendor_number}}'"
                warehouse: "PROCUREMENT_WH"
            - name: create-assessment
              type: call
              call: servicenow.create-request
              with:
                short_description: "Vendor risk assessment: {{get-vendor.SupplierName}}"
                category: vendor_management
            - name: notify-procurement
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "$secrets.procurement_team_id"
                channel_id: "$secrets.vendor_risk_channel_id"
                text: "Vendor risk assessment for {{get-vendor.SupplierName}}: Compliance records={{check-compliance.row_count}}. ServiceNow: {{create-assessment.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://pwc-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Workday for incomplete benefits enrollments and sends reminders via Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for incomplete benefits enrollments and sends reminders via Teams."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: workday_benefits_enrollment_reminder
          description: "Queries Workday for incomplete benefits enrollments and sends reminders via Teams."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Workday Benefits Enrollment Reminder: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Workday Benefits Enrollment Reminder for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Retrieves the compensation grade and pay range for a given Workday job profile to support offer generation and compensation planning.

naftiko: "0.5"
info:
  label: "Workday Compensation Grade Lookup"
  description: "Retrieves the compensation grade and pay range for a given Workday job profile to support offer generation and compensation planning."
  tags:
    - hr
    - compensation
    - workday
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: hr-comp
      port: 8080
      tools:
        - name: get-compensation-grade
          description: "Given a Workday job profile ID, return the compensation grade, pay range minimum and maximum, and currency for use in offer generation or compensation benchmarking."
          inputParameters:
            - name: job_profile_id
              in: body
              type: string
              description: "The Workday job profile ID to retrieve compensation data for."
          call: workday.get-comp-grade
          with:
            job_profile_id: "{{job_profile_id}}"
          outputParameters:
            - name: grade
              type: string
              mapping: "$.compensationGrade.descriptor"
            - name: pay_min
              type: string
              mapping: "$.compensationGradeProfile.minimumSalary"
            - name: pay_max
              type: string
              mapping: "$.compensationGradeProfile.maximumSalary"
            - name: currency
              type: string
              mapping: "$.compensationGradeProfile.currency"
  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-grades
          path: "/pwc/compensationGrades/{{job_profile_id}}"
          inputParameters:
            - name: job_profile_id
              in: path
          operations:
            - name: get-comp-grade
              method: GET

Retrieves compensation details for an employee from Workday including base salary, bonus target, and pay grade.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves compensation details for an employee from Workday including base salary, bonus target, and pay grade."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-compensation
          description: "Given a Workday employee ID, return base salary, bonus target, and pay grade."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: workday.get-compensation
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: base_salary
              type: string
              mapping: "$.compensation.baseSalary"
            - name: bonus_target
              type: string
              mapping: "$.compensation.bonusTarget"
  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

Pulls diversity metrics from Workday, refreshes Power BI dashboard, and posts report to HR leadership.

naftiko: "0.5"
info:
  label: "Workday Diversity Metrics Report"
  description: "Pulls diversity metrics from Workday, refreshes Power BI dashboard, and posts report to HR leadership."
  tags:
    - hr
    - diversity
    - workday
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: workday_diversity_metrics_report
          description: "Pulls diversity metrics from Workday, refreshes Power BI dashboard, and posts report to HR leadership."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Workday Diversity Metrics Report: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Workday Diversity Metrics Report for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Retrieves an employee's profile from Workday by worker ID, including name, department, title, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee's profile from Workday by worker ID, including name, department, title, and manager."
  tags:
    - hr
    - workforce
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-profiles
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Given a Workday worker ID, return the employee's full name, department, title, and manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.fullName"
            - name: department
              type: string
              mapping: "$.department"
            - name: title
              type: string
              mapping: "$.jobTitle"
            - name: manager
              type: string
              mapping: "$.manager.displayName"
  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

Exports current active headcount from Workday by service line and posts a snapshot with average billing rates to the PwC finance leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workday Headcount and Billing Rate Snapshot"
  description: "Exports current active headcount from Workday by service line and posts a snapshot with average billing rates to the PwC finance leadership Teams channel."
  tags:
    - hr
    - finance
    - workday
    - reporting
    - microsoft-teams
    - workforce-planning
capability:
  exposes:
    - type: mcp
      namespace: hr-finance-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Retrieve current headcount and billing rate data from Workday by service line and post a summary to the finance leadership Teams channel."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "The snapshot date in YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "Teams channel ID for the finance leadership snapshot."
          steps:
            - name: export-workers
              type: call
              call: workday.list-workers
              with:
                status: "active"
                as_of_date: "{{as_of_date}}"
            - name: post-snapshot
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "PwC Headcount Snapshot ({{as_of_date}}): {{export-workers.total}} active staff across {{export-workers.service_line_count}} service lines."
  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: "/pwc/workers"
          inputParameters:
            - name: status
              in: query
            - name: as_of_date
              in: query
          operations:
            - name: list-workers
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

When a new hire is confirmed in Workday, creates Okta account, provisions access, and notifies IT.

naftiko: "0.5"
info:
  label: "Workday New Hire IT Provisioning"
  description: "When a new hire is confirmed in Workday, creates Okta account, provisions access, and notifies IT."
  tags:
    - hr
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: workday_new_hire_it_provisioning
          description: "When a new hire is confirmed in Workday, creates Okta account, provisions access, and notifies IT."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Workday New Hire IT Provisioning: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Workday New Hire IT Provisioning for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Detects payroll discrepancies between Workday and Snowflake, creates Jira investigation tickets, and notifies payroll.

naftiko: "0.5"
info:
  label: "Workday Payroll Discrepancy Investigation"
  description: "Detects payroll discrepancies between Workday and Snowflake, creates Jira investigation tickets, and notifies payroll."
  tags:
    - hr
    - payroll
    - workday
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: pwc-ops
      port: 8080
      tools:
        - name: workday_payroll_discrepancy_investigation
          description: "Detects payroll discrepancies between Workday and Snowflake, creates Jira investigation tickets, and notifies payroll."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary entity identifier." 
            - name: context
              type: string
              description: "Additional context." 
          steps:
            - name: gather-data
              type: call
              call: snowflake.run-query
              with:
                entity_id: "{{entity_id}}" 
                context: "{{context}}" 
            - name: create-action
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Workday Payroll Discrepancy Investigation: {{entity_id}}" 
                description: "Data: {{gather-data.results}}" 
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_ops_channel" 
                text: "Workday Payroll Discrepancy Investigation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://pwc.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://pwc.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/ops/channels/{{channel_id}}/messages"
          operations:
            - name: post-channel-message
              method: POST

Initiates a performance review cycle in Workday for a PwC service line and notifies all people managers in Microsoft Teams to begin annual evaluations.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Launch"
  description: "Initiates a performance review cycle in Workday for a PwC service line and notifies all people managers in Microsoft Teams to begin annual evaluations."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: launch-review-cycle
          description: "Given a service line code and review period, initiate the Workday performance review cycle and send a Teams notification to all people managers."
          inputParameters:
            - name: service_line
              in: body
              type: string
              description: "The PwC service line code for the review cycle (e.g., 'ASSURANCE', 'TAX', 'ADVISORY')."
            - name: review_period
              in: body
              type: string
              description: "The review period label (e.g., 'Annual-2025')."
            - name: due_date
              in: body
              type: string
              description: "Review completion deadline in YYYY-MM-DD format."
            - name: manager_channel_id
              in: body
              type: string
              description: "Teams channel ID for the manager notification."
          steps:
            - name: create-cycle
              type: call
              call: workday.create-review-cycle
              with:
                service_line: "{{service_line}}"
                review_period: "{{review_period}}"
                due_date: "{{due_date}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{manager_channel_id}}"
                text: "Performance Review Cycle '{{review_period}}' launched for {{service_line}}. Complete all Workday evaluations by {{due_date}}. Cycle ID: {{create-cycle.cycle_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: review-cycles
          path: "/pwc/performanceReviews"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msteams_token"
      resources:
        - name: messages
          path: "/teams/{{channel_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

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

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