Trader Joe's Capabilities

Naftiko 0.5 capability definitions for Trader Joe's - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Initiates the annual budget planning cycle by creating budget tasks in SAP, opening a ServiceNow project for budget submissions, and notifying all department heads via Teams.

naftiko: "0.5"
info:
  label: "Annual Budget Cycle Kickoff"
  description: "Initiates the annual budget planning cycle by creating budget tasks in SAP, opening a ServiceNow project for budget submissions, and notifying all department heads via Teams."
  tags:
    - finance
    - budgeting
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-planning
      port: 8080
      tools:
        - name: kickoff-budget-cycle
          description: "Given a fiscal year, submission deadline, and list of department heads, create SAP budget planning records, open a ServiceNow coordination project, and notify all department heads via Teams."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year being budgeted (e.g., FY2026)."
            - name: submission_deadline
              in: body
              type: string
              description: "Budget submission deadline in YYYY-MM-DD format."
            - name: finance_channel_id
              in: body
              type: string
              description: "Teams channel ID for the finance leadership group."
          steps:
            - name: create-servicenow-project
              type: call
              call: "servicenow-budget.create-task"
              with:
                short_description: "{{fiscal_year}} Budget Planning Coordination"
                category: "finance_planning"
                due_date: "{{submission_deadline}}"
                assignment_group: "FP_And_A"
            - name: notify-finance-leadership
              type: call
              call: "msteams-budget.post-channel-message"
              with:
                channel_id: "{{finance_channel_id}}"
                text: "{{fiscal_year}} budget planning cycle has started. Submissions due {{submission_deadline}}. Planning task: {{create-servicenow-project.number}}. Please submit department budgets by the deadline."
  consumes:
    - type: http
      namespace: servicenow-budget
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-budget
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Azure resource group costs.

naftiko: "0.5"
info:
  label: "Azure Resource Cost Lookup"
  description: "Retrieves Azure resource group costs."
  tags:
    - cloud
    - azure
    - finops
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: azure_resource_cost_lookup
          description: "Retrieves Azure resource group costs."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-azure
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

When open enrollment begins in Workday, sends personalized benefits enrollment reminders to all eligible associates via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Benefits Enrollment Notification"
  description: "When open enrollment begins in Workday, sends personalized benefits enrollment reminders to all eligible associates via Microsoft Teams."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an open enrollment period, retrieve all eligible associates from Workday who have not yet completed enrollment, and send reminder messages via Teams."
          inputParameters:
            - name: enrollment_deadline
              in: body
              type: string
              description: "Open enrollment deadline date in YYYY-MM-DD format."
            - name: enrollment_url
              in: body
              type: string
              description: "URL to the benefits enrollment portal."
          steps:
            - name: get-unenrolled
              type: call
              call: "workday-benefits.get-unenrolled-workers"
              with:
                enrollmentStatus: "not_started"
            - name: send-reminders
              type: call
              call: "msteams-benefits.post-channel-message"
              with:
                channel_id: "all-associates"
                text: "Benefits enrollment reminder: Open enrollment closes {{enrollment_deadline}}. Complete your elections at {{enrollment_url}}. Contact HR with questions."
  consumes:
    - type: http
      namespace: workday-benefits
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: enrollmentStatus
              in: query
          operations:
            - name: get-unenrolled-workers
              method: GET
    - type: http
      namespace: msteams-benefits
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Submits an IT change request in ServiceNow for store system changes, routes for CAB approval, and notifies impacted stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Change Management Request Workflow"
  description: "Submits an IT change request in ServiceNow for store system changes, routes for CAB approval, and notifies impacted stakeholders via Microsoft Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, risk level, and affected stores, create a ServiceNow change request, assign it to the CAB group, and notify impacted store managers via Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed system change."
            - name: risk_level
              in: body
              type: string
              description: "Risk level of the change: low, medium, high."
            - name: implementation_date
              in: body
              type: string
              description: "Planned implementation date in YYYY-MM-DD format."
            - name: affected_stores
              in: body
              type: string
              description: "Comma-separated list of store numbers affected by this change."
          steps:
            - name: create-change
              type: call
              call: "servicenow-change.create-change"
              with:
                short_description: "{{change_description}}"
                risk: "{{risk_level}}"
                start_date: "{{implementation_date}}"
                assignment_group: "CAB"
            - name: notify-stakeholders
              type: call
              call: "msteams-change.post-channel-message"
              with:
                channel_id: "it-change-notifications"
                text: "New change request {{create-change.number}}: {{change_description}}. Risk: {{risk_level}}. Implementation: {{implementation_date}}. Affected stores: {{affected_stores}}"
  consumes:
    - type: http
      namespace: servicenow-change
      baseUri: "https://traderjoes.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-change
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Azure costs, identifies optimization opportunities, and posts recommendations to IT leadership.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Orchestration"
  description: "Queries Azure costs, identifies optimization opportunities, and posts recommendations to IT leadership."
  tags:
    - cloud
    - finops
    - azure
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: cloud_cost_optimization_orchestration
          description: "Queries Azure costs, identifies optimization opportunities, and posts recommendations to IT 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: "Cloud Cost Optimization Orchestration: {{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: "Cloud Cost Optimization Orchestration for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

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

naftiko: "0.5"
info:
  label: "Compliance Training Overdue Alert"
  description: "Queries Workday for overdue training, creates ServiceNow ticket, and notifies managers."
  tags:
    - hr
    - compliance
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: compliance_training_overdue_alert
          description: "Queries Workday for overdue 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://traderjoes.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://traderjoes.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 a Confluence wiki page by ID.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence wiki page by ID."
  tags:
    - collaboration
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: confluence_page_lookup
          description: "Retrieves a Confluence wiki page by ID."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-confluence
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Reconciles SAP Concur travel expense reports against corporate card charges in SAP, flags discrepancies, and routes exceptions to the finance team for review.

naftiko: "0.5"
info:
  label: "Corporate Travel Expense Reconciliation"
  description: "Reconciles SAP Concur travel expense reports against corporate card charges in SAP, flags discrepancies, and routes exceptions to the finance team for review."
  tags:
    - finance
    - travel
    - sap-concur
    - sap
capability:
  exposes:
    - type: mcp
      namespace: travel-expense
      port: 8080
      tools:
        - name: reconcile-travel-expenses
          description: "Given a reporting period, retrieve all Concur expense reports and match against SAP corporate card transactions. Return a reconciliation summary with flagged discrepancies."
          inputParameters:
            - name: period_start
              in: body
              type: string
              description: "Start of the reconciliation period in YYYY-MM-DD format."
            - name: period_end
              in: body
              type: string
              description: "End of the reconciliation period in YYYY-MM-DD format."
          steps:
            - name: get-expense-reports
              type: call
              call: "concur-recon.get-expense-reports"
              with:
                modifiedAfter: "{{period_start}}"
                modifiedBefore: "{{period_end}}"
            - name: get-card-transactions
              type: call
              call: "sap-recon.get-card-transactions"
              with:
                dateFrom: "{{period_start}}"
                dateTo: "{{period_end}}"
  consumes:
    - type: http
      namespace: concur-recon
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: modifiedAfter
              in: query
            - name: modifiedBefore
              in: query
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: sap-recon
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/FI_CORPCARDTXN_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: card-transactions
          path: "/A_CorporateCardTransaction"
          inputParameters:
            - name: dateFrom
              in: query
            - name: dateTo
              in: query
          operations:
            - name: get-card-transactions
              method: GET

Queries Snowflake for customer feedback patterns, uses AI to identify trends, and posts insights to ops leadership.

naftiko: "0.5"
info:
  label: "Customer Feedback Trend Analysis"
  description: "Queries Snowflake for customer feedback patterns, uses AI to identify trends, and posts insights to ops leadership."
  tags:
    - customer-experience
    - snowflake
    - anthropic
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: customer_feedback_trend_analysis
          description: "Queries Snowflake for customer feedback patterns, uses AI to identify trends, and posts insights to ops 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: "Customer Feedback Trend Analysis: {{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: "Customer Feedback Trend Analysis for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

Queries daily sales data from Snowflake, generates a Power BI refresh, and distributes the report link to regional managers on Teams.

naftiko: "0.5"
info:
  label: "Daily Store Sales Report Distribution"
  description: "Queries daily sales data from Snowflake, generates a Power BI refresh, and distributes the report link to regional managers on Teams."
  tags:
    - analytics
    - retail
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: retail-reporting
      port: 8080
      tools:
        - name: distribute-daily-sales
          description: "Given a region and date, query sales, refresh BI, and distribute."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The region name."
            - name: report_date
              in: body
              type: string
              description: "The report date (YYYY-MM-DD)."
          steps:
            - name: get-sales
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT store_id, SUM(total_sales) as sales, COUNT(DISTINCT transaction_id) as txns FROM RETAIL_DB.PUBLIC.SALES WHERE region='{{region}}' AND sale_date='{{report_date}}' GROUP BY store_id ORDER BY sales DESC"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "$secrets.powerbi_sales_dataset_id"
            - name: notify-managers
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_regional_channel"
                text: "Daily Sales Report: {{region}} {{report_date}} | Dashboard refreshed. Top store: {{get-sales.top_store}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/regional/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a Snowflake ETL pipeline fails, creates Jira ticket and notifies data engineering.

naftiko: "0.5"
info:
  label: "Data Pipeline Failure Recovery"
  description: "When a Snowflake ETL pipeline fails, creates Jira ticket and notifies data engineering."
  tags:
    - data-engineering
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: data_pipeline_failure_recovery
          description: "When a Snowflake ETL pipeline fails, creates Jira ticket and notifies data engineering."
          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 Pipeline Failure Recovery: {{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 Pipeline Failure Recovery for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 submits a data privacy access request (DSAR), opens a ServiceNow compliance ticket, assigns to the privacy team, and notifies the requestor via Teams.

naftiko: "0.5"
info:
  label: "Data Privacy Access Request"
  description: "When an employee submits a data privacy access request (DSAR), opens a ServiceNow compliance ticket, assigns to the privacy team, and notifies the requestor via Teams."
  tags:
    - compliance
    - data-privacy
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: privacy-compliance
      port: 8080
      tools:
        - name: handle-privacy-request
          description: "Given a requestor's employee ID and request type (access, deletion, correction), create a ServiceNow DSAR ticket with the appropriate SLA and notify the requestor via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The employee ID of the person submitting the data privacy request."
            - name: request_type
              in: body
              type: string
              description: "Type of privacy request: access, deletion, or correction."
            - name: requestor_upn
              in: body
              type: string
              description: "UPN of the requestor for Teams notification."
          steps:
            - name: create-dsar-ticket
              type: call
              call: "servicenow-privacy.create-task"
              with:
                short_description: "DSAR - {{request_type}} request for employee {{employee_id}}"
                category: "data_privacy"
                assignment_group: "Privacy_Team"
                due_date: "30_days_from_now"
            - name: notify-requestor
              type: call
              call: "msteams-privacy.send-message"
              with:
                recipient_upn: "{{requestor_upn}}"
                text: "Your data privacy {{request_type}} request has been received. Ticket: {{create-dsar-ticket.number}}. You will receive a response within 30 days as required by applicable law."
  consumes:
    - type: http
      namespace: servicenow-privacy
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-privacy
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Datadog monitor status.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Lookup"
  description: "Retrieves a Datadog monitor status."
  tags:
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: datadog_monitor_status_lookup
          description: "Retrieves a Datadog monitor status."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-datadog
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Monitors DC throughput via Snowflake, creates ServiceNow alerts for bottlenecks, and notifies logistics.

naftiko: "0.5"
info:
  label: "Distribution Center Throughput Monitoring"
  description: "Monitors DC throughput via Snowflake, creates ServiceNow alerts for bottlenecks, and notifies logistics."
  tags:
    - logistics
    - distribution
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: distribution_center_throughput_monitoring
          description: "Monitors DC throughput via Snowflake, creates ServiceNow alerts for bottlenecks, and notifies logistics."
          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: "Distribution Center Throughput 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: "Distribution Center Throughput Monitoring for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 departs, revokes Okta access, updates Workday, and notifies IT and HR.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee departs, revokes Okta access, updates Workday, and notifies IT and HR."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: employee_offboarding_workflow
          description: "When an employee departs, revokes Okta access, updates Workday, 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://traderjoes.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://traderjoes.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 store associate receives a promotion or role change in Workday, updates their access profile in ServiceNow and notifies the store manager via Teams.

naftiko: "0.5"
info:
  label: "Employee Role Change Workflow"
  description: "When a store associate receives a promotion or role change in Workday, updates their access profile in ServiceNow and notifies the store manager via Teams."
  tags:
    - hr
    - role-change
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-changes
      port: 8080
      tools:
        - name: process-role-change
          description: "Given an employee ID, new role, and effective date, update the employee's role in Workday, adjust their access profile in ServiceNow, and notify their manager via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID for the associate being promoted or changing roles."
            - name: new_role
              in: body
              type: string
              description: "The new job title or role name."
            - name: effective_date
              in: body
              type: string
              description: "Effective date of the role change in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday-role.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-access
              type: call
              call: "servicenow-role.create-request"
              with:
                short_description: "Access update for role change: {{get-employee.full_name}} to {{new_role}}"
                category: "access_management"
                due_date: "{{effective_date}}"
            - name: notify-manager
              type: call
              call: "msteams-role.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Role change approved: {{get-employee.full_name}} transitions to {{new_role}} on {{effective_date}}. Access request: {{update-access.number}}"
  consumes:
    - type: http
      namespace: workday-role
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow-role
      baseUri: "https://traderjoes.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-role
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Distributes associate engagement survey links via Microsoft Teams to all active store employees retrieved from Workday, tracking participation by store.

naftiko: "0.5"
info:
  label: "Employee Survey Distribution"
  description: "Distributes associate engagement survey links via Microsoft Teams to all active store employees retrieved from Workday, tracking participation by store."
  tags:
    - hr
    - employee-engagement
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: employee-engagement
      port: 8080
      tools:
        - name: distribute-survey
          description: "Given a survey URL and store number, retrieve all active associates from Workday for that store and send them a personalized survey invitation via Teams."
          inputParameters:
            - name: survey_url
              in: body
              type: string
              description: "The URL link to the employee engagement survey."
            - name: store_number
              in: body
              type: string
              description: "The store number to target for survey distribution."
            - name: survey_name
              in: body
              type: string
              description: "Name of the survey for messaging context (e.g., 2026 Annual Engagement Survey)."
          steps:
            - name: get-store-associates
              type: call
              call: "workday-survey.get-workers"
              with:
                costCenter: "{{store_number}}"
                status: "active"
            - name: send-survey-blast
              type: call
              call: "msteams-survey.post-channel-message"
              with:
                channel_id: "store-{{store_number}}-associates"
                text: "Your voice matters! Please complete the {{survey_name}}: {{survey_url}}. This takes about 5 minutes and your feedback is confidential."
  consumes:
    - type: http
      namespace: workday-survey
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: costCenter
              in: query
            - name: status
              in: query
          operations:
            - name: get-workers
              method: GET
    - type: http
      namespace: msteams-survey
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee expense report is submitted in SAP Concur, validates against policy thresholds and routes for manager approval via ServiceNow.

naftiko: "0.5"
info:
  label: "Expense Report Approval"
  description: "When an employee expense report is submitted in SAP Concur, validates against policy thresholds and routes for manager approval via ServiceNow."
  tags:
    - finance
    - expense-management
    - sap-concur
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: expense-mgmt
      port: 8080
      tools:
        - name: process-expense-report
          description: "Given a Concur expense report ID, retrieve the report details, check against policy limits, and create a ServiceNow approval task for the manager if thresholds are exceeded."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: manager_email
              in: body
              type: string
              description: "Email of the approving manager."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                reportId: "{{report_id}}"
            - name: create-approval
              type: call
              call: "servicenow-expense.create-task"
              with:
                short_description: "Expense approval: Report {{report_id}} - ${{get-report.total_amount}}"
                assignment_group: "Finance_Approvals"
                assigned_to: "{{manager_email}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{reportId}}"
          inputParameters:
            - name: reportId
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: servicenow-expense
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Logs food safety audit results into SAP for quality record-keeping and creates a ServiceNow follow-up task for any critical findings that require corrective action.

naftiko: "0.5"
info:
  label: "Food Safety Audit Tracking"
  description: "Logs food safety audit results into SAP for quality record-keeping and creates a ServiceNow follow-up task for any critical findings that require corrective action."
  tags:
    - compliance
    - food-safety
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: food-safety
      port: 8080
      tools:
        - name: log-food-safety-audit
          description: "Given a store number, audit date, and findings, record the audit in SAP quality management and create ServiceNow corrective action tasks for any critical failures."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number that underwent the audit."
            - name: audit_date
              in: body
              type: string
              description: "Date of the food safety audit in YYYY-MM-DD format."
            - name: score
              in: body
              type: integer
              description: "Audit score out of 100."
            - name: critical_findings
              in: body
              type: string
              description: "Description of any critical findings requiring corrective action. Leave blank if none."
          steps:
            - name: log-quality-record
              type: call
              call: "sap-quality.create-quality-notification"
              with:
                plant: "{{store_number}}"
                notification_date: "{{audit_date}}"
                defect_description: "Food safety audit score: {{score}}/100. Findings: {{critical_findings}}"
            - name: create-corrective-action
              type: call
              call: "servicenow-quality.create-task"
              with:
                short_description: "Corrective action required: Store {{store_number}} food safety audit {{audit_date}} - Score: {{score}}"
                category: "food_safety"
                priority: "2"
                description: "Critical findings: {{critical_findings}}"
  consumes:
    - type: http
      namespace: sap-quality
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/A_QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: servicenow-quality
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a food safety inspection result is logged, stores results in Snowflake, creates corrective action tasks in ServiceNow, and notifies store management on Teams.

naftiko: "0.5"
info:
  label: "Food Safety Inspection Result Workflow"
  description: "When a food safety inspection result is logged, stores results in Snowflake, creates corrective action tasks in ServiceNow, and notifies store management on Teams."
  tags:
    - food-safety
    - compliance
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: food-safety
      port: 8080
      tools:
        - name: process-inspection-result
          description: "Given inspection results, log, create actions, and notify."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store ID."
            - name: inspection_score
              in: body
              type: string
              description: "The inspection score."
            - name: findings
              in: body
              type: string
              description: "Inspection findings summary."
          steps:
            - name: log-result
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO COMPLIANCE_DB.PUBLIC.INSPECTIONS (store_id, score, findings, inspection_date) VALUES ('{{store_id}}', '{{inspection_score}}', '{{findings}}', CURRENT_DATE())"
            - name: create-corrective-action
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Food safety corrective action: Store {{store_id}} — Score: {{inspection_score}}"
                description: "{{findings}}"
                assignment_group: "Store_Management"
            - name: notify-management
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_food_safety_channel"
                text: "Inspection result: Store {{store_id}} | Score: {{inspection_score}} | Task: {{create-corrective-action.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/food-safety/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Initiates month-end period close procedures in SAP, creates a ServiceNow checklist for the finance team, and notifies the controller via Teams when all steps are complete.

naftiko: "0.5"
info:
  label: "General Ledger Period Close"
  description: "Initiates month-end period close procedures in SAP, creates a ServiceNow checklist for the finance team, and notifies the controller via Teams when all steps are complete."
  tags:
    - finance
    - period-close
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: initiate-period-close
          description: "Given a fiscal period and year, open the period-close process in SAP, create a ServiceNow task checklist for the finance team, and notify the controller via Teams."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period number (01-12)."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year (e.g., 2026)."
            - name: controller_upn
              in: body
              type: string
              description: "UPN of the financial controller to notify."
          steps:
            - name: open-period
              type: call
              call: "sap-close.open-fiscal-period"
              with:
                period: "{{fiscal_period}}"
                year: "{{fiscal_year}}"
            - name: create-checklist
              type: call
              call: "servicenow-close.create-task"
              with:
                short_description: "Period close checklist FY{{fiscal_year}}-P{{fiscal_period}}"
                category: "finance_close"
                assignment_group: "Finance_Accounting"
            - name: notify-controller
              type: call
              call: "msteams-close.send-message"
              with:
                recipient_upn: "{{controller_upn}}"
                text: "Period close initiated for FY{{fiscal_year}}-P{{fiscal_period}}. Finance checklist task: {{create-checklist.number}}. Please review and approve all journal entries by the close deadline."
  consumes:
    - type: http
      namespace: sap-close
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_FISCALPERIOD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: fiscal-periods
          path: "/A_FiscalPeriod"
          operations:
            - name: open-fiscal-period
              method: POST
    - type: http
      namespace: servicenow-close
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-close
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

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

naftiko: "0.5"
info:
  label: "GitHub Dependabot Vulnerability Triage"
  description: "When Dependabot finds a vulnerability, creates Jira ticket and alerts security."
  tags:
    - security
    - github
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: github_dependabot_vulnerability_triage
          description: "When Dependabot finds a vulnerability, creates Jira ticket and alerts 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: "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://traderjoes.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://traderjoes.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 CI/CD status for a repository.

naftiko: "0.5"
info:
  label: "GitHub Repository Status Lookup"
  description: "Retrieves CI/CD status for a repository."
  tags:
    - devops
    - github
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: github_repository_status_lookup
          description: "Retrieves CI/CD status for a repository."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-github
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

When a product's inventory falls below the reorder threshold in SAP, creates a purchase requisition and notifies the store's category buyer via Teams.

naftiko: "0.5"
info:
  label: "Inventory Reorder Alert"
  description: "When a product's inventory falls below the reorder threshold in SAP, creates a purchase requisition and notifies the store's category buyer via Teams."
  tags:
    - supply-chain
    - inventory
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: inventory-mgmt
      port: 8080
      tools:
        - name: trigger-reorder-alert
          description: "Given a product SKU and store number with below-threshold inventory, create a SAP purchase requisition and notify the category buyer via Teams."
          inputParameters:
            - name: sku
              in: body
              type: string
              description: "The product SKU with low inventory."
            - name: store_number
              in: body
              type: string
              description: "The store number where the inventory is low."
            - name: current_quantity
              in: body
              type: integer
              description: "Current on-hand quantity for the SKU."
            - name: buyer_upn
              in: body
              type: string
              description: "UPN of the category buyer to notify."
          steps:
            - name: create-requisition
              type: call
              call: "sap-inventory.create-purchase-requisition"
              with:
                material: "{{sku}}"
                plant: "{{store_number}}"
                quantity: "50"
            - name: notify-buyer
              type: call
              call: "msteams-inventory.send-message"
              with:
                recipient_upn: "{{buyer_upn}}"
                text: "Low inventory alert: SKU {{sku}} at Store {{store_number}} has {{current_quantity}} units remaining. Purchase requisition created: {{create-requisition.requisition_number}}"
  consumes:
    - type: http
      namespace: sap-inventory
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-requisitions
          path: "/A_PurchaseRequisitionHeader"
          operations:
            - name: create-purchase-requisition
              method: POST
    - type: http
      namespace: msteams-inventory
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When GitHub finds a vulnerability, creates Jira ticket, opens ServiceNow change request, and alerts security.

naftiko: "0.5"
info:
  label: "IT Security Vulnerability Remediation"
  description: "When GitHub finds a vulnerability, creates Jira ticket, opens ServiceNow change request, and alerts security."
  tags:
    - security
    - github
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: it_security_vulnerability_remediation
          description: "When GitHub finds a vulnerability, creates Jira ticket, opens ServiceNow change request, and alerts 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: "IT Security Vulnerability Remediation: {{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 Security Vulnerability Remediation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 a Jira issue by key.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: jira_issue_lookup
          description: "Retrieves a Jira issue by key."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-jira
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

When Datadog detects a deployment failure, creates ServiceNow incident and alerts platform team.

naftiko: "0.5"
info:
  label: "Kubernetes Deployment Failure Alert"
  description: "When Datadog detects a deployment failure, creates ServiceNow incident and alerts platform team."
  tags:
    - devops
    - kubernetes
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: kubernetes_deployment_failure_alert
          description: "When Datadog detects a deployment failure, 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 Deployment 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: "Kubernetes Deployment Failure Alert for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 scheduled versus actual labor hours from ADP for a store and week, and flags any overtime or compliance violations for the store manager.

naftiko: "0.5"
info:
  label: "Labor Scheduling Compliance Check"
  description: "Retrieves scheduled versus actual labor hours from ADP for a store and week, and flags any overtime or compliance violations for the store manager."
  tags:
    - hr
    - labor-compliance
    - adp
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: labor-compliance
      port: 8080
      tools:
        - name: check-labor-compliance
          description: "Given a store number and pay period dates, retrieve scheduled and actual hours from ADP, calculate overtime exposure, and return a compliance summary."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number to audit for labor compliance."
            - name: period_start
              in: body
              type: string
              description: "Pay period start date in YYYY-MM-DD format."
            - name: period_end
              in: body
              type: string
              description: "Pay period end date in YYYY-MM-DD format."
          call: "adp-labor.get-time-details"
          with:
            costCenter: "{{store_number}}"
            startDate: "{{period_start}}"
            endDate: "{{period_end}}"
          outputParameters:
            - name: total_scheduled_hours
              type: number
              mapping: "$.totalScheduledHours"
            - name: total_actual_hours
              type: number
              mapping: "$.totalActualHours"
            - name: overtime_hours
              type: number
              mapping: "$.overtimeHours"
            - name: violations
              type: array
              mapping: "$.complianceViolations"
  consumes:
    - type: http
      namespace: adp-labor
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: time-details
          path: "/time/v2/workers/time-details"
          inputParameters:
            - name: costCenter
              in: query
            - name: startDate
              in: query
            - name: endDate
              in: query
          operations:
            - name: get-time-details
              method: GET

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: tj-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://traderjoes.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://traderjoes.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 annual performance review cycles in Workday for store managers, tracks completion, and sends reminders via Microsoft Teams for outstanding reviews.

naftiko: "0.5"
info:
  label: "Manager Performance Review Workflow"
  description: "Initiates annual performance review cycles in Workday for store managers, tracks completion, and sends reminders via Microsoft Teams for outstanding reviews."
  tags:
    - hr
    - performance-management
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: performance-mgmt
      port: 8080
      tools:
        - name: initiate-performance-reviews
          description: "Given a review cycle name and due date, launch performance review templates in Workday for all store managers and post a kickoff notification to the management Teams channel."
          inputParameters:
            - name: review_cycle
              in: body
              type: string
              description: "Name of the review cycle (e.g., 2026 Annual Review)."
            - name: due_date
              in: body
              type: string
              description: "Review submission deadline in YYYY-MM-DD format."
            - name: management_channel_id
              in: body
              type: string
              description: "Teams channel ID for the store management group."
          steps:
            - name: launch-review-cycle
              type: call
              call: "workday-perf.create-review-cycle"
              with:
                cycleName: "{{review_cycle}}"
                dueDate: "{{due_date}}"
            - name: notify-managers
              type: call
              call: "msteams-perf.post-channel-message"
              with:
                channel_id: "{{management_channel_id}}"
                text: "{{review_cycle}} performance review cycle is now open. Complete your team reviews in Workday by {{due_date}}. Review cycle ID: {{launch-review-cycle.cycle_id}}"
  consumes:
    - type: http
      namespace: workday-perf
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: review-cycles
          path: "/performanceReviewCycles"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: msteams-perf
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Posts a message to a Microsoft Teams channel for automated notifications.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Message Post"
  description: "Posts a message to a Microsoft Teams channel for automated notifications."
  tags:
    - communications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: comms
      port: 8080
      tools:
        - name: post-teams-message
          description: "Send a message to a Teams channel."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "The Teams team ID."
            - name: channel_id
              in: body
              type: string
              description: "The channel ID."
            - name: message_text
              in: body
              type: string
              description: "The message content."
          call: "msteams.post-channel-message"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
            text: "{{message_text}}"
          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-channel-message
              method: POST

When a new store associate is hired, provisions their Workday profile, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to their store manager.

naftiko: "0.5"
info:
  label: "New Store Associate Onboarding"
  description: "When a new store associate is hired, provisions their Workday profile, opens a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to their store manager."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-associate-onboarding
          description: "Given a new hire's Workday employee ID and store number, orchestrate the full store associate onboarding sequence across ServiceNow and Microsoft Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID for the new store associate."
            - name: store_number
              in: body
              type: string
              description: "The Trader Joe's store number where the associate will work."
            - name: start_date
              in: body
              type: string
              description: "The associate's first day in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: open-onboarding-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New associate onboarding: {{get-employee.full_name}} - Store {{store_number}}"
                category: "hr_onboarding"
                assignment_group: "Store_IT_Support"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "New associate {{get-employee.first_name}} {{get-employee.last_name}} starts {{start_date}} at Store {{store_number}}. Onboarding ticket: {{open-onboarding-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.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: chat-messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new store opening is planned, creates a structured onboarding project in ServiceNow covering IT provisioning, HR setup, and supplier onboarding milestones.

naftiko: "0.5"
info:
  label: "New Store Opening Checklist"
  description: "When a new store opening is planned, creates a structured onboarding project in ServiceNow covering IT provisioning, HR setup, and supplier onboarding milestones."
  tags:
    - operations
    - store-opening
    - servicenow
    - workday
    - sap
capability:
  exposes:
    - type: mcp
      namespace: store-expansion
      port: 8080
      tools:
        - name: initiate-store-opening
          description: "Given a new store number, opening date, and region, create a ServiceNow project with milestone tasks for IT provisioning, HR hiring setup, and supplier onboarding."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The new store number being opened."
            - name: opening_date
              in: body
              type: string
              description: "Planned store opening date in YYYY-MM-DD format."
            - name: region
              in: body
              type: string
              description: "Geographic region of the new store (e.g., Northeast, West Coast)."
          steps:
            - name: create-it-task
              type: call
              call: "servicenow-store.create-task"
              with:
                short_description: "IT provisioning for Store {{store_number}} opening {{opening_date}}"
                category: "store_opening"
                assignment_group: "Store_IT"
            - name: create-hr-task
              type: call
              call: "servicenow-store.create-task"
              with:
                short_description: "HR setup and hiring for Store {{store_number}} - {{region}}"
                category: "store_opening"
                assignment_group: "HR_Talent_Acquisition"
            - name: create-supplier-task
              type: call
              call: "servicenow-store.create-task"
              with:
                short_description: "Supplier onboarding for Store {{store_number}} - opening {{opening_date}}"
                category: "store_opening"
                assignment_group: "Procurement"
  consumes:
    - type: http
      namespace: servicenow-store
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Queries Okta for users without MFA, creates ServiceNow compliance ticket, and notifies IT security.

naftiko: "0.5"
info:
  label: "Okta MFA Non-Compliance Escalation"
  description: "Queries Okta for users without MFA, creates ServiceNow compliance ticket, and notifies IT security."
  tags:
    - security
    - identity
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: okta_mfa_non_compliance_escalation
          description: "Queries Okta for users without MFA, creates ServiceNow compliance ticket, and notifies IT 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 MFA Non-Compliance 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: "Okta MFA Non-Compliance Escalation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 Okta user status by email.

naftiko: "0.5"
info:
  label: "Okta User Status Lookup"
  description: "Retrieves Okta user status by email."
  tags:
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: okta_user_status_lookup
          description: "Retrieves Okta user status by email."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-okta
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Tracks organic certification deadlines in Jira, validates documentation in SharePoint, and notifies compliance.

naftiko: "0.5"
info:
  label: "Organic Product Certification Tracking"
  description: "Tracks organic certification deadlines in Jira, validates documentation in SharePoint, and notifies compliance."
  tags:
    - compliance
    - organic
    - jira
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: organic_product_certification_tracking
          description: "Tracks organic certification deadlines in Jira, validates documentation in SharePoint, 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: "Organic Product Certification Tracking: {{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: "Organic Product Certification Tracking for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 a PagerDuty incident by ID.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Lookup"
  description: "Retrieves a PagerDuty incident by ID."
  tags:
    - itsm
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: pagerduty_incident_lookup
          description: "Retrieves a PagerDuty incident by ID."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-pagerduty
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Retrieves current store headcount by department and cost center from ADP for workforce planning and payroll reporting.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Retrieves current store headcount by department and cost center from ADP for workforce planning and payroll reporting."
  tags:
    - hr
    - payroll
    - reporting
    - adp
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-store-headcount
          description: "Returns a list of active store associates grouped by store number and department with employment type. Use for payroll planning and labor cost analysis."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number to retrieve headcount for. Leave blank to retrieve all stores."
          call: "adp.get-workers"
          with:
            costCenter: "{{store_number}}"
          outputParameters:
            - name: workers
              type: array
              mapping: "$.workers"
            - name: total_count
              type: number
              mapping: "$.totalCount"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: workers
          path: "/hr/v2/workers"
          inputParameters:
            - name: costCenter
              in: query
          operations:
            - name: get-workers
              method: GET

Coordinates a point-of-sale system upgrade across stores by creating change requests in ServiceNow, scheduling maintenance windows, and notifying store managers via Teams.

naftiko: "0.5"
info:
  label: "POS System Upgrade Coordination"
  description: "Coordinates a point-of-sale system upgrade across stores by creating change requests in ServiceNow, scheduling maintenance windows, and notifying store managers via Teams."
  tags:
    - itsm
    - pos-systems
    - servicenow
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: pos-upgrades
      port: 8080
      tools:
        - name: schedule-pos-upgrade
          description: "Given a store number, upgrade version, and maintenance window, create a ServiceNow change request for the POS upgrade and notify the store manager of the scheduled downtime via Teams."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number scheduled for POS upgrade."
            - name: upgrade_version
              in: body
              type: string
              description: "The POS software version being deployed."
            - name: maintenance_window_start
              in: body
              type: string
              description: "Start of the maintenance window in ISO 8601 format."
            - name: maintenance_window_end
              in: body
              type: string
              description: "End of the maintenance window in ISO 8601 format."
            - name: store_manager_upn
              in: body
              type: string
              description: "UPN of the store manager to notify."
          steps:
            - name: create-change-request
              type: call
              call: "servicenow-pos.create-change"
              with:
                short_description: "POS upgrade v{{upgrade_version}} at Store {{store_number}}"
                category: "software_upgrade"
                start_date: "{{maintenance_window_start}}"
                end_date: "{{maintenance_window_end}}"
                assignment_group: "Store_IT"
            - name: notify-store-manager
              type: call
              call: "msteams-pos.send-message"
              with:
                recipient_upn: "{{store_manager_upn}}"
                text: "POS system upgrade scheduled for Store {{store_number}}: {{maintenance_window_start}} to {{maintenance_window_end}}. Version: {{upgrade_version}}. Change request: {{create-change-request.number}}. POS systems will be unavailable during this window."
  consumes:
    - type: http
      namespace: servicenow-pos
      baseUri: "https://traderjoes.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-pos
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks the export status of a Power BI report for store analytics distribution.

naftiko: "0.5"
info:
  label: "Power BI Report Status Check"
  description: "Checks the export status of a Power BI report for store analytics distribution."
  tags:
    - analytics
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: get-export-status
          description: "Check Power BI report export status."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The workspace ID."
            - name: report_id
              in: body
              type: string
              description: "The report ID."
            - name: export_id
              in: body
              type: string
              description: "The export ID."
          call: "powerbi.get-export"
          with:
            group_id: "{{group_id}}"
            report_id: "{{report_id}}"
            export_id: "{{export_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: exports
          path: "/groups/{{group_id}}/reports/{{report_id}}/exports/{{export_id}}"
          inputParameters:
            - name: group_id
              in: path
            - name: report_id
              in: path
            - name: export_id
              in: path
          operations:
            - name: get-export
              method: GET

Tracks private label product development milestones in Jira, validates supplier readiness in SAP, and notifies the product team.

naftiko: "0.5"
info:
  label: "Private Label Product Development Tracking"
  description: "Tracks private label product development milestones in Jira, validates supplier readiness in SAP, and notifies the product team."
  tags:
    - product-development
    - jira
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: private_label_product_development_tracking
          description: "Tracks private label product development milestones in Jira, validates supplier readiness in SAP, and notifies the product 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: "Private Label Product Development Tracking: {{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: "Private Label Product Development Tracking for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 product recall is issued, creates a high-priority ServiceNow incident, notifies all store managers via Teams, and logs the event in SAP for compliance tracking.

naftiko: "0.5"
info:
  label: "Product Recall Response Coordination"
  description: "When a product recall is issued, creates a high-priority ServiceNow incident, notifies all store managers via Teams, and logs the event in SAP for compliance tracking."
  tags:
    - operations
    - compliance
    - product-recall
    - servicenow
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-safety
      port: 8080
      tools:
        - name: handle-product-recall
          description: "Given a product UPC, recall reason, and severity, create a critical ServiceNow incident for all stores, log the recall in SAP, and broadcast notification to all store managers via Teams."
          inputParameters:
            - name: product_upc
              in: body
              type: string
              description: "The UPC code of the recalled product."
            - name: recall_reason
              in: body
              type: string
              description: "The reason for the recall (e.g., contamination, labeling error, allergen mislabeling)."
            - name: severity
              in: body
              type: string
              description: "Recall severity: Class I (serious health hazard), Class II (remote health hazard), Class III (no health hazard)."
            - name: supplier_name
              in: body
              type: string
              description: "Name of the supplier issuing the recall."
          steps:
            - name: create-recall-incident
              type: call
              call: "servicenow-recall.create-incident"
              with:
                short_description: "PRODUCT RECALL: UPC {{product_upc}} - {{supplier_name}} - {{severity}}"
                category: "food_safety"
                priority: "1"
                description: "Reason: {{recall_reason}}"
            - name: log-sap-event
              type: call
              call: "sap-recall.create-quality-notification"
              with:
                upc: "{{product_upc}}"
                defect_description: "{{recall_reason}}"
                vendor_name: "{{supplier_name}}"
            - name: broadcast-teams
              type: call
              call: "msteams-recall.post-channel-message"
              with:
                channel_id: "all-store-managers"
                text: "URGENT PRODUCT RECALL: UPC {{product_upc}} ({{supplier_name}}) - {{severity}}. Reason: {{recall_reason}}. Remove from shelves immediately. Incident: {{create-recall-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow-recall
      baseUri: "https://traderjoes.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: sap-recall
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quality-notifications
          path: "/A_QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: msteams-recall
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Looks up a SAP purchase order by PO number and returns vendor, status, and line item details for procurement verification.

naftiko: "0.5"
info:
  label: "Purchase Order Lookup"
  description: "Looks up a SAP purchase order by PO number and returns vendor, status, and line item details for procurement verification."
  tags:
    - finance
    - procurement
    - sap
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, and open line items. Use for procurement approvals and receiving verification."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., 4500012345)."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Analyzes refrigeration telemetry from Snowflake, predicts failures, and creates SAP maintenance notifications.

naftiko: "0.5"
info:
  label: "Refrigeration System Predictive Maintenance"
  description: "Analyzes refrigeration telemetry from Snowflake, predicts failures, and creates SAP maintenance notifications."
  tags:
    - facilities
    - refrigeration
    - snowflake
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: refrigeration_system_predictive_maintenance
          description: "Analyzes refrigeration telemetry from Snowflake, predicts failures, and creates SAP maintenance notifications."
          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: "Refrigeration System Predictive Maintenance: {{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: "Refrigeration System Predictive Maintenance for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 status and terms of a supplier contract in SAP Ariba.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Status Lookup"
  description: "Retrieves the status and terms of a supplier contract in SAP Ariba."
  tags:
    - procurement
    - sap-ariba
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-contract-status
          description: "Look up an Ariba contract by ID."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The contract ID."
          call: "ariba.get-contract"
          with:
            contract_id: "{{contract_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/contract-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET

Qualifies new food suppliers in SAP Ariba, runs food safety checks, and notifies the sourcing team.

naftiko: "0.5"
info:
  label: "SAP Ariba New Supplier Qualification"
  description: "Qualifies new food suppliers in SAP Ariba, runs food safety checks, and notifies the sourcing team."
  tags:
    - procurement
    - food-safety
    - sap-ariba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: sap_ariba_new_supplier_qualification
          description: "Qualifies new food suppliers in SAP Ariba, runs food safety checks, and notifies the sourcing 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: "SAP Ariba New Supplier Qualification: {{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 Ariba New Supplier Qualification for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 SAP cost center details.

naftiko: "0.5"
info:
  label: "SAP Cost Center Lookup"
  description: "Retrieves SAP cost center details."
  tags:
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: sap_cost_center_lookup
          description: "Retrieves SAP cost center details."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-sap
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Retrieves general ledger account balance from SAP by company code and GL account.

naftiko: "0.5"
info:
  label: "SAP GL Account Balance Lookup"
  description: "Retrieves general ledger account balance from SAP by company code and GL account."
  tags:
    - finance
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-finance
      port: 8080
      tools:
        - name: get-gl-balance
          description: "Look up GL account balance in SAP."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: gl_account
              in: body
              type: string
              description: "The GL account number."
          call: "sap.get-gl-balance"
          with:
            company_code: "{{company_code}}"
            gl_account: "{{gl_account}}"
          outputParameters:
            - name: net_balance
              type: string
              mapping: "$.d.Balance"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountBalance(CompanyCode='{{company_code}}',GLAccount='{{gl_account}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: gl_account
              in: path
          operations:
            - name: get-gl-balance
              method: GET

Compares intercompany balances across SAP company codes and creates a ServiceNow task for discrepancies.

naftiko: "0.5"
info:
  label: "SAP Intercompany Reconciliation"
  description: "Compares intercompany balances across SAP company codes and creates a ServiceNow task for discrepancies."
  tags:
    - finance
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance-recon
      port: 8080
      tools:
        - name: reconcile-intercompany
          description: "Given two company codes, compare balances and create task."
          inputParameters:
            - name: company_code_a
              in: body
              type: string
              description: "First company code."
            - name: company_code_b
              in: body
              type: string
              description: "Second company code."
          steps:
            - name: get-balance-a
              type: call
              call: "sap.get-ic-balance"
              with:
                company_code: "{{company_code_a}}"
                partner: "{{company_code_b}}"
            - name: get-balance-b
              type: call
              call: "sap.get-ic-balance"
              with:
                company_code: "{{company_code_b}}"
                partner: "{{company_code_a}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "IC reconciliation: {{company_code_a}} vs {{company_code_b}}"
                assignment_group: "Finance_IC"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: balances
          path: "/A_GLAccountBalance"
          operations:
            - name: get-ic-balance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When inventory shrink exceeds threshold at a store, pulls data from SAP, creates a Snowflake audit log, and creates a ServiceNow investigation task.

naftiko: "0.5"
info:
  label: "SAP Inventory Shrink Investigation"
  description: "When inventory shrink exceeds threshold at a store, pulls data from SAP, creates a Snowflake audit log, and creates a ServiceNow investigation task."
  tags:
    - loss-prevention
    - sap
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: loss-prevention
      port: 8080
      tools:
        - name: investigate-shrink
          description: "Given a store and material with high shrink, investigate and log."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store ID."
            - name: material_number
              in: body
              type: string
              description: "The material number."
            - name: shrink_amount
              in: body
              type: string
              description: "The shrink dollar amount."
          steps:
            - name: get-material
              type: call
              call: "sap.get-material"
              with:
                material_number: "{{material_number}}"
            - name: log-shrink
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO RETAIL_DB.PUBLIC.SHRINK_LOG (store_id, material, amount, logged_at) VALUES ('{{store_id}}', '{{material_number}}', '{{shrink_amount}}', CURRENT_TIMESTAMP())"
            - name: create-investigation
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Shrink investigation: {{get-material.description}} at store {{store_id}} — ${{shrink_amount}}"
                assignment_group: "Loss_Prevention"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Retrieves product material master data from SAP by material number, returning description, unit of measure, and stock levels.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves product material master data from SAP by material number, returning description, unit of measure, and stock levels."
  tags:
    - supply-chain
    - sap
capability:
  exposes:
    - type: mcp
      namespace: erp-materials
      port: 8080
      tools:
        - name: get-material
          description: "Look up a SAP material master record by number. Returns description and stock."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: "sap.get-material"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: unrestricted_stock
              type: string
              mapping: "$.d.UnrestrictedStock"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Runs SAP trial balance checks, creates a ServiceNow period close task, and posts status to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Period Close Checklist Workflow"
  description: "Runs SAP trial balance checks, creates a ServiceNow period close task, and posts status to the finance Teams channel."
  tags:
    - finance
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: run-period-close
          description: "Given a company code and period, run close procedures."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period."
          steps:
            - name: get-balance
              type: call
              call: "sap.get-trial-balance"
              with:
                company_code: "{{company_code}}"
                period: "{{fiscal_period}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Period close: {{company_code}} — {{fiscal_period}}"
                assignment_group: "Finance_Close"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_finance_channel"
                text: "Period close: {{company_code}} {{fiscal_period}} | Variance: {{get-balance.variance}} | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: balances
          path: "/A_GLAccountBalance"
          operations:
            - name: get-trial-balance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/finance/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a maintenance order from SAP for store equipment tracking.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Order Lookup"
  description: "Retrieves a maintenance order from SAP for store equipment tracking."
  tags:
    - operations
    - sap
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: store-maintenance
      port: 8080
      tools:
        - name: get-maintenance-order
          description: "Look up a SAP maintenance order for store equipment."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The maintenance order number."
          call: "sap.get-pm-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-pm-order
              method: GET

Reconciles vendor payments between SAP and Snowflake, identifies discrepancies, and notifies AP team.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Reconciliation"
  description: "Reconciles vendor payments between SAP and Snowflake, identifies discrepancies, and notifies AP team."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: sap_vendor_payment_reconciliation
          description: "Reconciles vendor payments between SAP and Snowflake, identifies discrepancies, and notifies AP 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: "SAP Vendor Payment Reconciliation: {{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 Vendor Payment Reconciliation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 vendor invoice payment status in SAP, returning payment date and amount.

naftiko: "0.5"
info:
  label: "SAP Vendor Payment Status Check"
  description: "Checks vendor invoice payment status in SAP, returning payment date and amount."
  tags:
    - finance
    - sap
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: erp-ap
      port: 8080
      tools:
        - name: get-payment-status
          description: "Check vendor payment status in SAP."
          inputParameters:
            - name: invoice_reference
              in: body
              type: string
              description: "The invoice reference."
            - name: company_code
              in: body
              type: string
              description: "The company code."
          call: "sap.get-payment"
          with:
            invoice_reference: "{{invoice_reference}}"
            company_code: "{{company_code}}"
          outputParameters:
            - name: payment_date
              type: string
              mapping: "$.d.ClearingDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice(SupplierInvoice='{{invoice_reference}}',CompanyCode='{{company_code}}')"
          inputParameters:
            - name: invoice_reference
              in: path
            - name: company_code
              in: path
          operations:
            - name: get-payment
              method: GET

Retrieves warehouse stock levels from SAP.

naftiko: "0.5"
info:
  label: "SAP Warehouse Stock Overview"
  description: "Retrieves warehouse stock levels from SAP."
  tags:
    - supply-chain
    - sap
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: sap_warehouse_stock_overview
          description: "Retrieves warehouse stock levels from SAP."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-sap
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Launches a seasonal hiring campaign by posting positions in Workday, tracking applicant volume, and notifying store managers of open requisitions via Teams.

naftiko: "0.5"
info:
  label: "Seasonal Hiring Campaign Launch"
  description: "Launches a seasonal hiring campaign by posting positions in Workday, tracking applicant volume, and notifying store managers of open requisitions via Teams."
  tags:
    - hr
    - recruiting
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: launch-seasonal-hiring
          description: "Given a store number, number of positions, and hiring season, create job requisitions in Workday for each position and notify the store manager via Teams with the posting links."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number that needs seasonal hires."
            - name: position_count
              in: body
              type: integer
              description: "Number of seasonal positions to open."
            - name: season
              in: body
              type: string
              description: "Hiring season (e.g., Summer 2026, Holiday 2026)."
            - name: store_manager_upn
              in: body
              type: string
              description: "UPN of the store manager to notify."
          steps:
            - name: create-requisition
              type: call
              call: "workday-recruiting.create-job-requisition"
              with:
                location: "Store_{{store_number}}"
                job_title: "Store Associate - Seasonal"
                headcount: "{{position_count}}"
                hiring_reason: "{{season}} Seasonal Hiring"
            - name: notify-store-manager
              type: call
              call: "msteams-recruiting.send-message"
              with:
                recipient_upn: "{{store_manager_upn}}"
                text: "{{season}} hiring campaign launched for Store {{store_number}}: {{position_count}} positions posted. Requisition ID: {{create-requisition.requisition_id}}. Applications will begin routing to you for review."
  consumes:
    - type: http
      namespace: workday-recruiting
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/jobRequisitions"
          operations:
            - name: create-job-requisition
              method: POST
    - type: http
      namespace: msteams-recruiting
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new seasonal product is approved, creates SAP material master, generates store allocation plan in Snowflake, and notifies regional managers on Teams.

naftiko: "0.5"
info:
  label: "Seasonal Product Launch Coordination"
  description: "When a new seasonal product is approved, creates SAP material master, generates store allocation plan in Snowflake, and notifies regional managers on Teams."
  tags:
    - product-management
    - retail
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: product-ops
      port: 8080
      tools:
        - name: launch-seasonal-product
          description: "Given product details, create SAP material, plan allocation, and notify."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "The new product name."
            - name: category
              in: body
              type: string
              description: "The product category."
            - name: launch_date
              in: body
              type: string
              description: "The launch date."
          steps:
            - name: create-material
              type: call
              call: "sap.create-material"
              with:
                description: "{{product_name}}"
                category: "{{category}}"
            - name: generate-allocation
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO RETAIL_DB.PUBLIC.ALLOCATION_PLAN (material_number, launch_date, status) VALUES ('{{create-material.material_number}}', '{{launch_date}}', 'PLANNED')"
            - name: notify-regional
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_regional_channel"
                text: "New seasonal product: {{product_name}} | Material: {{create-material.material_number}} | Launch: {{launch_date}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material"
          operations:
            - name: create-material
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/regional/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the current status and assigned group of a ServiceNow incident by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current status and assigned group of a ServiceNow incident by number."
  tags:
    - itsm
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-status
          description: "Look up a ServiceNow incident by number."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The incident number."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

When a ServiceNow ticket approaches SLA breach, escalates priority and notifies management on Teams.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "When a ServiceNow ticket approaches SLA breach, escalates priority and notifies management on Teams."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm-sla
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given an incident near SLA breach, escalate and notify."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The incident number."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: escalate
              type: call
              call: "servicenow.update-incident"
              with:
                incident_number: "{{incident_number}}"
                urgency: "1"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_it_channel"
                text: "SLA breach warning: {{incident_number}} — {{get-incident.short_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET
            - name: update-incident
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/it/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves metadata for a SharePoint document including title, author, and modification date.

naftiko: "0.5"
info:
  label: "SharePoint Document Metadata Lookup"
  description: "Retrieves metadata for a SharePoint document including title, author, and modification date."
  tags:
    - document-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-mgmt
      port: 8080
      tools:
        - name: get-document-metadata
          description: "Retrieve SharePoint document metadata by site and item ID."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: item_id
              in: body
              type: string
              description: "The document item ID."
          call: "sharepoint.get-item"
          with:
            site_id: "{{site_id}}"
            item_id: "{{item_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.name"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: items
          path: "/sites/{{site_id}}/drive/items/{{item_id}}"
          inputParameters:
            - name: site_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-item
              method: GET

When a store operations policy is updated in SharePoint, sends notifications and creates an acknowledgment task.

naftiko: "0.5"
info:
  label: "SharePoint Policy Update Notification"
  description: "When a store operations policy is updated in SharePoint, sends notifications and creates an acknowledgment task."
  tags:
    - compliance
    - sharepoint
    - microsoft-outlook
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: policy-mgmt
      port: 8080
      tools:
        - name: notify-policy-update
          description: "Given a policy document update, notify and track acknowledgment."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "SharePoint site ID."
            - name: document_id
              in: body
              type: string
              description: "The document ID."
            - name: distribution_group
              in: body
              type: string
              description: "Email distribution group."
          steps:
            - name: get-doc
              type: call
              call: "sharepoint.get-item"
              with:
                site_id: "{{site_id}}"
                item_id: "{{document_id}}"
            - name: send-notification
              type: call
              call: "msgraph.send-mail"
              with:
                recipient: "{{distribution_group}}"
                subject: "Policy Updated: {{get-doc.title}}"
                body: "Please review the updated policy."
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Policy acknowledgment: {{get-doc.title}}"
                assignment_group: "Compliance"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: items
          path: "/sites/{{site_id}}/drive/items/{{item_id}}"
          inputParameters:
            - name: site_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-item
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/$secrets.service_account_upn/sendMail"
          operations:
            - name: send-mail
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When inventory shrink thresholds are exceeded in SAP, creates a loss prevention incident in ServiceNow and escalates to the regional loss prevention manager via Teams.

naftiko: "0.5"
info:
  label: "Shrink and Loss Prevention Alert"
  description: "When inventory shrink thresholds are exceeded in SAP, creates a loss prevention incident in ServiceNow and escalates to the regional loss prevention manager via Teams."
  tags:
    - operations
    - loss-prevention
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: loss-prevention
      port: 8080
      tools:
        - name: handle-shrink-alert
          description: "Given a store number and shrink percentage exceeding policy thresholds, look up inventory details in SAP, open a loss prevention incident in ServiceNow, and notify the regional LP manager via Teams."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "Store number where shrink threshold was exceeded."
            - name: shrink_percentage
              in: body
              type: number
              description: "Actual shrink percentage detected."
            - name: threshold_percentage
              in: body
              type: number
              description: "Acceptable shrink threshold percentage."
            - name: lp_manager_upn
              in: body
              type: string
              description: "UPN of the regional loss prevention manager."
          steps:
            - name: get-inventory-summary
              type: call
              call: "sap-lp.get-inventory-summary"
              with:
                plant: "{{store_number}}"
            - name: create-lp-incident
              type: call
              call: "servicenow-lp.create-incident"
              with:
                short_description: "Shrink alert: Store {{store_number}} at {{shrink_percentage}}% (threshold: {{threshold_percentage}}%)"
                category: "loss_prevention"
                priority: "2"
            - name: notify-lp-manager
              type: call
              call: "msteams-lp.send-message"
              with:
                recipient_upn: "{{lp_manager_upn}}"
                text: "Shrink alert: Store {{store_number}} shrink rate {{shrink_percentage}}% exceeds {{threshold_percentage}}% threshold. LP incident: {{create-lp-incident.number}}. Please initiate investigation."
  consumes:
    - type: http
      namespace: sap-lp
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inventory-summary
          path: "/A_MatlStkInAcctMod"
          inputParameters:
            - name: plant
              in: query
          operations:
            - name: get-inventory-summary
              method: GET
    - type: http
      namespace: servicenow-lp
      baseUri: "https://traderjoes.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-lp
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for customer basket composition metrics.

naftiko: "0.5"
info:
  label: "Snowflake Customer Basket Analysis"
  description: "Queries Snowflake for customer basket composition metrics."
  tags:
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: snowflake_customer_basket_analysis
          description: "Queries Snowflake for customer basket composition metrics."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-snowflake
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

When a Snowflake ETL pipeline fails, queries error log, creates a ServiceNow task, and notifies the data team on Teams.

naftiko: "0.5"
info:
  label: "Snowflake ETL Failure Remediation"
  description: "When a Snowflake ETL pipeline fails, queries error log, creates a ServiceNow task, and notifies the data team on Teams."
  tags:
    - data
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-etl-failure
          description: "Given a failed task, query errors and create remediation task."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "The Snowflake task name."
          steps:
            - name: get-error
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT * FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}')) ORDER BY SCHEDULED_TIME DESC LIMIT 1"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "ETL failure: {{task_name}}"
                description: "Error: {{get-error.error_message}}"
                assignment_group: "Data_Engineering"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_data_channel"
                text: "ETL Failure: {{task_name}} | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/data/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries daily store sales data from Snowflake for a specific store and date range.

naftiko: "0.5"
info:
  label: "Snowflake Store Sales Query"
  description: "Queries daily store sales data from Snowflake for a specific store and date range."
  tags:
    - analytics
    - snowflake
    - retail
capability:
  exposes:
    - type: mcp
      namespace: retail-analytics
      port: 8080
      tools:
        - name: get-store-sales
          description: "Query store sales from Snowflake for a store and date range."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store identifier."
            - name: date_from
              in: body
              type: string
              description: "Start date (YYYY-MM-DD)."
            - name: date_to
              in: body
              type: string
              description: "End date (YYYY-MM-DD)."
          call: "snowflake.execute-query"
          with:
            statement: "SELECT SUM(total_sales) as total, COUNT(DISTINCT transaction_id) as transactions FROM RETAIL_DB.PUBLIC.SALES WHERE store_id='{{store_id}}' AND sale_date BETWEEN '{{date_from}}' AND '{{date_to}}'"
          outputParameters:
            - name: total_sales
              type: string
              mapping: "$.data[0].total"
            - name: transaction_count
              type: string
              mapping: "$.data[0].transactions"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Searches Splunk logs for store system troubleshooting.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk logs for store system troubleshooting."
  tags:
    - observability
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: splunk_log_search
          description: "Searches Splunk logs for store system troubleshooting."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-splunk
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Validates allergen labeling compliance in Snowflake product data, creates Jira issues, and notifies quality.

naftiko: "0.5"
info:
  label: "Store Allergen Labeling Compliance Check"
  description: "Validates allergen labeling compliance in Snowflake product data, creates Jira issues, and notifies quality."
  tags:
    - compliance
    - food-safety
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: store_allergen_labeling_compliance_check
          description: "Validates allergen labeling compliance in Snowflake product data, creates Jira issues, and notifies quality."
          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: "Store Allergen Labeling Compliance Check: {{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: "Store Allergen Labeling Compliance Check for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 store associate separates from Trader Joe's, terminates their Workday record, closes access via ServiceNow, and notifies the store manager in Teams.

naftiko: "0.5"
info:
  label: "Store Associate Offboarding"
  description: "When a store associate separates from Trader Joe's, terminates their Workday record, closes access via ServiceNow, and notifies the store manager in Teams."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-associate-offboarding
          description: "Given an employee ID and separation date, initiate offboarding in Workday, open an access revocation ticket in ServiceNow, and notify the store manager via Teams."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the departing associate."
            - name: separation_date
              in: body
              type: string
              description: "The last day of employment in YYYY-MM-DD format."
            - name: separation_reason
              in: body
              type: string
              description: "Reason for separation (e.g., resignation, termination, retirement)."
          steps:
            - name: get-employee
              type: call
              call: "workday-lookup.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: terminate-worker
              type: call
              call: "workday-lookup.terminate-worker"
              with:
                worker_id: "{{employee_id}}"
                effective_date: "{{separation_date}}"
                reason: "{{separation_reason}}"
            - name: open-access-ticket
              type: call
              call: "servicenow-off.create-incident"
              with:
                short_description: "Access revocation: {{get-employee.full_name}} - separation {{separation_date}}"
                category: "access_management"
                priority: "2"
            - name: notify-manager
              type: call
              call: "msteams-off.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Associate {{get-employee.full_name}} separates on {{separation_date}}. Access revocation ticket: {{open-access-ticket.number}}"
  consumes:
    - type: http
      namespace: workday-lookup
      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
            - name: terminate-worker
              method: POST
    - type: http
      namespace: servicenow-off
      baseUri: "https://traderjoes.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-off
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for store energy consumption data, compares against regional benchmarks, and posts the report to the sustainability team.

naftiko: "0.5"
info:
  label: "Store Energy Consumption Report"
  description: "Queries Snowflake for store energy consumption data, compares against regional benchmarks, and posts the report to the sustainability team."
  tags:
    - sustainability
    - energy
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sustainability
      port: 8080
      tools:
        - name: generate-energy-report
          description: "Given a store and period, generate the energy consumption report."
          inputParameters:
            - name: store_id
              type: string
              description: "Store identifier."
            - name: period
              type: string
              description: "Reporting period."
          steps:
            - name: get-consumption
              type: call
              call: snowflake.query-energy
              with:
                store_id: "{{store_id}}"
                period: "{{period}}"
            - name: get-benchmarks
              type: call
              call: snowflake.query-benchmarks
              with:
                period: "{{period}}"
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "$secrets.teams_sustainability_channel"
                text: "Energy report Store {{store_id}} ({{period}}): Consumption: {{get-consumption.total_kwh}} kWh | Benchmark: {{get-benchmarks.avg_kwh}} kWh | Variance: {{get-consumption.variance_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: query-energy
              method: POST
            - name: query-benchmarks
              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/sustainability/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When store equipment (refrigeration, HVAC, POS hardware) requires maintenance, opens a ServiceNow maintenance ticket and dispatches a field technician via the facilities management system.

naftiko: "0.5"
info:
  label: "Store Equipment Maintenance Request"
  description: "When store equipment (refrigeration, HVAC, POS hardware) requires maintenance, opens a ServiceNow maintenance ticket and dispatches a field technician via the facilities management system."
  tags:
    - operations
    - facilities
    - servicenow
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: facilities-mgmt
      port: 8080
      tools:
        - name: request-equipment-maintenance
          description: "Given a store number, equipment type, and issue description, create a ServiceNow maintenance work order and assign it to the appropriate facilities technician team."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number where the equipment issue exists."
            - name: equipment_type
              in: body
              type: string
              description: "Type of equipment requiring maintenance (e.g., refrigeration, HVAC, POS hardware, lighting)."
            - name: issue_description
              in: body
              type: string
              description: "Description of the maintenance issue."
            - name: urgency
              in: body
              type: string
              description: "Urgency level: emergency, urgent, routine."
          call: "servicenow-facilities.create-work-order"
          with:
            short_description: "{{equipment_type}} maintenance at Store {{store_number}}: {{issue_description}}"
            category: "facilities_maintenance"
            urgency: "{{urgency}}"
            assignment_group: "Facilities_Field_Tech"
          outputParameters:
            - name: work_order_number
              type: string
              mapping: "$.result.number"
            - name: assigned_technician
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow-facilities
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST

Coordinates store grand opening by creating Jira checklist, provisioning Okta store accounts, and notifying regional ops.

naftiko: "0.5"
info:
  label: "Store Grand Opening Coordination"
  description: "Coordinates store grand opening by creating Jira checklist, provisioning Okta store accounts, and notifying regional ops."
  tags:
    - operations
    - store-opening
    - jira
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: store_grand_opening_coordination
          description: "Coordinates store grand opening by creating Jira checklist, provisioning Okta store accounts, and notifying regional ops."
          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: "Store Grand Opening Coordination: {{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: "Store Grand Opening Coordination for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

Compares SAP inventory with physical count data in Snowflake, identifies variances, and notifies store operations.

naftiko: "0.5"
info:
  label: "Store Inventory Cycle Count Reconciliation"
  description: "Compares SAP inventory with physical count data in Snowflake, identifies variances, and notifies store operations."
  tags:
    - inventory
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: store_inventory_cycle_count_reconciliation
          description: "Compares SAP inventory with physical count data in Snowflake, identifies variances, and notifies store operations."
          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: "Store Inventory Cycle Count Reconciliation: {{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: "Store Inventory Cycle Count Reconciliation for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 store IT incident is reported, creates a ServiceNow ticket with priority, assigns it to the regional IT team, and notifies the store lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Store IT Incident Response"
  description: "When a store IT incident is reported, creates a ServiceNow ticket with priority, assigns it to the regional IT team, and notifies the store lead via Microsoft Teams."
  tags:
    - itsm
    - incident-response
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: store-ops
      port: 8080
      tools:
        - name: handle-store-it-incident
          description: "Given a store number, incident description, and priority, create a ServiceNow incident, assign to the regional IT team, and notify the store lead via Teams."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number where the incident occurred."
            - name: description
              in: body
              type: string
              description: "Description of the IT issue (e.g., POS system down, network outage)."
            - name: priority
              in: body
              type: string
              description: "Incident priority: 1 (critical), 2 (high), 3 (medium), 4 (low)."
            - name: store_lead_upn
              in: body
              type: string
              description: "The store lead's Microsoft UPN (email) for Teams notification."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-incident.create-incident"
              with:
                short_description: "Store {{store_number}} IT Incident: {{description}}"
                priority: "{{priority}}"
                assignment_group: "Regional_IT"
                location: "Store_{{store_number}}"
            - name: notify-lead
              type: call
              call: "msteams-incident.send-message"
              with:
                recipient_upn: "{{store_lead_upn}}"
                text: "IT Incident opened for Store {{store_number}}: {{description}}. Ticket: {{create-incident.number}}. Priority: {{priority}}. Regional IT is assigned."
  consumes:
    - type: http
      namespace: servicenow-incident
      baseUri: "https://traderjoes.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-incident
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for sales forecasts, validates against Workday staffing levels, and posts recommendations.

naftiko: "0.5"
info:
  label: "Store Labor Scheduling Optimization"
  description: "Queries Snowflake for sales forecasts, validates against Workday staffing levels, and posts recommendations."
  tags:
    - operations
    - labor
    - snowflake
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: store_labor_scheduling_optimization
          description: "Queries Snowflake for sales forecasts, validates against Workday staffing levels, and posts recommendations."
          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: "Store Labor Scheduling 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: "Store Labor Scheduling Optimization for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 network monitoring alert fires for a store location, creates a critical ServiceNow incident, dispatches field support, and notifies the store manager and regional director via Teams.

naftiko: "0.5"
info:
  label: "Store Network Outage Alert"
  description: "When a network monitoring alert fires for a store location, creates a critical ServiceNow incident, dispatches field support, and notifies the store manager and regional director via Teams."
  tags:
    - itsm
    - network-operations
    - servicenow
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: handle-network-outage
          description: "Given a store number and network alert details, create a critical ServiceNow incident for field dispatch and notify the store manager and regional director via Teams."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number experiencing the network outage."
            - name: alert_details
              in: body
              type: string
              description: "Description of the network alert (e.g., WAN link down, POS unreachable)."
            - name: store_manager_upn
              in: body
              type: string
              description: "UPN of the store manager for Teams notification."
            - name: regional_director_upn
              in: body
              type: string
              description: "UPN of the regional director for escalation notification."
          steps:
            - name: create-incident
              type: call
              call: "servicenow-network.create-incident"
              with:
                short_description: "Network outage at Store {{store_number}}: {{alert_details}}"
                priority: "1"
                category: "network"
                assignment_group: "Network_Operations"
            - name: notify-store-manager
              type: call
              call: "msteams-network.send-message"
              with:
                recipient_upn: "{{store_manager_upn}}"
                text: "Network outage reported at Store {{store_number}}: {{alert_details}}. Incident {{create-incident.number}} opened. Network Operations is responding."
            - name: notify-regional-director
              type: call
              call: "msteams-network.send-message"
              with:
                recipient_upn: "{{regional_director_upn}}"
                text: "ESCALATION: Network outage at Store {{store_number}}. Incident {{create-incident.number}}. Operations team engaged."
  consumes:
    - type: http
      namespace: servicenow-network
      baseUri: "https://traderjoes.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-network
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a store POS system goes down, creates a P1 ServiceNow incident, notifies the IT support team on Teams, and logs the event in Snowflake.

naftiko: "0.5"
info:
  label: "Store POS Outage Escalation"
  description: "When a store POS system goes down, creates a P1 ServiceNow incident, notifies the IT support team on Teams, and logs the event in Snowflake."
  tags:
    - itsm
    - retail
    - servicenow
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: store-it
      port: 8080
      tools:
        - name: escalate-pos-outage
          description: "Given a store with POS outage, create P1 incident, notify IT, and log."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store identifier."
            - name: pos_terminal_count
              in: body
              type: string
              description: "Number of affected terminals."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "POS outage: Store {{store_id}} — {{pos_terminal_count}} terminals"
                urgency: "1"
                impact: "1"
                category: "pos_systems"
            - name: notify-it
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_it_support_channel"
                text: "POS OUTAGE: Store {{store_id}} | {{pos_terminal_count}} terminals down | Incident: {{create-incident.number}}"
            - name: log-event
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO IT_OPS.PUBLIC.POS_EVENTS (store_id, terminal_count, incident_number, event_time) VALUES ('{{store_id}}', '{{pos_terminal_count}}', '{{create-incident.number}}', CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.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/it-support/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Creates a project plan for a store remodel, tracks milestones in ServiceNow, and notifies the facilities team on Teams.

naftiko: "0.5"
info:
  label: "Store Remodel Project Tracking"
  description: "Creates a project plan for a store remodel, tracks milestones in ServiceNow, and notifies the facilities team on Teams."
  tags:
    - facilities
    - project-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: facilities
      port: 8080
      tools:
        - name: track-remodel
          description: "Given store and remodel details, create tracking and notify."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store ID."
            - name: scope
              in: body
              type: string
              description: "The remodel scope."
            - name: start_date
              in: body
              type: string
              description: "Start date."
          steps:
            - name: create-project
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Store remodel: {{store_id}} — {{scope}}"
                description: "Start: {{start_date}}. Scope: {{scope}}."
                assignment_group: "Facilities_Remodel"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_facilities_channel"
                text: "Store remodel initiated: {{store_id}} | Scope: {{scope}} | Start: {{start_date}} | Task: {{create-project.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/facilities/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls daily sales data from the point-of-sale system via SAP and publishes a store performance summary to the regional manager's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Store Sales Daily Digest"
  description: "Pulls daily sales data from the point-of-sale system via SAP and publishes a store performance summary to the regional manager's Microsoft Teams channel."
  tags:
    - finance
    - reporting
    - sap
    - microsoft-teams
    - sales-reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: digest-store-sales
          description: "Given a store number and date, retrieve daily sales totals from SAP and post a performance summary to the regional manager's Teams channel."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "The store number for the sales report."
            - name: report_date
              in: body
              type: string
              description: "The date for the sales report in YYYY-MM-DD format."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel ID where the digest should be posted."
          steps:
            - name: get-sales
              type: call
              call: "sap-sales.get-sales-summary"
              with:
                store: "{{store_number}}"
                date: "{{report_date}}"
            - name: post-digest
              type: call
              call: "msteams-sales.post-channel-message"
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Store {{store_number}} Sales - {{report_date}}: Total ${{get-sales.total_sales}}, Transactions: {{get-sales.transaction_count}}, Avg Basket: ${{get-sales.avg_basket}}"
  consumes:
    - type: http
      namespace: sap-sales
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/RETAIL_SALES_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-summary
          path: "/StoreSalesSummary"
          inputParameters:
            - name: store
              in: query
            - name: date
              in: query
          operations:
            - name: get-sales-summary
              method: GET
    - type: http
      namespace: msteams-sales
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a cold chain temperature alert is triggered at a store, creates a ServiceNow P1 incident and notifies the store operations team on Teams.

naftiko: "0.5"
info:
  label: "Store Temperature Alert Response"
  description: "When a cold chain temperature alert is triggered at a store, creates a ServiceNow P1 incident and notifies the store operations team on Teams."
  tags:
    - food-safety
    - operations
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: food-safety-ops
      port: 8080
      tools:
        - name: handle-temp-alert
          description: "Given a store and temperature alert, create incident and notify."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store identifier."
            - name: equipment_id
              in: body
              type: string
              description: "The refrigeration unit ID."
            - name: current_temp
              in: body
              type: string
              description: "Current temperature reading."
            - name: threshold
              in: body
              type: string
              description: "The threshold that was breached."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Cold chain alert: Store {{store_id}} — {{equipment_id}} at {{current_temp}}F"
                urgency: "1"
                impact: "1"
                category: "food_safety"
            - name: notify-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_store_ops_channel"
                text: "TEMP ALERT: Store {{store_id}} | Unit: {{equipment_id}} | Temp: {{current_temp}}F (threshold: {{threshold}}F) | Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.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/store-ops/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for store waste metrics, compares against targets, and posts report to sustainability team.

naftiko: "0.5"
info:
  label: "Store Waste Reduction Tracking"
  description: "Queries Snowflake for store waste metrics, compares against targets, and posts report to sustainability team."
  tags:
    - sustainability
    - waste
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: store_waste_reduction_tracking
          description: "Queries Snowflake for store waste metrics, compares against targets, and posts report to sustainability 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: "Store Waste Reduction Tracking: {{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: "Store Waste Reduction Tracking for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

Identifies SAP Ariba supplier contracts expiring within 90 days, creates a ServiceNow renewal task, and notifies the category manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Contract Renewal Alert"
  description: "Identifies SAP Ariba supplier contracts expiring within 90 days, creates a ServiceNow renewal task, and notifies the category manager via Microsoft Teams."
  tags:
    - procurement
    - contracts
    - sap-ariba
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-contracts
      port: 8080
      tools:
        - name: trigger-contract-renewal-alert
          description: "Given a supplier contract ID expiring within 90 days, create a renewal task in ServiceNow and notify the responsible category manager via Teams."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "The SAP Ariba contract ID to review for renewal."
            - name: category_manager_upn
              in: body
              type: string
              description: "UPN of the category manager responsible for this supplier contract."
          steps:
            - name: get-contract
              type: call
              call: "ariba.get-contract"
              with:
                contractId: "{{contract_id}}"
            - name: create-renewal-task
              type: call
              call: "servicenow-contract.create-task"
              with:
                short_description: "Contract renewal: {{get-contract.title}} - expires {{get-contract.expirationDate}}"
                category: "procurement"
                assignment_group: "Category_Management"
            - name: notify-manager
              type: call
              call: "msteams-contract.send-message"
              with:
                recipient_upn: "{{category_manager_upn}}"
                text: "Contract {{get-contract.title}} expires {{get-contract.expirationDate}}. Renewal task created: {{create-renewal-task.number}}. Please initiate supplier negotiations."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/contract-management/v1"
      authentication:
        type: apikey
        key: "apikey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: contracts
          path: "/contracts/{{contractId}}"
          inputParameters:
            - name: contractId
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: servicenow-contract
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams-contract
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a supplier delivery is late or short-shipped, logs the exception in SAP, creates a ServiceNow task for the buyer, and notifies the supply chain team on Teams.

naftiko: "0.5"
info:
  label: "Supplier Delivery Exception Workflow"
  description: "When a supplier delivery is late or short-shipped, logs the exception in SAP, creates a ServiceNow task for the buyer, and notifies the supply chain team on Teams."
  tags:
    - supply-chain
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: log-delivery-exception
          description: "Given a PO and exception details, log in SAP, create task, and notify."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The purchase order number."
            - name: exception_type
              in: body
              type: string
              description: "Exception type (late, short_ship, damaged)."
            - name: vendor_name
              in: body
              type: string
              description: "The vendor name."
          steps:
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Delivery exception: {{exception_type}} — PO {{po_number}} from {{vendor_name}}"
                assignment_group: "Supply_Chain_Buying"
            - name: notify-supply-chain
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_supply_chain_channel"
                text: "Delivery exception: {{exception_type}} | PO: {{po_number}} | Vendor: {{vendor_name}} | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/supply-chain/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves SAP Ariba supplier performance data for a given quarter and publishes a scorecard summary to the procurement team's Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Supplier Performance Scorecard"
  description: "Retrieves SAP Ariba supplier performance data for a given quarter and publishes a scorecard summary to the procurement team's Microsoft Teams channel."
  tags:
    - procurement
    - supplier-management
    - sap-ariba
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: supplier-performance
      port: 8080
      tools:
        - name: publish-supplier-scorecard
          description: "Given a supplier ID and quarter, retrieve performance metrics from SAP Ariba and post a supplier scorecard to the procurement Teams channel."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: quarter
              in: body
              type: string
              description: "Reporting quarter in YYYY-QN format (e.g., 2026-Q1)."
            - name: procurement_channel_id
              in: body
              type: string
              description: "Teams channel ID for the procurement team."
          steps:
            - name: get-supplier-metrics
              type: call
              call: "ariba-perf.get-supplier-performance"
              with:
                supplierId: "{{supplier_id}}"
                period: "{{quarter}}"
            - name: post-scorecard
              type: call
              call: "msteams-supplier.post-channel-message"
              with:
                channel_id: "{{procurement_channel_id}}"
                text: "Supplier Scorecard - {{get-supplier-metrics.supplier_name}} ({{quarter}}): On-time delivery: {{get-supplier-metrics.on_time_pct}}%, Quality acceptance: {{get-supplier-metrics.quality_pct}}%, Invoice accuracy: {{get-supplier-metrics.invoice_accuracy_pct}}%"
  consumes:
    - type: http
      namespace: ariba-perf
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: apikey
        key: "apikey"
        value: "$secrets.ariba_api_key"
        placement: header
      resources:
        - name: supplier-performance
          path: "/suppliers/{{supplierId}}/performance"
          inputParameters:
            - name: supplierId
              in: path
            - name: period
              in: query
          operations:
            - name: get-supplier-performance
              method: GET
    - type: http
      namespace: msteams-supplier
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls supplier delivery and quality metrics from Snowflake, generates a scorecard in SharePoint, and notifies the procurement team on Teams.

naftiko: "0.5"
info:
  label: "Supplier Scorecarding Workflow"
  description: "Pulls supplier delivery and quality metrics from Snowflake, generates a scorecard in SharePoint, and notifies the procurement team on Teams."
  tags:
    - procurement
    - supply-chain
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-performance
      port: 8080
      tools:
        - name: generate-supplier-scorecard
          description: "Given a vendor ID and period, generate and distribute scorecard."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor ID."
            - name: period
              in: body
              type: string
              description: "The evaluation period."
          steps:
            - name: get-metrics
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT on_time_rate, quality_score, fill_rate FROM SUPPLY_DB.PUBLIC.VENDOR_METRICS WHERE vendor_id='{{vendor_id}}' AND period='{{period}}'"
            - name: upload-scorecard
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "$secrets.sharepoint_procurement_site"
                folder: "Scorecards/{{period}}"
                file_name: "{{vendor_id}}_scorecard.pdf"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_procurement_channel"
                text: "Supplier scorecard: Vendor {{vendor_id}} | On-time: {{get-metrics.on_time_rate}}% | Quality: {{get-metrics.quality_score}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: uploads
          path: "/sites/{{site_id}}/drive/root:/{{folder}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/procurement/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries Snowflake for supplier sustainability metrics, generates scorecards, and posts to procurement.

naftiko: "0.5"
info:
  label: "Supplier Sustainability Scorecard"
  description: "Queries Snowflake for supplier sustainability metrics, generates scorecards, and posts to procurement."
  tags:
    - sustainability
    - procurement
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: supplier_sustainability_scorecard
          description: "Queries Snowflake for supplier sustainability metrics, generates scorecards, and posts to procurement."
          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: "Supplier Sustainability Scorecard: {{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: "Supplier Sustainability Scorecard for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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 vendor invoice is received in SAP, validates it against the purchase order, routes for approval in ServiceNow, and notifies the accounts payable team via Teams.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing"
  description: "When a vendor invoice is received in SAP, validates it against the purchase order, routes for approval in ServiceNow, and notifies the accounts payable team via Teams."
  tags:
    - finance
    - accounts-payable
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given a SAP invoice number and PO number, validate the invoice against the PO, create an approval workflow in ServiceNow, and notify the AP team lead via Teams."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP vendor invoice number."
            - name: po_number
              in: body
              type: string
              description: "The associated purchase order number for three-way match."
            - name: invoice_amount
              in: body
              type: number
              description: "Invoice amount in USD for approval threshold routing."
          steps:
            - name: get-invoice
              type: call
              call: "sap-invoice.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po
              type: call
              call: "sap-invoice.get-po"
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: "servicenow-ap.create-record"
              with:
                short_description: "Invoice approval: {{invoice_number}} against PO {{po_number}} - ${{invoice_amount}}"
                category: "accounts_payable"
                assignment_group: "AP_Team"
            - name: notify-ap-team
              type: call
              call: "msteams-ap.send-message"
              with:
                recipient_upn: "ap-team@traderjoes.com"
                text: "Invoice {{invoice_number}} pending approval. PO: {{po_number}}, Amount: ${{invoice_amount}}. Approval task: {{create-approval.number}}"
  consumes:
    - type: http
      namespace: sap-invoice
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: servicenow-ap
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/sc_task"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Validates vendor invoices against PO and goods receipt in SAP, creating a ServiceNow task when discrepancies are found.

naftiko: "0.5"
info:
  label: "Vendor Invoice Three-Way Match"
  description: "Validates vendor invoices against PO and goods receipt in SAP, creating a ServiceNow task when discrepancies are found."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: verify-invoice-match
          description: "Given an invoice and PO, verify three-way match and flag discrepancies."
          inputParameters:
            - name: invoice_reference
              in: body
              type: string
              description: "The invoice reference."
            - name: po_number
              in: body
              type: string
              description: "The purchase order number."
          steps:
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_reference: "{{invoice_reference}}"
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Invoice match review: {{invoice_reference}} vs PO {{po_number}}"
                description: "Invoice: ${{get-invoice.amount}}. PO: ${{get-po.total_value}}."
                assignment_group: "AP_Team"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://traderjoes-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_reference}}')"
          inputParameters:
            - name: invoice_reference
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: pos
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a vendor quality issue is reported, creates ServiceNow incident, notifies the quality team, and updates Snowflake tracking.

naftiko: "0.5"
info:
  label: "Vendor Quality Incident Response"
  description: "When a vendor quality issue is reported, creates ServiceNow incident, notifies the quality team, and updates Snowflake tracking."
  tags:
    - quality
    - vendor-management
    - servicenow
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: vendor_quality_incident_response
          description: "When a vendor quality issue is reported, creates ServiceNow incident, notifies the quality team, and updates Snowflake tracking."
          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: "Vendor Quality Incident 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: "Vendor Quality Incident Response for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

Generates weekly sales forecasts from Snowflake, refreshes Power BI dashboard, and distributes to regional managers.

naftiko: "0.5"
info:
  label: "Weekly Sales Forecast Distribution"
  description: "Generates weekly sales forecasts from Snowflake, refreshes Power BI dashboard, and distributes to regional managers."
  tags:
    - operations
    - forecasting
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: weekly_sales_forecast_distribution
          description: "Generates weekly sales forecasts from Snowflake, refreshes Power BI dashboard, and distributes to regional 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: "Weekly Sales Forecast Distribution: {{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: "Weekly Sales Forecast Distribution for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

Launches annual review by pulling headcount from Workday, creating Jira epic, and notifying HR.

naftiko: "0.5"
info:
  label: "Workday Annual Review Cycle Launch"
  description: "Launches annual review by pulling headcount from Workday, creating Jira epic, and notifying HR."
  tags:
    - hr
    - performance
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: workday_annual_review_cycle_launch
          description: "Launches annual review by pulling headcount from Workday, creating Jira epic, and notifying 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: "Workday Annual Review Cycle Launch: {{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 Annual Review Cycle Launch for {{entity_id}} | Action: {{create-action.number}}" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.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

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: tj-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://traderjoes.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://traderjoes.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 employee compensation from Workday.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves employee compensation from Workday."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: workday_compensation_lookup
          description: "Retrieves employee compensation from Workday."
          inputParameters:
            - name: entity_id
              type: string
              description: "Primary identifier." 
          call: primary.get-workday
          with:
            entity_id: "{{entity_id}}" 
          outputParameters:
            - name: result
              type: string
              mapping: "$.data" 
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Fetches an employee profile from Workday by worker ID, returning name, department, store location, and job title.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Fetches an employee profile from Workday by worker ID, returning name, department, store location, and job title."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Retrieve employee profile from Workday by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.fullName"
            - name: store_location
              type: string
              mapping: "$.worker.location"
  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: "/traderjoes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Queries Workday for labor hours, validates against state compliance rules in Snowflake, and creates ServiceNow alerts for violations.

naftiko: "0.5"
info:
  label: "Workday Labor Compliance Check"
  description: "Queries Workday for labor hours, validates against state compliance rules in Snowflake, and creates ServiceNow alerts for violations."
  tags:
    - hr
    - compliance
    - workday
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: labor-compliance
      port: 8080
      tools:
        - name: check-labor-compliance
          description: "Given a store and pay period, check labor compliance."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store ID."
            - name: pay_period
              in: body
              type: string
              description: "The pay period."
          steps:
            - name: get-hours
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT worker_id, SUM(hours) as total_hours FROM HR_DB.PUBLIC.TIME_RECORDS WHERE store_id='{{store_id}}' AND pay_period='{{pay_period}}' GROUP BY worker_id HAVING total_hours > 40"
            - name: create-alert
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Labor compliance: Store {{store_id}} — {{pay_period}} overtime violations"
                description: "Workers exceeding 40 hours detected."
                assignment_group: "HR_Compliance"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://traderjoes.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://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

When a new hire is confirmed, creates Okta account, provisions POS access, and notifies store management.

naftiko: "0.5"
info:
  label: "Workday New Hire IT Provisioning"
  description: "When a new hire is confirmed, creates Okta account, provisions POS access, and notifies store management."
  tags:
    - hr
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tj-ops
      port: 8080
      tools:
        - name: workday_new_hire_it_provisioning
          description: "When a new hire is confirmed, creates Okta account, provisions POS access, and notifies store management."
          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://traderjoes.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://traderjoes.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 store associate is created in Workday, assigns mandatory food safety and customer service training, creates a ServiceNow tracking task, and sends a welcome email.

naftiko: "0.5"
info:
  label: "Workday New Hire Store Training Workflow"
  description: "When a new store associate is created in Workday, assigns mandatory food safety and customer service training, creates a ServiceNow tracking task, and sends a welcome email."
  tags:
    - hr
    - training
    - workday
    - servicenow
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: hr-training
      port: 8080
      tools:
        - name: assign-store-training
          description: "Given a new hire worker ID, assign training and track completion."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: create-training-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Store training: {{get-employee.full_name}} — {{get-employee.location}}"
                assignment_group: "Store_Training"
                description: "Food safety and customer service training required. Start date: {{get-employee.start_date}}."
            - name: send-welcome
              type: call
              call: "msgraph.send-mail"
              with:
                recipient: "{{get-employee.work_email}}"
                subject: "Welcome to Trader Joe's — Your Training Schedule"
                body: "Hi {{get-employee.first_name}}, welcome to the crew! Your training at {{get-employee.location}} starts soon. Ref: {{create-training-task.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: "/traderjoes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/$secrets.service_account_upn/sendMail"
          operations:
            - name: send-mail
              method: POST

When a payroll variance is detected, pulls employee details, creates a ServiceNow task, and notifies HR on Teams.

naftiko: "0.5"
info:
  label: "Workday Payroll Discrepancy Investigation"
  description: "When a payroll variance is detected, pulls employee details, creates a ServiceNow task, and notifies HR on Teams."
  tags:
    - hr
    - payroll
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-payroll
      port: 8080
      tools:
        - name: investigate-payroll
          description: "Given a worker and pay period, investigate discrepancy."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The worker ID."
            - name: pay_period
              in: body
              type: string
              description: "The pay period."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Payroll discrepancy: {{get-employee.full_name}} — {{pay_period}}"
                assignment_group: "Payroll"
            - name: notify
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_hr_channel"
                text: "Payroll discrepancy: {{get-employee.full_name}} for {{pay_period}} | Task: {{create-task.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: "/traderjoes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/hr/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a store associate is terminated in Workday, disables their M365 account, creates a ServiceNow offboarding task, and notifies the store manager.

naftiko: "0.5"
info:
  label: "Workday Termination Access Revocation"
  description: "When a store associate is terminated in Workday, disables their M365 account, creates a ServiceNow offboarding task, and notifies the store manager."
  tags:
    - hr
    - security
    - workday
    - microsoft-365
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: revoke-access
          description: "Given a terminated worker ID, disable access and notify."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: disable-account
              type: call
              call: "msgraph.disable-user"
              with:
                user_upn: "{{get-employee.work_email}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Offboarding: {{get-employee.full_name}} at {{get-employee.location}}"
                assignment_group: "IT_Offboarding"
  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: "/traderjoes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_upn}}"
          inputParameters:
            - name: user_upn
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://traderjoes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Pulls headcount, turnover, and absenteeism metrics from Workday and ADP, then publishes a weekly workforce analytics summary to the HR leadership Teams channel.

naftiko: "0.5"
info:
  label: "Workforce Analytics Report"
  description: "Pulls headcount, turnover, and absenteeism metrics from Workday and ADP, then publishes a weekly workforce analytics summary to the HR leadership Teams channel."
  tags:
    - hr
    - analytics
    - reporting
    - workday
    - adp
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workforce-analytics
      port: 8080
      tools:
        - name: publish-workforce-report
          description: "Given a reporting week, pull headcount and turnover metrics from Workday and labor hours from ADP, then post a combined workforce analytics summary to the HR Teams channel."
          inputParameters:
            - name: week_start
              in: body
              type: string
              description: "Start date of the reporting week in YYYY-MM-DD format."
            - name: hr_channel_id
              in: body
              type: string
              description: "Teams channel ID for the HR leadership audience."
          steps:
            - name: get-headcount
              type: call
              call: "workday-analytics.get-headcount-report"
              with:
                asOfDate: "{{week_start}}"
            - name: get-labor-hours
              type: call
              call: "adp-analytics.get-workers"
              with:
                startDate: "{{week_start}}"
            - name: post-summary
              type: call
              call: "msteams-analytics.post-channel-message"
              with:
                channel_id: "{{hr_channel_id}}"
                text: "Weekly Workforce Report (w/o {{week_start}}): Active associates: {{get-headcount.total}}, New hires: {{get-headcount.new_hires}}, Separations: {{get-headcount.separations}}, Total labor hours: {{get-labor-hours.totalHours}}"
  consumes:
    - type: http
      namespace: workday-analytics
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount-report
          path: "/reports/headcount"
          inputParameters:
            - name: asOfDate
              in: query
          operations:
            - name: get-headcount-report
              method: GET
    - type: http
      namespace: adp-analytics
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: workers
          path: "/time/v2/workers/time-details"
          inputParameters:
            - name: startDate
              in: query
          operations:
            - name: get-workers
              method: GET
    - type: http
      namespace: msteams-analytics
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST