Target Capabilities

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

Sort
Expand

When ad spend exceeds budget, logs anomaly in Snowflake and alerts marketing via Slack.

naftiko: "0.5"
info:
  label: "Ad Spend Anomaly Responder"
  description: "When ad spend exceeds budget, logs anomaly in Snowflake and alerts marketing via Slack."
  tags:
    - marketing
    - snowflake
    - slack
    - advertising
capability:
  exposes:
    - type: mcp
      namespace: ad-ops
      port: 8080
      tools:
        - name: handle-spend-anomaly
          description: "Given a campaign ID and spend, log anomaly and notify marketing."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Campaign ID."
            - name: current_spend
              in: body
              type: string
              description: "Current spend."
            - name: budget_limit
              in: body
              type: string
              description: "Budget limit."
          steps:
            - name: log-anomaly
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO MARKETING.SPEND_ANOMALIES (campaign_id, current_spend, budget_limit, detected_at) VALUES ('{{campaign_id}}', {{current_spend}}, {{budget_limit}}, CURRENT_TIMESTAMP())"
            - name: alert
              type: call
              call: slack.post-message
              with:
                channel: "marketing-alerts"
                text: "Ad spend anomaly: Campaign {{campaign_id}} at ${{current_spend}} (budget: ${{budget_limit}})."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves A/B test performance data from Adobe Analytics for Target.com digital experiments and posts a results summary to the digital product Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Adobe Analytics A/B Test Results Digest"
  description: "Retrieves A/B test performance data from Adobe Analytics for Target.com digital experiments and posts a results summary to the digital product Microsoft Teams channel."
  tags:
    - marketing
    - adobe-analytics
    - microsoft-teams
    - ab-testing
    - digital
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: experimentation
      port: 8080
      tools:
        - name: digest-ab-test-results
          description: "Given an Adobe Analytics report suite and test segment IDs, fetch conversion metrics for A/B test variants and post a winner summary to the digital product Microsoft Teams channel. Use at experiment conclusion or weekly experiment review."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID containing test data."
            - name: test_name
              in: body
              type: string
              description: "Name of the A/B test to report on."
            - name: start_date
              in: body
              type: string
              description: "Test start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Test end date in YYYY-MM-DD format."
          steps:
            - name: get-test-metrics
              type: call
              call: adobe-ab.run-report
              with:
                report_suite_id: "{{report_suite_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-results
              type: call
              call: msteams-product.send-channel-message
              with:
                team_id: "$secrets.msteams_product_team_id"
                channel_id: "$secrets.msteams_product_channel_id"
                content: "A/B test results: {{test_name}} | Period: {{start_date}} to {{end_date}} | Metrics retrieved from Adobe Analytics. Review full breakdown for statistical significance."
  consumes:
    - type: http
      namespace: adobe-ab
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_access_token"
      resources:
        - name: reports
          path: "/{{report_suite_id}}/reports"
          inputParameters:
            - name: report_suite_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: msteams-product
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves Adobe Analytics data for a digital marketing campaign, summarizes click-through and conversion metrics, and posts the campaign report to the marketing Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Adobe Analytics Retail Campaign Performance Report"
  description: "Retrieves Adobe Analytics data for a digital marketing campaign, summarizes click-through and conversion metrics, and posts the campaign report to the marketing Microsoft Teams channel."
  tags:
    - marketing
    - adobe-analytics
    - microsoft-teams
    - reporting
    - digital-marketing
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given an Adobe Analytics report suite ID and date range, fetch campaign performance metrics (visits, conversions, revenue) and post a summary to the Microsoft Teams marketing channel. Use for weekly digital campaign reviews."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID to query."
            - name: start_date
              in: body
              type: string
              description: "Campaign reporting start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Campaign reporting end date in YYYY-MM-DD format."
          steps:
            - name: get-campaign-metrics
              type: call
              call: adobe-analytics.run-report
              with:
                report_suite_id: "{{report_suite_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-campaign-report
              type: call
              call: msteams-marketing.send-channel-message
              with:
                team_id: "$secrets.msteams_marketing_team_id"
                channel_id: "$secrets.msteams_marketing_channel_id"
                content: "Campaign performance {{start_date}} to {{end_date}} for suite {{report_suite_id}}: Metrics retrieved. Review full breakdown in Adobe Analytics."
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_access_token"
      resources:
        - name: reports
          path: "/{{report_suite_id}}/reports"
          inputParameters:
            - name: report_suite_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: msteams-marketing
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves an Adobe Analytics segment definition by ID.

naftiko: "0.5"
info:
  label: "Adobe Analytics Segment Lookup"
  description: "Retrieves an Adobe Analytics segment definition by ID."
  tags:
    - marketing
    - adobe-analytics
    - segmentation
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: get-segment
          description: "Given an Adobe Analytics segment ID, return its name and definition. Use for marketing campaign audience reviews."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "Adobe Analytics segment ID."
          call: adobe-analytics.get-segment
          with:
            segment_id: "{{segment_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: definition
              type: object
              mapping: "$.definition"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api/target"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: segments
          path: "/segments/{{segment_id}}"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: get-segment
              method: GET

When Adobe Analytics detects a traffic drop, queries Snowflake for correlated data, creates a Jira ticket, and alerts the digital team via Slack.

naftiko: "0.5"
info:
  label: "Adobe Analytics Traffic Drop Investigation"
  description: "When Adobe Analytics detects a traffic drop, queries Snowflake for correlated data, creates a Jira ticket, and alerts the digital team via Slack."
  tags:
    - analytics
    - adobe-analytics
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: digital-ops
      port: 8080
      tools:
        - name: investigate-traffic-drop
          description: "Given a report suite and date, investigate traffic drop and alert digital team."
          inputParameters:
            - name: report_suite
              in: body
              type: string
              description: "Report suite ID."
            - name: drop_date
              in: body
              type: string
              description: "Date YYYY-MM-DD."
            - name: drop_percentage
              in: body
              type: string
              description: "Percentage drop."
          steps:
            - name: query-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT channel, SUM(sessions) as sessions FROM DIGITAL.WEB_ANALYTICS WHERE report_date = '{{drop_date}}' GROUP BY channel ORDER BY sessions DESC"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DIGITAL
                issue_type: Task
                summary: "Traffic drop: {{drop_percentage}}% on {{drop_date}}"
            - name: alert
              type: call
              call: slack.post-message
              with:
                channel: "digital-alerts"
                text: "Traffic drop {{drop_percentage}}% on {{drop_date}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches recent guest reviews from Snowflake, uses Anthropic Claude to generate a sentiment summary, and posts insights to the guest experience Slack channel.

naftiko: "0.5"
info:
  label: "Anthropic AI Guest Review Summarizer"
  description: "Fetches recent guest reviews from Snowflake, uses Anthropic Claude to generate a sentiment summary, and posts insights to the guest experience Slack channel."
  tags:
    - ai
    - anthropic
    - snowflake
    - slack
    - guest-experience
capability:
  exposes:
    - type: mcp
      namespace: guest-insights
      port: 8080
      tools:
        - name: summarize-reviews
          description: "Given a store number and date range, fetch reviews, generate AI summary, and post insights. Use for weekly guest satisfaction reviews."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "Store number."
            - name: start_date
              in: body
              type: string
              description: "Start date YYYY-MM-DD."
            - name: end_date
              in: body
              type: string
              description: "End date YYYY-MM-DD."
          steps:
            - name: get-reviews
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT review_text, rating FROM GUEST.REVIEWS WHERE store_number = '{{store_number}}' AND review_date BETWEEN '{{start_date}}' AND '{{end_date}}'"
            - name: summarize
              type: call
              call: anthropic.create-message
              with:
                model: "claude-sonnet-4-20250514"
                prompt: "Summarize these guest reviews and identify top themes: {{get-reviews.results}}"
            - name: post-insights
              type: call
              call: slack.post-message
              with:
                channel: "guest-experience"
                text: "Store {{store_number}} review summary ({{start_date}} to {{end_date}}): {{summarize.content}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apiKey
        key: "$secrets.anthropic_api_key"
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates SEO-optimized product descriptions for Target's online catalog using Anthropic Claude, given product name, category, and key attributes.

naftiko: "0.5"
info:
  label: "Anthropic AI Product Description Generation"
  description: "Generates SEO-optimized product descriptions for Target's online catalog using Anthropic Claude, given product name, category, and key attributes."
  tags:
    - ai
    - anthropic
    - marketing
    - content
    - automation
capability:
  exposes:
    - type: mcp
      namespace: content-ai
      port: 8080
      tools:
        - name: generate-product-description
          description: "Given a product name, category, and key attributes, generate an SEO-optimized product description for Target's online catalog using Anthropic Claude. Use for bulk product content generation or individual item listing updates."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "Product name as it will appear on Target.com."
            - name: category
              in: body
              type: string
              description: "Product category (e.g. Home Decor, Apparel, Electronics)."
            - name: key_attributes
              in: body
              type: string
              description: "Comma-separated list of key product features and attributes."
          call: anthropic-content.create-message
          with:
            model: "claude-opus-4-5"
            max_tokens: 200
            messages: "[{\"role\":\"user\",\"content\":\"Write a concise, SEO-optimized product description for Target.com:\\n\\nProduct: {{product_name}}\\nCategory: {{category}}\\nKey features: {{key_attributes}}\\n\\nKeep it under 150 words, highlight benefits, and use an approachable tone.\"}]"
          outputParameters:
            - name: description
              type: string
              mapping: "$.content[0].text"
  consumes:
    - type: http
      namespace: anthropic-content
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST

When an Azure DevOps build fails, creates a Jira bug ticket and notifies the dev team via Slack.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Failure Handler"
  description: "When an Azure DevOps build fails, creates a Jira bug ticket and notifies the dev team via Slack."
  tags:
    - devops
    - azure-devops
    - jira
    - slack
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: build-ops
      port: 8080
      tools:
        - name: handle-build-failure
          description: "Given a build ID and project, fetch details, create Jira bug, and notify dev team."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project."
            - name: build_id
              in: body
              type: string
              description: "Build ID."
          steps:
            - name: get-build
              type: call
              call: azuredevops.get-build
              with:
                project: "{{project}}"
                build_id: "{{build_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project: DEV
                issue_type: Bug
                summary: "Build failure: {{get-build.definition_name}} #{{build_id}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "dev-builds"
                text: "Build failure: {{get-build.definition_name}} #{{build_id}}. Jira: {{create-bug.key}}."
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/target"
      authentication:
        type: basic
        username: "$secrets.azdo_user"
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}?api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the health status of an Azure resource by resource ID and returns availability state.

naftiko: "0.5"
info:
  label: "Azure Resource Health Check"
  description: "Checks the health status of an Azure resource by resource ID and returns availability state."
  tags:
    - cloud
    - azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cloud-ops
      port: 8080
      tools:
        - name: check-resource-health
          description: "Given an Azure resource ID, return the current availability status. Use for cloud infrastructure health monitoring."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Full Azure resource ID path."
          call: azure.get-health
          with:
            resource_id: "{{resource_id}}"
          outputParameters:
            - name: availability_state
              type: string
              mapping: "$.properties.availabilityState"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: resource-health
          path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current?api-version=2023-07-01"
          inputParameters:
            - name: resource_id
              in: path
          operations:
            - name: get-health
              method: GET

Queries Snowflake for Target Circle loyalty points balances and syncs updates to Salesforce for guest service inquiries.

naftiko: "0.5"
info:
  label: "Target Circle Loyalty Points Balance Sync"
  description: "Queries Snowflake for Target Circle loyalty points balances and syncs updates to Salesforce for guest service inquiries."
  tags:
    - loyalty
    - snowflake
    - salesforce
    - guest-experience
capability:
  exposes:
    - type: mcp
      namespace: loyalty
      port: 8080
      tools:
        - name: sync-loyalty-balance
          description: "Given a guest ID, query points balance in Snowflake and update Salesforce contact record."
          inputParameters:
            - name: guest_id
              in: body
              type: string
              description: "Target Circle guest ID."
          steps:
            - name: get-balance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT points_balance, tier, last_activity_date FROM LOYALTY.CIRCLE_MEMBERS WHERE guest_id = '{{guest_id}}'"
            - name: update-salesforce
              type: call
              call: salesforce.update-contact
              with:
                guest_id: "{{guest_id}}"
                loyalty_points: "{{get-balance.points_balance}}"
                loyalty_tier: "{{get-balance.tier}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{guest_id}}"
          inputParameters:
            - name: guest_id
              in: path
          operations:
            - name: update-contact
              method: PATCH

When GCP cost anomaly is detected, retrieves cost breakdown, creates a Jira investigation ticket, and alerts the FinOps Slack channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Spike Investigation"
  description: "When GCP cost anomaly is detected, retrieves cost breakdown, creates a Jira investigation ticket, and alerts the FinOps Slack channel."
  tags:
    - cloud
    - finops
    - gcp
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: investigate-cost-spike
          description: "Given a GCP project and anomaly date, fetch cost data, create a Jira ticket, and notify FinOps. Use when cloud spend exceeds threshold."
          inputParameters:
            - name: gcp_project
              in: body
              type: string
              description: "GCP project ID."
            - name: anomaly_date
              in: body
              type: string
              description: "Date in YYYY-MM-DD."
          steps:
            - name: get-cost-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT service, SUM(cost) as total FROM FINOPS.GCP_BILLING WHERE project = '{{gcp_project}}' AND usage_date = '{{anomaly_date}}' GROUP BY service ORDER BY total DESC"
            - name: create-investigation
              type: call
              call: jira.create-issue
              with:
                project: FINOPS
                issue_type: Task
                summary: "Cost anomaly: {{gcp_project}} on {{anomaly_date}}"
            - name: alert-finops
              type: call
              call: slack.post-message
              with:
                channel: "finops-alerts"
                text: "Cost spike in {{gcp_project}} on {{anomaly_date}}. Jira: {{create-investigation.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a Confluence wiki page by ID and returns its title and body content.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Retrieves a Confluence wiki page by ID and returns its title and body content."
  tags:
    - knowledge
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given a Confluence page ID, return the page title and body content. Use for knowledge base lookups."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Numeric Confluence page ID."
          call: confluence.get-page
          with:
            page_id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://target.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/{{page_id}}?expand=body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET

When a guest complaint is received, creates a Salesforce case, looks up the order in Oracle, and notifies the guest services team via Slack.

naftiko: "0.5"
info:
  label: "Customer Complaint to Case and Refund"
  description: "When a guest complaint is received, creates a Salesforce case, looks up the order in Oracle, and notifies the guest services team via Slack."
  tags:
    - customer-service
    - salesforce
    - oracle
    - slack
    - refund
capability:
  exposes:
    - type: mcp
      namespace: guest-services
      port: 8080
      tools:
        - name: process-guest-complaint
          description: "Given a guest email and order number, create a Salesforce case, look up the Oracle order, and notify guest services. Use for guest complaint resolution."
          inputParameters:
            - name: guest_email
              in: body
              type: string
              description: "Guest email address."
            - name: order_number
              in: body
              type: string
              description: "Order number."
            - name: complaint_description
              in: body
              type: string
              description: "Complaint description."
          steps:
            - name: lookup-order
              type: call
              call: oracle.get-order
              with:
                order_number: "{{order_number}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Guest complaint: Order {{order_number}}"
                description: "{{complaint_description}}"
                contact_email: "{{guest_email}}"
            - name: notify-team
              type: call
              call: slack.post-message
              with:
                channel: "guest-services"
                text: "New complaint case {{create-case.case_number}} for order {{order_number}}. Guest: {{guest_email}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: orders
          path: "/salesOrders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Databricks ML model shows drift, logs the event in Snowflake, creates a Jira ticket, and alerts data science via Slack.

naftiko: "0.5"
info:
  label: "Databricks Model Drift Handler"
  description: "When a Databricks ML model shows drift, logs the event in Snowflake, creates a Jira ticket, and alerts data science via Slack."
  tags:
    - data-science
    - databricks
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: handle-model-drift
          description: "Given a model name and drift score, log event, create ticket, and alert team."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Model name."
            - name: drift_score
              in: body
              type: string
              description: "Drift score."
          steps:
            - name: log-event
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO ML_OPS.MODEL_DRIFT_LOG (model_name, drift_score, detected_at) VALUES ('{{model_name}}', {{drift_score}}, CURRENT_TIMESTAMP())"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: MLOPS
                issue_type: Task
                summary: "Model drift: {{model_name}} — {{drift_score}}"
            - name: alert
              type: call
              call: slack.post-message
              with:
                channel: "data-science-alerts"
                text: "Model drift: {{model_name}} score {{drift_score}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Datadog fires a critical alert, creates a ServiceNow P1 incident, pages the on-call via PagerDuty, and posts to the ops Slack channel.

naftiko: "0.5"
info:
  label: "Datadog Alert to PagerDuty Escalation"
  description: "When Datadog fires a critical alert, creates a ServiceNow P1 incident, pages the on-call via PagerDuty, and posts to the ops Slack channel."
  tags:
    - observability
    - datadog
    - pagerduty
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog alert ID, create a ServiceNow incident, page on-call, and notify ops. Use for P1 production alerts."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Datadog alert ID."
            - name: alert_title
              in: body
              type: string
              description: "Alert title."
            - name: service_name
              in: body
              type: string
              description: "Affected service."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: application
                urgency: 1
                short_description: "[P1] {{alert_title}} — {{service_name}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{service_name}}"
                title: "{{alert_title}}"
                urgency: high
            - name: notify-ops
              type: call
              call: slack.post-message
              with:
                channel: "oncall-alerts"
                text: "P1: {{alert_title}} on {{service_name}}. Incident: {{create-incident.number}}. On-call paged."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Datadog detects Target.com checkout performance degradation, creates a ServiceNow P1 incident and notifies the digital engineering on-call team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog E-commerce Performance Alert"
  description: "When Datadog detects Target.com checkout performance degradation, creates a ServiceNow P1 incident and notifies the digital engineering on-call team in Microsoft Teams."
  tags:
    - devops
    - datadog
    - servicenow
    - microsoft-teams
    - ecommerce
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ecomm-ops
      port: 8080
      tools:
        - name: handle-ecommerce-alert
          description: "Given a Datadog monitor ID for Target.com checkout performance, retrieve monitor details, create a P1 ServiceNow incident, and notify the digital engineering on-call channel in Microsoft Teams. Use for automated alerting on checkout and payment performance violations."
          inputParameters:
            - name: monitor_id
              in: body
              type: integer
              description: "Datadog monitor ID detecting e-commerce performance issues."
            - name: alert_message
              in: body
              type: string
              description: "Alert body from the Datadog notification."
          steps:
            - name: get-monitor
              type: call
              call: dd-ecomm.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-p1-incident
              type: call
              call: snow-ecomm.create-incident
              with:
                category: "ecommerce_performance"
                short_description: "Target.com performance alert: {{alert_message}}"
                assigned_group: "Digital_Engineering"
                priority: "1"
                description: "Datadog monitor {{monitor_id}} ({{get-monitor.name}}) fired. Alert: {{alert_message}}"
            - name: notify-oncall
              type: call
              call: msteams-oncall.send-channel-message
              with:
                team_id: "$secrets.msteams_digital_team_id"
                channel_id: "$secrets.msteams_oncall_channel_id"
                content: "P1 ECOMMERCE ALERT: {{alert_message}} | Monitor: {{monitor_id}} | Incident: {{create-p1-incident.number}} | Immediate action required"
  consumes:
    - type: http
      namespace: dd-ecomm
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: snow-ecomm
      baseUri: "https://target.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-oncall
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks the current status of a Datadog monitor by ID and returns the monitor name and overall state.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Check"
  description: "Checks the current status of a Datadog monitor by ID and returns the monitor name and overall state."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Given a Datadog monitor ID, return the monitor name and overall status. Use for observability health checks."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Numeric Datadog monitor ID."
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: overall_state
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Retrieves Datadog SLO status for Target's digital commerce platform and posts a weekly compliance report to the platform engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Compliance Report"
  description: "Retrieves Datadog SLO status for Target's digital commerce platform and posts a weekly compliance report to the platform engineering Microsoft Teams channel."
  tags:
    - devops
    - datadog
    - microsoft-teams
    - observability
    - slo
    - reliability
capability:
  exposes:
    - type: mcp
      namespace: reliability-ops
      port: 8080
      tools:
        - name: report-slo-compliance
          description: "Given a Datadog SLO ID, retrieve current status and error budget remaining, then post a compliance report to the Microsoft Teams platform-engineering channel. Use weekly for reliability reviews."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "Datadog SLO ID to report compliance for."
          steps:
            - name: get-slo
              type: call
              call: dd-slo.get-slo
              with:
                slo_id: "{{slo_id}}"
            - name: post-slo-report
              type: call
              call: msteams-platform.send-channel-message
              with:
                team_id: "$secrets.msteams_platform_team_id"
                channel_id: "$secrets.msteams_platform_channel_id"
                content: "SLO Compliance {{slo_id}}: Status {{get-slo.data.overall_status}} | Error budget remaining: {{get-slo.data.overall_error_budget_remaining}}%"
  consumes:
    - type: http
      namespace: dd-slo
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: msteams-platform
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Monitors Datadog metrics for store POS system response time and transaction throughput, creating a ServiceNow alert if performance degrades below SLO thresholds.

naftiko: "0.5"
info:
  label: "Datadog Store POS Performance Monitoring"
  description: "Monitors Datadog metrics for store POS system response time and transaction throughput, creating a ServiceNow alert if performance degrades below SLO thresholds."
  tags:
    - devops
    - datadog
    - servicenow
    - retail
    - pos
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: pos-ops
      port: 8080
      tools:
        - name: handle-pos-performance-alert
          description: "Given a Datadog monitor ID for POS performance and a store number, retrieve monitor details and open a ServiceNow incident for store IT response. Use from Datadog webhook triggers on POS SLO threshold violations."
          inputParameters:
            - name: monitor_id
              in: body
              type: integer
              description: "Datadog monitor ID tracking POS performance."
            - name: store_number
              in: body
              type: string
              description: "Store number experiencing the performance degradation."
            - name: metric_value
              in: body
              type: number
              description: "Current metric value that triggered the alert."
          steps:
            - name: get-monitor
              type: call
              call: dd-pos.get-monitor
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-pos-incident
              type: call
              call: snow-pos.create-incident
              with:
                category: "pos_performance"
                short_description: "POS performance degradation at store {{store_number}}: {{metric_value}}"
                assigned_group: "Store_IT_Support"
                description: "Datadog monitor {{monitor_id}} ({{get-monitor.name}}) triggered for store {{store_number}}. Metric value: {{metric_value}}"
  consumes:
    - type: http
      namespace: dd-pos
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: snow-pos
      baseUri: "https://target.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

Queries Snowflake demand forecast data, identifies DPCIs below safety stock, and creates replenishment orders in Oracle with a Slack notification.

naftiko: "0.5"
info:
  label: "Demand Forecast to Replenishment Order"
  description: "Queries Snowflake demand forecast data, identifies DPCIs below safety stock, and creates replenishment orders in Oracle with a Slack notification."
  tags:
    - supply-chain
    - snowflake
    - oracle
    - slack
    - replenishment
capability:
  exposes:
    - type: mcp
      namespace: replenishment
      port: 8080
      tools:
        - name: trigger-replenishment
          description: "Given a DC code and category, check demand forecast against stock, create Oracle POs, and notify supply chain. Use for automated replenishment."
          inputParameters:
            - name: dc_code
              in: body
              type: string
              description: "Distribution center code."
            - name: category
              in: body
              type: string
              description: "Product category."
          steps:
            - name: get-low-stock
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT dpci, on_hand_qty, reorder_qty FROM SUPPLY_CHAIN.REPLENISHMENT_VIEW WHERE dc_code = '{{dc_code}}' AND category = '{{category}}' AND on_hand_qty < safety_stock"
            - name: create-po
              type: call
              call: oracle.create-purchase-order
              with:
                items: "{{get-low-stock.results}}"
                dc_code: "{{dc_code}}"
            - name: notify-supply-chain
              type: call
              call: slack.post-message
              with:
                channel: "supply-chain-ops"
                text: "Replenishment for DC {{dc_code}}: {{get-low-stock.row_count}} items. PO: {{create-po.po_number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders"
          operations:
            - name: create-purchase-order
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks drive-up order readiness in Oracle, updates the Salesforce case, and notifies the store fulfillment team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Drive Up Order Fulfillment Tracker"
  description: "Checks drive-up order readiness in Oracle, updates the Salesforce case, and notifies the store fulfillment team via Microsoft Teams."
  tags:
    - e-commerce
    - oracle
    - salesforce
    - microsoft-teams
    - fulfillment
capability:
  exposes:
    - type: mcp
      namespace: fulfillment
      port: 8080
      tools:
        - name: track-drive-up-order
          description: "Given an order number and store, check fulfillment status and notify the store team."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "Order number."
            - name: store_number
              in: body
              type: string
              description: "Store number."
          steps:
            - name: get-status
              type: call
              call: oracle.get-order-status
              with:
                order_number: "{{order_number}}"
            - name: notify-store
              type: call
              call: msteams.send-channel-message
              with:
                team_id: fulfillment
                channel: "store-{{store_number}}"
                text: "Drive up order {{order_number}}: {{get-status.fulfillment_status}}. Items: {{get-status.item_count}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: orders
          path: "/salesOrders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Dynatrace detects resource saturation, creates a ServiceNow problem ticket and alerts capacity ops via Slack.

naftiko: "0.5"
info:
  label: "Dynatrace Resource Saturation Handler"
  description: "When Dynatrace detects resource saturation, creates a ServiceNow problem ticket and alerts capacity ops via Slack."
  tags:
    - observability
    - dynatrace
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: capacity-ops
      port: 8080
      tools:
        - name: handle-saturation
          description: "Given a Dynatrace problem ID, fetch details, create a ServiceNow problem, and notify ops."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "Dynatrace problem ID."
          steps:
            - name: get-problem
              type: call
              call: dynatrace.get-problem
              with:
                problem_id: "{{problem_id}}"
            - name: create-problem
              type: call
              call: servicenow.create-problem
              with:
                short_description: "Saturation: {{get-problem.title}}"
                description: "Impact: {{get-problem.impact_level}}."
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "capacity-alerts"
                text: "Saturation: {{get-problem.title}}. ServiceNow: {{create-problem.number}}."
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://target.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a GitHub Actions workflow fails on a production branch, creates a ServiceNow incident, posts an alert to the engineering Microsoft Teams channel, and creates a Datadog deployment failure event.

naftiko: "0.5"
info:
  label: "GitHub Deployment Pipeline Failure Alert"
  description: "When a GitHub Actions workflow fails on a production branch, creates a ServiceNow incident, posts an alert to the engineering Microsoft Teams channel, and creates a Datadog deployment failure event."
  tags:
    - devops
    - github
    - servicenow
    - microsoft-teams
    - datadog
    - cicd
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: deploy-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub workflow run ID, repo, branch, and failed job name, open a ServiceNow incident, alert the #engineering Microsoft Teams channel, and create a Datadog deployment failure event. Use on GitHub Actions production workflow failure webhooks."
          inputParameters:
            - name: workflow_run_id
              in: body
              type: integer
              description: "GitHub Actions workflow run ID that failed."
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: branch
              in: body
              type: string
              description: "Git branch the workflow ran on."
            - name: failed_job
              in: body
              type: string
              description: "Name of the failing job in the workflow."
            - name: commit_sha
              in: body
              type: string
              description: "Commit SHA that triggered the failed workflow."
          steps:
            - name: get-workflow-run
              type: call
              call: github-runs.get-workflow-run
              with:
                repo: "{{repo}}"
                run_id: "{{workflow_run_id}}"
            - name: create-snow-incident
              type: call
              call: snow-deploy.create-incident
              with:
                category: "deployment_failure"
                short_description: "CI/CD failure: {{repo}} {{branch}} job {{failed_job}}"
                assigned_group: "Engineering_Platform"
                description: "Workflow run {{workflow_run_id}} failed. Branch: {{branch}}. Job: {{failed_job}}. Commit: {{commit_sha}}. URL: {{get-workflow-run.html_url}}"
            - name: alert-engineering
              type: call
              call: msteams-eng.send-channel-message
              with:
                team_id: "$secrets.msteams_eng_team_id"
                channel_id: "$secrets.msteams_eng_channel_id"
                content: "PIPELINE FAILURE: {{repo}} | Branch: {{branch}} | Job: {{failed_job}} | Ticket: {{create-snow-incident.number}} | {{get-workflow-run.html_url}}"
            - name: log-dd-failure
              type: call
              call: datadog-deploy.create-event
              with:
                title: "Deployment failure: {{repo}} {{branch}}"
                text: "Job {{failed_job}} failed on commit {{commit_sha}}"
                tags: "repo:{{repo}},branch:{{branch}},job:{{failed_job}}"
  consumes:
    - type: http
      namespace: github-runs
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: snow-deploy
      baseUri: "https://target.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-eng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST
    - type: http
      namespace: datadog-deploy
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Fetches open pull requests across Target engineering repositories and posts a morning digest to the engineering Microsoft Teams channel to prioritize daily code review.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Morning Digest"
  description: "Fetches open pull requests across Target engineering repositories and posts a morning digest to the engineering Microsoft Teams channel to prioritize daily code review."
  tags:
    - devops
    - github
    - microsoft-teams
    - code-review
    - reporting
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: eng-morning
      port: 8080
      tools:
        - name: publish-pr-digest
          description: "Given a GitHub repo, fetch all open pull requests and post a morning digest to the Microsoft Teams engineering channel with PR count and oldest PR age. Use as a daily 8am scheduled agent."
          inputParameters:
            - name: owner
              in: body
              type: string
              description: "GitHub organization or owner name."
            - name: repo
              in: body
              type: string
              description: "GitHub repository name."
          steps:
            - name: get-open-prs
              type: call
              call: github-prs.list-pull-requests
              with:
                owner: "{{owner}}"
                repo: "{{repo}}"
                state: "open"
            - name: post-pr-digest
              type: call
              call: msteams-eng-digest.send-channel-message
              with:
                team_id: "$secrets.msteams_eng_team_id"
                channel_id: "$secrets.msteams_eng_channel_id"
                content: "Good morning! Open PRs in {{repo}}: {{get-open-prs.total_count}}. Review and merge to keep the pipeline green."
  consumes:
    - type: http
      namespace: github-prs
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{owner}}/{{repo}}/pulls"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: state
              in: query
          operations:
            - name: list-pull-requests
              method: GET
    - type: http
      namespace: msteams-eng-digest
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a GitHub release is published, creates a ServiceNow change request and posts release notes to the engineering Slack channel.

naftiko: "0.5"
info:
  label: "GitHub Release to ServiceNow Change Request"
  description: "When a GitHub release is published, creates a ServiceNow change request and posts release notes to the engineering Slack channel."
  tags:
    - devops
    - github
    - servicenow
    - slack
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: process-github-release
          description: "Given a GitHub repo and release tag, fetch release details, create a ServiceNow change request, and notify engineering. Use for production release tracking."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository in org/repo format."
            - name: release_tag
              in: body
              type: string
              description: "Release tag."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                repo_name: "{{repo_name}}"
                tag: "{{release_tag}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change
              with:
                short_description: "Release {{release_tag}} for {{repo_name}}"
                description: "{{get-release.body}}"
            - name: notify-engineering
              type: call
              call: slack.post-message
              with:
                channel: "engineering-releases"
                text: "Release {{release_tag}} published for {{repo_name}}. Change: {{create-change-request.number}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{repo_name}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up a GitHub repository and returns its description, default branch, open issue count, and last push date.

naftiko: "0.5"
info:
  label: "GitHub Repository Info"
  description: "Looks up a GitHub repository and returns its description, default branch, open issue count, and last push date."
  tags:
    - devops
    - github
    - repository
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given an org and repo name, return the repository description, default branch, and open issues count. Use for engineering portfolio reviews."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "Full repository name in org/repo format."
          call: github.get-repo
          with:
            repo_name: "{{repo_name}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.description"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo_name}}"
          inputParameters:
            - name: repo_name
              in: path
          operations:
            - name: get-repo
              method: GET

Scans GitHub for critical Dependabot alerts across Target's retail platform repositories and creates ServiceNow security tickets for remediation tracking.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Scans GitHub for critical Dependabot alerts across Target's retail platform repositories and creates ServiceNow security tickets for remediation tracking."
  tags:
    - devops
    - github
    - servicenow
    - security
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-critical-vulnerabilities
          description: "Given a GitHub owner and repo, fetch critical-severity Dependabot alerts and create a ServiceNow security incident for immediate remediation. Use as a daily security scanning agent for production repositories."
          inputParameters:
            - name: owner
              in: body
              type: string
              description: "GitHub organization or owner name."
            - name: repo
              in: body
              type: string
              description: "GitHub repository name to scan."
          steps:
            - name: get-critical-alerts
              type: call
              call: github-sec.get-dependabot-alerts
              with:
                owner: "{{owner}}"
                repo: "{{repo}}"
                severity: "critical"
            - name: create-sec-incident
              type: call
              call: snow-sec.create-incident
              with:
                category: "security_vulnerability"
                short_description: "Critical Dependabot alerts in {{repo}}"
                assigned_group: "Application_Security"
                description: "Critical vulnerabilities detected in {{owner}}/{{repo}}. Immediate remediation required. Alert count: {{get-critical-alerts.total_count}}"
  consumes:
    - type: http
      namespace: github-sec
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{owner}}/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: get-dependabot-alerts
              method: GET
    - type: http
      namespace: snow-sec
      baseUri: "https://target.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

Fetches GA4 e-commerce conversion data, stores in Snowflake, and posts a conversion summary to the digital marketing Slack channel.

naftiko: "0.5"
info:
  label: "Google Analytics Conversion Report"
  description: "Fetches GA4 e-commerce conversion data, stores in Snowflake, and posts a conversion summary to the digital marketing Slack channel."
  tags:
    - analytics
    - google-analytics
    - snowflake
    - slack
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: ecom-analytics
      port: 8080
      tools:
        - name: generate-conversion-report
          description: "Given a date range and property ID, fetch GA4 data, load to Snowflake, and post summary."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "GA4 property ID."
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          steps:
            - name: get-data
              type: call
              call: ga4.run-report
              with:
                property_id: "{{property_id}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: load-snowflake
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO DIGITAL.GA_CONVERSIONS (property_id, period_start, period_end, sessions, transactions, revenue) VALUES ('{{property_id}}', '{{start_date}}', '{{end_date}}', {{get-data.sessions}}, {{get-data.transactions}}, {{get-data.revenue}})"
            - name: post-summary
              type: call
              call: slack.post-message
              with:
                channel: "digital-marketing"
                text: "Conversion report ({{start_date}}-{{end_date}}): {{get-data.sessions}} sessions, {{get-data.conversion_rate}}% CVR, ${{get-data.revenue}} revenue."
  consumes:
    - type: http
      namespace: ga4
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a HubSpot contact meets lead criteria, creates a Salesforce lead and notifies sales via Slack.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce Sync"
  description: "When a HubSpot contact meets lead criteria, creates a Salesforce lead and notifies sales via Slack."
  tags:
    - marketing
    - hubspot
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: lead-ops
      port: 8080
      tools:
        - name: sync-lead
          description: "Given a HubSpot contact ID, fetch details, create Salesforce lead, and notify sales."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "HubSpot contact ID."
          steps:
            - name: get-contact
              type: call
              call: hubspot.get-contact
              with:
                contact_id: "{{contact_id}}"
            - name: create-lead
              type: call
              call: salesforce.create-lead
              with:
                first_name: "{{get-contact.firstname}}"
                last_name: "{{get-contact.lastname}}"
                email: "{{get-contact.email}}"
                company: "{{get-contact.company}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "sales-leads"
                text: "New MQL: {{get-contact.firstname}} {{get-contact.lastname}} at {{get-contact.company}}. Lead: {{create-lead.id}}."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a Jira issue by key and returns its summary, status, assignee, and priority.

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

When a pod enters CrashLoopBackOff, collects logs via Datadog, creates a ServiceNow incident, and pages on-call via PagerDuty.

naftiko: "0.5"
info:
  label: "Kubernetes Pod CrashLoop Responder"
  description: "When a pod enters CrashLoopBackOff, collects logs via Datadog, creates a ServiceNow incident, and pages on-call via PagerDuty."
  tags:
    - infrastructure
    - kubernetes
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: handle-crashloop
          description: "Given a namespace and pod name, collect logs, create incident, and page on-call. Use for CrashLoopBackOff events."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace."
            - name: pod_name
              in: body
              type: string
              description: "Pod name."
            - name: cluster
              in: body
              type: string
              description: "Cluster name."
          steps:
            - name: get-logs
              type: call
              call: datadog.search-logs
              with:
                query: "kube_namespace:{{namespace}} pod_name:{{pod_name}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: infrastructure
                urgency: 1
                short_description: "CrashLoopBackOff: {{pod_name}} in {{namespace}}/{{cluster}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{cluster}}-k8s"
                title: "CrashLoop: {{pod_name}}"
                urgency: high
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: logs
          path: "/logs/events/search"
          operations:
            - name: search-logs
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Fetches LinkedIn job posting analytics, syncs to Snowflake, and posts a summary to the talent acquisition Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Performance Sync"
  description: "Fetches LinkedIn job posting analytics, syncs to Snowflake, and posts a summary to the talent acquisition Teams channel."
  tags:
    - recruiting
    - linkedin
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: talent-analytics
      port: 8080
      tools:
        - name: sync-job-metrics
          description: "Given a date range, fetch LinkedIn metrics, load to Snowflake, and post summary."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          steps:
            - name: get-metrics
              type: call
              call: linkedin.get-job-analytics
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: load-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO HR.LINKEDIN_METRICS (period_start, period_end, views, applies) VALUES ('{{start_date}}', '{{end_date}}', {{get-metrics.views}}, {{get-metrics.applies}})"
            - name: post-summary
              type: call
              call: msteams.send-channel-message
              with:
                team_id: talent-acquisition
                channel: analytics
                text: "LinkedIn metrics {{start_date}}-{{end_date}}: {{get-metrics.views}} views, {{get-metrics.applies}} applies."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/jobAnalytics"
          operations:
            - name: get-job-analytics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Fetches Marketo email campaign metrics, loads them into Snowflake, and posts a summary to the marketing Slack channel.

naftiko: "0.5"
info:
  label: "Marketo Campaign to Snowflake Sync"
  description: "Fetches Marketo email campaign metrics, loads them into Snowflake, and posts a summary to the marketing Slack channel."
  tags:
    - marketing
    - marketo
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: sync-campaign-metrics
          description: "Given a Marketo campaign ID, fetch metrics, insert into Snowflake, and post summary."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Marketo campaign ID."
          steps:
            - name: get-stats
              type: call
              call: marketo.get-campaign-stats
              with:
                campaign_id: "{{campaign_id}}"
            - name: load-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO MARKETING.CAMPAIGN_METRICS (campaign_id, sends, opens, clicks) VALUES ('{{campaign_id}}', {{get-stats.sends}}, {{get-stats.opens}}, {{get-stats.clicks}})"
            - name: post-summary
              type: call
              call: slack.post-message
              with:
                channel: "marketing-analytics"
                text: "Campaign {{campaign_id}}: {{get-stats.sends}} sent, {{get-stats.open_rate}}% open rate."
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://target.mktorest.com/rest"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: campaigns
          path: "/v1/campaigns/{{campaign_id}}/stats.json"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists all channels within a Microsoft Teams team.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel List"
  description: "Lists all channels within a Microsoft Teams team."
  tags:
    - communication
    - microsoft-teams
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: list-channels
          description: "Given a Microsoft Teams team ID, return all channels. Use for team communication directory lookups."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Microsoft Teams team ID."
          call: msteams.list-channels
          with:
            team_id: "{{team_id}}"
          outputParameters:
            - name: channels
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: list-channels
              method: GET

When New Relic detects an error rate spike post-deployment, triggers a GitHub Actions rollback and creates a ServiceNow incident.

naftiko: "0.5"
info:
  label: "New Relic Error Rate Rollback Trigger"
  description: "When New Relic detects an error rate spike post-deployment, triggers a GitHub Actions rollback and creates a ServiceNow incident."
  tags:
    - devops
    - new-relic
    - github
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: deploy-ops
      port: 8080
      tools:
        - name: handle-error-spike
          description: "Given a New Relic app ID, trigger rollback and create incident."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "New Relic app ID."
            - name: repo_name
              in: body
              type: string
              description: "GitHub repo."
            - name: previous_sha
              in: body
              type: string
              description: "SHA to roll back to."
          steps:
            - name: get-metrics
              type: call
              call: newrelic.get-app-metrics
              with:
                app_id: "{{app_id}}"
            - name: trigger-rollback
              type: call
              call: github.dispatch-workflow
              with:
                repo: "{{repo_name}}"
                workflow: rollback.yml
                inputs_sha: "{{previous_sha}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: deployment
                urgency: 1
                short_description: "Auto-rollback: {{repo_name}} — error rate {{get-metrics.error_percentage}}%"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}/metrics/data.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow
              in: path
          operations:
            - name: dispatch-workflow
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When a new team member is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Team Member Onboarding Orchestrator"
  description: "When a new team member is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday worker ID and start date, orchestrate onboarding across ServiceNow, Okta, and Teams. Use when new team members join."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD."
            - name: store_number
              in: body
              type: string
              description: "Target store number."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: provision-okta
              type: call
              call: okta.create-user
              with:
                email: "{{get-worker.work_email}}"
                first_name: "{{get-worker.first_name}}"
                last_name: "{{get-worker.last_name}}"
            - name: open-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_onboarding
                short_description: "Onboarding: {{get-worker.full_name}} — Store {{store_number}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Target, {{get-worker.first_name}}! Your start date is {{start_date}}. Onboarding ticket: {{open-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: "/target/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://target.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new vendor is approved, creates the vendor record in Oracle, opens a ServiceNow onboarding ticket, and notifies procurement via Slack.

naftiko: "0.5"
info:
  label: "New Vendor Onboarding Orchestrator"
  description: "When a new vendor is approved, creates the vendor record in Oracle, opens a ServiceNow onboarding ticket, and notifies procurement via Slack."
  tags:
    - procurement
    - oracle
    - servicenow
    - slack
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: vendor-ops
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create Oracle record, ServiceNow ticket, and notify procurement."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "Vendor name."
            - name: vendor_tax_id
              in: body
              type: string
              description: "Tax ID."
            - name: category
              in: body
              type: string
              description: "Vendor category."
          steps:
            - name: create-vendor
              type: call
              call: oracle.create-supplier
              with:
                supplier_name: "{{vendor_name}}"
                tax_id: "{{vendor_tax_id}}"
            - name: open-ticket
              type: call
              call: servicenow.create-request
              with:
                category: vendor_onboarding
                short_description: "Vendor onboarding: {{vendor_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "procurement-onboarding"
                text: "Vendor {{vendor_name}} onboarded. Oracle ID: {{create-vendor.supplier_id}}. Ticket: {{open-ticket.number}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://target.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Okta detects a suspicious login, creates a security incident in ServiceNow, suspends sessions, and alerts SOC via Slack.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login Handler"
  description: "When Okta detects a suspicious login, creates a security incident in ServiceNow, suspends sessions, and alerts SOC via Slack."
  tags:
    - security
    - okta
    - servicenow
    - slack
    - threat-detection
capability:
  exposes:
    - type: mcp
      namespace: threat-response
      port: 8080
      tools:
        - name: handle-suspicious-login
          description: "Given an Okta event ID and user login, create incident, suspend sessions, and alert SOC."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "Okta event ID."
            - name: user_login
              in: body
              type: string
              description: "User login email."
          steps:
            - name: get-event
              type: call
              call: okta.get-event
              with:
                event_id: "{{event_id}}"
            - name: suspend-sessions
              type: call
              call: okta.clear-sessions
              with:
                user_login: "{{user_login}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                urgency: 1
                short_description: "Suspicious login: {{user_login}} from {{get-event.client_ip}}"
            - name: alert-soc
              type: call
              call: slack.post-message
              with:
                channel: "soc-alerts"
                text: "Suspicious login: {{user_login}} from {{get-event.client_ip}}. Sessions cleared. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://target.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: events
          path: "/logs?filter=uuid+eq+\"{{event_id}}\""
          inputParameters:
            - name: event_id
              in: query
          operations:
            - name: get-event
              method: GET
        - name: sessions
          path: "/users/{{user_login}}/sessions"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: clear-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://target.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up an Okta user by login email and returns their profile and status.

naftiko: "0.5"
info:
  label: "Okta User Profile Lookup"
  description: "Looks up an Okta user by login email and returns their profile and status."
  tags:
    - security
    - okta
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-profile
          description: "Given an Okta user login email, return the user profile and account status. Use for identity verification."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "User login email address."
          call: okta.get-user
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: display_name
              type: string
              mapping: "$.profile.displayName"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://target.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_login}}"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: get-user
              method: GET

Queries Oracle for accounts payable aging data, loads results into Snowflake, and distributes the report via Microsoft Teams to the finance team.

naftiko: "0.5"
info:
  label: "Oracle AP Aging Report Generator"
  description: "Queries Oracle for accounts payable aging data, loads results into Snowflake, and distributes the report via Microsoft Teams to the finance team."
  tags:
    - finance
    - oracle
    - snowflake
    - microsoft-teams
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-reporting
      port: 8080
      tools:
        - name: generate-ap-aging-report
          description: "Given a reporting date, query AP aging from Oracle, load to Snowflake, and notify finance."
          inputParameters:
            - name: report_date
              in: body
              type: string
              description: "Reporting date YYYY-MM-DD."
          steps:
            - name: get-aging-data
              type: call
              call: oracle.get-ap-aging
              with:
                report_date: "{{report_date}}"
            - name: load-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO FINANCE.AP_AGING (report_date, current_bucket, past_30, past_60, past_90) VALUES ('{{report_date}}', {{get-aging-data.current}}, {{get-aging-data.past_30}}, {{get-aging-data.past_60}}, {{get-aging-data.past_90}})"
            - name: notify-finance
              type: call
              call: msteams.send-channel-message
              with:
                team_id: finance-team
                channel: ap-reports
                text: "AP aging report for {{report_date}}: Current ${{get-aging-data.current}}, 30-day ${{get-aging-data.past_30}}, 60-day ${{get-aging-data.past_60}}, 90+ ${{get-aging-data.past_90}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: aging
          path: "/payablesInvoices?q=AgingStatus"
          operations:
            - name: get-ap-aging
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When an Oracle delivery is delayed, creates a ServiceNow incident and notifies logistics via Slack.

naftiko: "0.5"
info:
  label: "Oracle Delivery Delay Escalation"
  description: "When an Oracle delivery is delayed, creates a ServiceNow incident and notifies logistics via Slack."
  tags:
    - logistics
    - oracle
    - servicenow
    - slack
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: escalate-delivery-delay
          description: "Given an Oracle delivery number, check delay, create incident, and alert logistics."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "Oracle delivery number."
          steps:
            - name: get-delivery
              type: call
              call: oracle.get-delivery
              with:
                delivery_number: "{{delivery_number}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: logistics
                urgency: 2
                short_description: "Delivery delay: {{delivery_number}} — {{get-delivery.delay_days}} days"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "logistics-ops"
                text: "Delivery {{delivery_number}} delayed {{get-delivery.delay_days}} days. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: deliveries
          path: "/shipments/{{delivery_number}}"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://target.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up a purchase order in Oracle ERP by PO number, returning vendor, status, and line items. Used by procurement and accounts payable for order reconciliation.

naftiko: "0.5"
info:
  label: "Oracle ERP Purchase Order Lookup"
  description: "Looks up a purchase order in Oracle ERP by PO number, returning vendor, status, and line items. Used by procurement and accounts payable for order reconciliation."
  tags:
    - procurement
    - oracle
    - erp
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: erp-ops
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given an Oracle ERP purchase order number, retrieve the PO header status, supplier name, total ordered amount, and line item count. Use for procurement review, AP matching, or vendor disputes."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "Oracle ERP purchase order number."
          call: oracle-po.get-purchase-order
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.OrderStatus"
            - name: supplier_name
              type: string
              mapping: "$.SupplierName"
            - name: total_amount
              type: number
              mapping: "$.OrderedAmount"
  consumes:
    - type: http
      namespace: oracle-po
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET

Retrieves vendor master data from Oracle ERP by supplier ID including name, payment terms, and status.

naftiko: "0.5"
info:
  label: "Oracle ERP Vendor Lookup"
  description: "Retrieves vendor master data from Oracle ERP by supplier ID including name, payment terms, and status."
  tags:
    - procurement
    - oracle
    - vendor
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Given an Oracle supplier ID, return the vendor name, payment terms, status, and address. Use for supplier verification during procurement."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "Oracle supplier ID."
          call: oracle.get-supplier
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: supplier_name
              type: string
              mapping: "$.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.PaymentTerms"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET

Retrieves employee expense reports from Oracle ERP, validates against T&E policy, and routes out-of-policy reports to the manager via Microsoft Teams for approval.

naftiko: "0.5"
info:
  label: "Oracle Expense Report Processing"
  description: "Retrieves employee expense reports from Oracle ERP, validates against T&E policy, and routes out-of-policy reports to the manager via Microsoft Teams for approval."
  tags:
    - finance
    - oracle
    - erp
    - microsoft-teams
    - expense-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: process-expense-report
          description: "Given an Oracle ERP expense report number, retrieve report details and check the total against the T&E policy limit. If over limit, post a review request to the Microsoft Teams finance channel. Use in the automated expense approval pipeline."
          inputParameters:
            - name: expense_report_number
              in: body
              type: string
              description: "Oracle ERP expense report number to process."
            - name: policy_limit
              in: body
              type: number
              description: "T&E policy limit amount in USD above which manager approval is required."
          steps:
            - name: get-expense-report
              type: call
              call: oracle-expense.get-expense-report
              with:
                report_number: "{{expense_report_number}}"
            - name: flag-for-review
              type: call
              call: msteams-expense.send-channel-message
              with:
                team_id: "$secrets.msteams_finance_team_id"
                channel_id: "$secrets.msteams_finance_channel_id"
                content: "Expense report {{expense_report_number}} requires review. Submitted by: {{get-expense-report.EmployeeName}}. Total: {{get-expense-report.TotalAmount}} USD exceeds policy limit {{policy_limit}}. Review in Oracle ERP."
  consumes:
    - type: http
      namespace: oracle-expense
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: expense-reports
          path: "/expenseReports/{{report_number}}"
          inputParameters:
            - name: report_number
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: msteams-expense
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Oracle for period-close task status, aggregates in Snowflake, and posts a readiness summary to the finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Oracle Financial Close Readiness"
  description: "Queries Oracle for period-close task status, aggregates in Snowflake, and posts a readiness summary to the finance Microsoft Teams channel."
  tags:
    - finance
    - oracle
    - snowflake
    - microsoft-teams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: check-close-readiness
          description: "Given a fiscal period, query close tasks and post readiness report."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period."
          steps:
            - name: get-close-status
              type: call
              call: oracle.get-close-status
              with:
                fiscal_period: "{{fiscal_period}}"
            - name: aggregate
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT task_category, COUNT(*) as total, SUM(CASE WHEN status='COMPLETE' THEN 1 ELSE 0 END) as done FROM FINANCE.CLOSE_TASKS WHERE fiscal_period = '{{fiscal_period}}' GROUP BY task_category"
            - name: post-readiness
              type: call
              call: msteams.send-channel-message
              with:
                team_id: finance-team
                channel: period-close
                text: "Close readiness for {{fiscal_period}}: {{aggregate.results}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: close-tasks
          path: "/financialCloseStatus"
          operations:
            - name: get-close-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks Oracle ERP for open journal entries and unposted batches in the current accounting period, and posts a close-readiness summary to the finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Oracle Financial Period Close Status"
  description: "Checks Oracle ERP for open journal entries and unposted batches in the current accounting period, and posts a close-readiness summary to the finance Microsoft Teams channel."
  tags:
    - finance
    - oracle
    - erp
    - microsoft-teams
    - period-close
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: period-close
      port: 8080
      tools:
        - name: check-period-close-readiness
          description: "Given an Oracle ERP ledger ID and period name, query for open journal entries and unposted batches, then post a close-readiness summary to the finance Microsoft Teams channel. Use at month-end before executing the period close."
          inputParameters:
            - name: ledger_id
              in: body
              type: integer
              description: "Oracle GL ledger ID to check for open items."
            - name: period_name
              in: body
              type: string
              description: "Accounting period name (e.g. Feb-2026)."
          steps:
            - name: get-open-journals
              type: call
              call: oracle-gl.get-journal-entries
              with:
                ledger_id: "{{ledger_id}}"
                period_name: "{{period_name}}"
                status: "unposted"
            - name: post-close-status
              type: call
              call: msteams-period.send-channel-message
              with:
                team_id: "$secrets.msteams_finance_team_id"
                channel_id: "$secrets.msteams_finance_channel_id"
                content: "Period close readiness for {{period_name}}: Unposted journal entries in Oracle: {{get-open-journals.totalResults}}. Clear all items before closing."
  consumes:
    - type: http
      namespace: oracle-gl
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: journal-entries
          path: "/generalLedgerJournalEntries"
          inputParameters:
            - name: ledger_id
              in: query
            - name: period_name
              in: query
            - name: status
              in: query
          operations:
            - name: get-journal-entries
              method: GET
    - type: http
      namespace: msteams-period
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Oracle ERP for budget vs. actuals by cost center for the current period and posts a variance summary to the finance leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Oracle Forecasting and Budget Review"
  description: "Queries Oracle ERP for budget vs. actuals by cost center for the current period and posts a variance summary to the finance leadership Microsoft Teams channel."
  tags:
    - finance
    - oracle
    - erp
    - microsoft-teams
    - budgeting
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: budget-ops
      port: 8080
      tools:
        - name: digest-budget-vs-actuals
          description: "Given an Oracle ERP ledger ID and accounting period, query budget vs. actuals for all cost centers and post a variance summary to the finance leadership Microsoft Teams channel. Use monthly for budget reviews or on-demand for executive inquiries."
          inputParameters:
            - name: ledger_id
              in: body
              type: integer
              description: "Oracle GL ledger ID to query budget data for."
            - name: period_name
              in: body
              type: string
              description: "Accounting period name to report on (e.g. Feb-2026)."
          steps:
            - name: get-budget-data
              type: call
              call: oracle-budget.get-budget-entries
              with:
                ledger_id: "{{ledger_id}}"
                period_name: "{{period_name}}"
            - name: post-variance-report
              type: call
              call: msteams-budget.send-channel-message
              with:
                team_id: "$secrets.msteams_finance_team_id"
                channel_id: "$secrets.msteams_finance_channel_id"
                content: "Budget vs. Actuals for {{period_name}} (Ledger {{ledger_id}}): {{get-budget-data.totalResults}} cost center entries retrieved. Review variances in Oracle ERP."
  consumes:
    - type: http
      namespace: oracle-budget
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: budget-entries
          path: "/generalLedgerBudgetEntries"
          inputParameters:
            - name: ledger_id
              in: query
            - name: period_name
              in: query
          operations:
            - name: get-budget-entries
              method: GET
    - 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: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a goods receipt is posted in Oracle ERP, updates the Snowflake inventory table and notifies the warehouse Slack channel.

naftiko: "0.5"
info:
  label: "Oracle Goods Receipt to Inventory Update"
  description: "When a goods receipt is posted in Oracle ERP, updates the Snowflake inventory table and notifies the warehouse Slack channel."
  tags:
    - supply-chain
    - oracle
    - snowflake
    - slack
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: process-goods-receipt
          description: "Given an Oracle receipt number, fetch receipt details, update Snowflake inventory, and notify the warehouse team. Use when shipments arrive at distribution centers."
          inputParameters:
            - name: receipt_number
              in: body
              type: string
              description: "Oracle goods receipt number."
            - name: dc_code
              in: body
              type: string
              description: "Distribution center code."
          steps:
            - name: get-receipt
              type: call
              call: oracle.get-receipt
              with:
                receipt_number: "{{receipt_number}}"
            - name: update-inventory
              type: call
              call: snowflake.execute-statement
              with:
                statement: "UPDATE SUPPLY_CHAIN.INVENTORY SET on_hand_qty = on_hand_qty + {{get-receipt.quantity}} WHERE dpci = '{{get-receipt.item_number}}' AND dc_code = '{{dc_code}}'"
            - name: notify-warehouse
              type: call
              call: slack.post-message
              with:
                channel: "warehouse-{{dc_code}}"
                text: "Goods receipt {{receipt_number}} processed: {{get-receipt.quantity}} units of {{get-receipt.item_number}} at DC {{dc_code}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: receipts
          path: "/receivingReceipts/{{receipt_number}}"
          inputParameters:
            - name: receipt_number
              in: path
          operations:
            - name: get-receipt
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Snowflake detects inventory discrepancies, initiates an Oracle cycle count and notifies the store operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Oracle Inventory Recount Orchestrator"
  description: "When Snowflake detects inventory discrepancies, initiates an Oracle cycle count and notifies the store operations team via Microsoft Teams."
  tags:
    - supply-chain
    - oracle
    - snowflake
    - microsoft-teams
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: initiate-recount
          description: "Given a store number and category, identify discrepancies and trigger a cycle count."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "Store number."
            - name: category
              in: body
              type: string
              description: "Product category."
          steps:
            - name: find-discrepancies
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT dpci, system_qty, actual_qty, ABS(system_qty - actual_qty) as variance FROM SUPPLY_CHAIN.INVENTORY_AUDIT WHERE store_number = '{{store_number}}' AND category = '{{category}}' AND variance > 5 ORDER BY variance DESC"
            - name: initiate-count
              type: call
              call: oracle.create-cycle-count
              with:
                store_number: "{{store_number}}"
                items: "{{find-discrepancies.results}}"
            - name: notify-store
              type: call
              call: msteams.send-channel-message
              with:
                team_id: store-operations
                channel: "store-{{store_number}}"
                text: "Inventory recount initiated for {{category}} at Store {{store_number}}: {{find-discrepancies.row_count}} items with discrepancies."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: cycle-counts
          path: "/cycleCounts"
          operations:
            - name: create-cycle-count
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Oracle ERP for product inventory levels below reorder threshold and creates replenishment purchase requisitions automatically for distribution center restocking.

naftiko: "0.5"
info:
  label: "Oracle Inventory Replenishment Alert"
  description: "Queries Oracle ERP for product inventory levels below reorder threshold and creates replenishment purchase requisitions automatically for distribution center restocking."
  tags:
    - supply-chain
    - oracle
    - erp
    - inventory-management
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: check-and-replenish-inventory
          description: "Given an Oracle ERP item number and organization code, check current on-hand quantity and trigger a purchase requisition if stock falls below the reorder point. Use for automated distribution center replenishment."
          inputParameters:
            - name: item_number
              in: body
              type: string
              description: "Oracle ERP inventory item number (SKU)."
            - name: organization_code
              in: body
              type: string
              description: "Oracle inventory organization code for the DC or store."
            - name: reorder_threshold
              in: body
              type: integer
              description: "Minimum quantity on hand before triggering replenishment."
          steps:
            - name: get-inventory
              type: call
              call: oracle-inv.get-on-hand-quantity
              with:
                item_number: "{{item_number}}"
                org_code: "{{organization_code}}"
            - name: create-requisition
              type: call
              call: oracle-req.create-requisition
              with:
                itemNumber: "{{item_number}}"
                organizationCode: "{{organization_code}}"
                requestedQuantity: "{{reorder_threshold}}"
                justification: "Auto-replenishment: stock below threshold at {{organization_code}}"
  consumes:
    - type: http
      namespace: oracle-inv
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: on-hand-quantities
          path: "/inventoryOnhandQuantities"
          inputParameters:
            - name: item_number
              in: query
            - name: org_code
              in: query
          operations:
            - name: get-on-hand-quantity
              method: GET
    - type: http
      namespace: oracle-req
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: requisitions
          path: "/purchaseRequisitions"
          operations:
            - name: create-requisition
              method: POST

Retrieves a pending Oracle ERP supplier invoice, validates it against the matching purchase order, and routes discrepancies to the AP team via Microsoft Teams for manual review.

naftiko: "0.5"
info:
  label: "Oracle Supplier Invoice Approval Workflow"
  description: "Retrieves a pending Oracle ERP supplier invoice, validates it against the matching purchase order, and routes discrepancies to the AP team via Microsoft Teams for manual review."
  tags:
    - finance
    - oracle
    - erp
    - microsoft-teams
    - invoice-processing
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: process-supplier-invoice
          description: "Given an Oracle ERP invoice ID and PO number, retrieve invoice details, compare to PO amount, and flag discrepancies to the Microsoft Teams AP channel for review. Use in the accounts payable three-way match workflow."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Oracle ERP invoice ID to process."
            - name: po_number
              in: body
              type: string
              description: "Oracle ERP purchase order number to match against."
          steps:
            - name: get-invoice
              type: call
              call: oracle-inv-ap.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: get-po
              type: call
              call: oracle-po-ap.get-purchase-order
              with:
                po_number: "{{po_number}}"
            - name: flag-for-review
              type: call
              call: msteams-ap.send-channel-message
              with:
                team_id: "$secrets.msteams_finance_team_id"
                channel_id: "$secrets.msteams_ap_channel_id"
                content: "Invoice {{invoice_id}} review: Amount {{get-invoice.InvoiceAmount}} vs PO {{po_number}} amount {{get-po.OrderedAmount}}. Please review in Oracle ERP."
  consumes:
    - type: http
      namespace: oracle-inv-ap
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: invoices
          path: "/supplierInvoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: oracle-po-ap
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: purchase-orders
          path: "/purchaseOrders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET
    - type: http
      namespace: msteams-ap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Registers a new merchandise supplier in Oracle ERP, creates the supplier site, and notifies the merchandising team via Microsoft Teams to initiate buyer relationship setup.

naftiko: "0.5"
info:
  label: "Oracle Supplier Onboarding"
  description: "Registers a new merchandise supplier in Oracle ERP, creates the supplier site, and notifies the merchandising team via Microsoft Teams to initiate buyer relationship setup."
  tags:
    - procurement
    - oracle
    - erp
    - microsoft-teams
    - supplier-management
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: supplier-ops
      port: 8080
      tools:
        - name: onboard-merchandise-supplier
          description: "Given a supplier name, contact email, and category, create the supplier record in Oracle ERP, provision the supplier site, and notify the Microsoft Teams merchandising channel. Use when a new merchandise supplier passes qualification review."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the merchandise supplier."
            - name: supplier_email
              in: body
              type: string
              description: "Primary contact email for the supplier."
            - name: category
              in: body
              type: string
              description: "Merchandise category (e.g. Apparel, Electronics, Food)."
          steps:
            - name: create-oracle-supplier
              type: call
              call: oracle-suppliers.create-supplier
              with:
                Supplier: "{{supplier_name}}"
                EmailAddress: "{{supplier_email}}"
            - name: notify-merchandising
              type: call
              call: msteams-supplier.send-channel-message
              with:
                team_id: "$secrets.msteams_merch_team_id"
                channel_id: "$secrets.msteams_merch_channel_id"
                content: "New supplier onboarded: {{supplier_name}} | Category: {{category}} | Oracle ID: {{create-oracle-supplier.SupplierId}}. Buyer setup required."
  consumes:
    - type: http
      namespace: oracle-suppliers
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/11.13.18.05"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - 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: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves the current on-call engineer for a PagerDuty schedule.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Retrieves the current on-call engineer for a PagerDuty schedule."
  tags:
    - operations
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: get-oncall
          description: "Given a PagerDuty schedule ID, return the current on-call user. Use for incident escalation routing."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID."
          call: pagerduty.get-oncall
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.schedule.final_schedule.rendered_schedule_entries[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: schedules
          path: "/schedules/{{schedule_id}}"
          inputParameters:
            - name: schedule_id
              in: path
          operations:
            - name: get-oncall
              method: GET

Checks the latest refresh status for a Power BI dataset.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the latest refresh status for a Power BI dataset."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a Power BI dataset ID, return the latest refresh status and any errors. Use for BI pipeline monitoring."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset GUID."
          call: power-bi.get-refresh
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Triggers a Power BI dataset refresh for the weekly retail sales performance report and notifies the merchandising team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Power BI Weekly Retail Sales Report Refresh"
  description: "Triggers a Power BI dataset refresh for the weekly retail sales performance report and notifies the merchandising team via Microsoft Teams."
  tags:
    - data
    - power-bi
    - microsoft-teams
    - reporting
    - retail
    - sales
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-weekly-sales-report
          description: "Given a Power BI workspace and dataset ID for the weekly retail sales report, trigger a dataset refresh and notify the merchandising Microsoft Teams channel. Use every Monday morning or after Oracle ERP data loads complete."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Power BI workspace ID containing the retail sales dataset."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: pbi-sales.refresh-dataset
              with:
                workspace_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-merchandising
              type: call
              call: msteams-merch.send-channel-message
              with:
                team_id: "$secrets.msteams_merch_team_id"
                channel_id: "$secrets.msteams_merch_channel_id"
                content: "Weekly retail sales report refresh triggered for dataset {{dataset_id}}. Report will be current within minutes."
  consumes:
    - type: http
      namespace: pbi-sales
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refresh
          path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams-merch
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a product recall is initiated, queries Oracle for affected stores, creates a Salesforce case, and broadcasts to store managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Product Recall Notification Orchestrator"
  description: "When a product recall is initiated, queries Oracle for affected stores, creates a Salesforce case, and broadcasts to store managers via Microsoft Teams."
  tags:
    - compliance
    - oracle
    - salesforce
    - microsoft-teams
    - product-safety
capability:
  exposes:
    - type: mcp
      namespace: product-safety
      port: 8080
      tools:
        - name: process-recall
          description: "Given a DPCI and recall reason, find affected stores, create tracking case, and notify managers."
          inputParameters:
            - name: dpci
              in: body
              type: string
              description: "Target DPCI."
            - name: recall_reason
              in: body
              type: string
              description: "Recall reason."
          steps:
            - name: get-affected-stores
              type: call
              call: oracle.get-item-stock
              with:
                dpci: "{{dpci}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Recall: {{dpci}}"
                description: "{{recall_reason}}. Stores: {{get-affected-stores.store_count}}."
                priority: Critical
            - name: notify-managers
              type: call
              call: msteams.send-channel-message
              with:
                team_id: store-managers
                channel: recalls
                text: "RECALL: DPCI {{dpci}}. {{recall_reason}}. {{get-affected-stores.store_count}} stores affected. Case: {{create-case.case_number}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: inventory
          path: "/inventoryItems/{{dpci}}/stockLevels"
          inputParameters:
            - name: dpci
              in: path
          operations:
            - name: get-item-stock
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - 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}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Snowflake for compliance metrics, generates a SharePoint report, and distributes to the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Audit Report"
  description: "Queries Snowflake for compliance metrics, generates a SharePoint report, and distributes to the compliance team via Microsoft Teams."
  tags:
    - compliance
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Given a fiscal quarter and year, query metrics and notify the compliance team."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Quarter (Q1-Q4)."
            - name: fiscal_year
              in: body
              type: string
              description: "Year."
          steps:
            - name: query-metrics
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT control_area, pass_count, fail_count FROM COMPLIANCE.QUARTERLY_METRICS WHERE fiscal_quarter = '{{fiscal_quarter}}' AND fiscal_year = '{{fiscal_year}}'"
            - name: create-report
              type: call
              call: sharepoint.create-document
              with:
                name: "Compliance-{{fiscal_quarter}}-{{fiscal_year}}.xlsx"
                data: "{{query-metrics.results}}"
            - name: notify
              type: call
              call: msteams.send-channel-message
              with:
                team_id: compliance-team
                channel: general
                text: "Compliance report for {{fiscal_quarter}} {{fiscal_year}}: {{create-report.web_url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/target.sharepoint.com/drive/root:/{{name}}:/content"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: create-document
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a Salesforce contact by ID and returns name, email, account, and phone number.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Retrieves a Salesforce contact by ID and returns name, email, account, and phone number."
  tags:
    - sales
    - salesforce
    - contact
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: get-contact
          description: "Given a Salesforce contact ID, return the contact name, email, account name, and phone. Use for sales team contact lookups."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "Salesforce contact ID."
          call: salesforce.get-contact
          with:
            contact_id: "{{contact_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: email
              type: string
              mapping: "$.Email"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET

When a Target guest service Salesforce case is escalated, creates a ServiceNow incident for cross-functional resolution and notifies the guest experience team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Customer Case Escalation"
  description: "When a Target guest service Salesforce case is escalated, creates a ServiceNow incident for cross-functional resolution and notifies the guest experience team via Microsoft Teams."
  tags:
    - crm
    - salesforce
    - servicenow
    - microsoft-teams
    - customer-support
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: guest-ops
      port: 8080
      tools:
        - name: escalate-guest-case
          description: "Given a Salesforce case ID for an escalated guest complaint, fetch case details, open a ServiceNow incident for cross-team resolution, and notify the guest experience Microsoft Teams channel. Use when a case is flagged for executive escalation."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID being escalated."
          steps:
            - name: get-case
              type: call
              call: sf-cases.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-snow-incident
              type: call
              call: snow-guest.create-incident
              with:
                category: "guest_escalation"
                short_description: "Guest escalation: {{get-case.Subject}}"
                assigned_group: "Guest_Experience"
                description: "Salesforce case {{case_id}} escalated. Guest: {{get-case.ContactId}}. Issue: {{get-case.Description}}"
            - name: notify-guest-exp
              type: call
              call: msteams-guest.send-channel-message
              with:
                team_id: "$secrets.msteams_guest_team_id"
                channel_id: "$secrets.msteams_guest_channel_id"
                content: "Guest escalation: Case {{case_id}} | {{get-case.Subject}} | ServiceNow: {{create-snow-incident.number}} | Immediate response required"
  consumes:
    - type: http
      namespace: sf-cases
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: snow-guest
      baseUri: "https://target.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-guest
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a Salesforce account record for a retail vendor partner, summarizing open opportunities, outstanding cases, and recent activity for pre-meeting preparation.

naftiko: "0.5"
info:
  label: "Salesforce Retail Account Health Summary"
  description: "Retrieves a Salesforce account record for a retail vendor partner, summarizing open opportunities, outstanding cases, and recent activity for pre-meeting preparation."
  tags:
    - crm
    - salesforce
    - retail
    - account-management
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: crm-ops
      port: 8080
      tools:
        - name: get-vendor-account-health
          description: "Given a Salesforce account ID for a retail vendor partner, retrieve account details and open opportunities. Use before vendor review meetings or for quarterly business reviews."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID (18-char) for the vendor partner."
          steps:
            - name: get-account
              type: call
              call: sf-accounts.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-opportunities
              type: call
              call: sf-opps.query-opportunities
              with:
                account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: sf-accounts
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: sf-opps
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: opportunity-query
          path: "/query"
          inputParameters:
            - name: account_id
              in: query
          operations:
            - name: query-opportunities
              method: GET

Creates a new partnership opportunity in Salesforce for an approved vendor and notifies the merchandising team in Microsoft Teams to begin negotiations.

naftiko: "0.5"
info:
  label: "Salesforce Vendor Partnership Opportunity Creation"
  description: "Creates a new partnership opportunity in Salesforce for an approved vendor and notifies the merchandising team in Microsoft Teams to begin negotiations."
  tags:
    - crm
    - salesforce
    - microsoft-teams
    - vendor-management
    - sales
capability:
  exposes:
    - type: mcp
      namespace: vendor-sales
      port: 8080
      tools:
        - name: create-vendor-opportunity
          description: "Given a vendor account ID, opportunity name, expected deal value, and close date, create a Salesforce opportunity for a vendor partnership and notify the merchandising Microsoft Teams channel. Use when a new vendor is approved for consideration."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID of the vendor."
            - name: opportunity_name
              in: body
              type: string
              description: "Name of the partnership opportunity."
            - name: amount
              in: body
              type: number
              description: "Expected deal value in USD."
            - name: close_date
              in: body
              type: string
              description: "Expected close date in YYYY-MM-DD format."
          steps:
            - name: create-opportunity
              type: call
              call: sf-opps-create.create-opportunity
              with:
                AccountId: "{{account_id}}"
                Name: "{{opportunity_name}}"
                Amount: "{{amount}}"
                CloseDate: "{{close_date}}"
                StageName: "Qualification"
            - name: notify-merch
              type: call
              call: msteams-vendor.send-channel-message
              with:
                team_id: "$secrets.msteams_merch_team_id"
                channel_id: "$secrets.msteams_merch_channel_id"
                content: "New vendor opportunity: {{opportunity_name}} | Account: {{account_id}} | Value: ${{amount}} | Close: {{close_date}} | Salesforce ID: {{create-opportunity.id}}"
  consumes:
    - type: http
      namespace: sf-opps-create
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: msteams-vendor
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Snowflake for seasonal demand patterns, creates Workday requisitions for peak staffing, and notifies regional HR via Teams.

naftiko: "0.5"
info:
  label: "Seasonal Workforce Planning Orchestrator"
  description: "Queries Snowflake for seasonal demand patterns, creates Workday requisitions for peak staffing, and notifies regional HR via Teams."
  tags:
    - hr
    - workforce-planning
    - snowflake
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workforce-planning
      port: 8080
      tools:
        - name: plan-seasonal-hiring
          description: "Given a district and season, query demand, create requisitions, and notify HR."
          inputParameters:
            - name: district
              in: body
              type: string
              description: "District code."
            - name: season
              in: body
              type: string
              description: "Season name."
          steps:
            - name: get-forecast
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT store_id, AVG(peak_headcount) as avg_peak FROM HR.SEASONAL_DEMAND WHERE district = '{{district}}' AND season = '{{season}}' GROUP BY store_id"
            - name: create-requisitions
              type: call
              call: workday.create-requisition
              with:
                district: "{{district}}"
                job_profile: "Seasonal Team Member"
                positions: "{{get-forecast.total_positions}}"
            - name: notify-hr
              type: call
              call: msteams.send-channel-message
              with:
                team_id: regional-hr
                channel: "{{district}}"
                text: "Seasonal hiring for {{district}} ({{season}}): {{get-forecast.total_positions}} positions."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/target/jobRequisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a GitHub security advisory is detected, creates a Jira remediation ticket and posts to the security Slack channel.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Tracker"
  description: "When a GitHub security advisory is detected, creates a Jira remediation ticket and posts to the security Slack channel."
  tags:
    - security
    - github
    - jira
    - slack
    - vulnerability
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: track-vulnerability
          description: "Given a GitHub repo and advisory ID, fetch advisory details, create a Jira ticket, and alert security. Use when Dependabot alerts fire."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository."
            - name: advisory_id
              in: body
              type: string
              description: "Advisory ID."
          steps:
            - name: get-advisory
              type: call
              call: github.get-advisory
              with:
                repo_name: "{{repo_name}}"
                advisory_id: "{{advisory_id}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: SEC
                issue_type: Bug
                summary: "{{get-advisory.severity}}: {{get-advisory.summary}} in {{repo_name}}"
            - name: notify-security
              type: call
              call: slack.post-message
              with:
                channel: "security-alerts"
                text: "{{get-advisory.severity}} vulnerability in {{repo_name}}: {{get-advisory.summary}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: advisories
          path: "/repos/{{repo_name}}/security-advisories/{{advisory_id}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: advisory_id
              in: path
          operations:
            - name: get-advisory
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Opens a ServiceNow change request for a planned store system update, routes it for IT change advisory board approval, and notifies the change manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request for Store System Deployment"
  description: "Opens a ServiceNow change request for a planned store system update, routes it for IT change advisory board approval, and notifies the change manager via Microsoft Teams."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - change-management
    - retail
    - devops
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: open-store-change-request
          description: "Given a deployment description, affected store list, scheduled window, and risk level, create a ServiceNow change request and notify the IT change manager in Microsoft Teams. Use before any planned production deployment affecting store systems."
          inputParameters:
            - name: description
              in: body
              type: string
              description: "Description of the store system change being requested."
            - name: affected_stores
              in: body
              type: string
              description: "Comma-separated list of affected store numbers."
            - name: scheduled_start
              in: body
              type: string
              description: "Maintenance window start time in ISO 8601 format."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, moderate, or high."
          steps:
            - name: create-change
              type: call
              call: snow-change.create-change
              with:
                short_description: "Store system change: {{description}}"
                category: "store_deployment"
                risk: "{{risk_level}}"
                start_date: "{{scheduled_start}}"
                description: "Affected stores: {{affected_stores}}. Change: {{description}}"
            - name: notify-change-manager
              type: call
              call: msteams-change.send-channel-message
              with:
                team_id: "$secrets.msteams_it_team_id"
                channel_id: "$secrets.msteams_change_channel_id"
                content: "Change request submitted: {{create-change.number}} | {{description}} | Stores: {{affected_stores}} | Risk: {{risk_level}} | Scheduled: {{scheduled_start}}"
  consumes:
    - type: http
      namespace: snow-change
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              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: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a ServiceNow incident by number and returns status, priority, assigned group, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number and returns status, priority, assigned group, and resolution notes."
  tags:
    - itsm
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, return its current state, priority, assignment group, and resolution notes. Use for incident status checks."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g. INC0012345)."
          call: servicenow.get-incident
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result[0].state"
            - name: priority
              type: string
              mapping: "$.result[0].priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://target.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 incident approaches SLA breach, pages on-call via PagerDuty and posts to the ops Slack channel.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "When a ServiceNow incident approaches SLA breach, pages on-call via PagerDuty and posts to the ops Slack channel."
  tags:
    - itsm
    - servicenow
    - pagerduty
    - slack
    - sla
capability:
  exposes:
    - type: mcp
      namespace: sla-mgmt
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given an incident number, check SLA status, page on-call, and notify ops."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{get-incident.assignment_group}}"
                title: "SLA breach risk: {{incident_number}}"
                urgency: high
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "ops-escalations"
                text: "SLA breach imminent: {{incident_number}} ({{get-incident.priority}}). On-call paged."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a store associate reports a POS or IT system failure via ServiceNow, creates a P1 incident, alerts the store IT support team in Microsoft Teams, and logs a Datadog event.

naftiko: "0.5"
info:
  label: "ServiceNow Store IT Incident Management"
  description: "When a store associate reports a POS or IT system failure via ServiceNow, creates a P1 incident, alerts the store IT support team in Microsoft Teams, and logs a Datadog event."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - datadog
    - incident-response
    - retail
capability:
  exposes:
    - type: mcp
      namespace: store-itsm
      port: 8080
      tools:
        - name: handle-store-it-incident
          description: "Given a store number, system type, and problem description, create a P1 ServiceNow incident, alert the store IT support Microsoft Teams channel, and post a Datadog event for observability. Use when critical store systems (POS, network) fail."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "Target store number reporting the incident (e.g. T-2345)."
            - name: system_type
              in: body
              type: string
              description: "Type of system affected: POS, network, self-checkout, or back-office."
            - name: description
              in: body
              type: string
              description: "Detailed description of the IT incident."
          steps:
            - name: create-incident
              type: call
              call: snow-p1.create-incident
              with:
                category: "store_it"
                short_description: "{{system_type}} failure at store {{store_number}}"
                assigned_group: "Store_IT_Support"
                description: "{{description}}"
                priority: "1"
            - name: notify-it-support
              type: call
              call: msteams-it.send-channel-message
              with:
                team_id: "$secrets.msteams_it_team_id"
                channel_id: "$secrets.msteams_it_channel_id"
                content: "P1 IT INCIDENT: Store {{store_number}} | System: {{system_type}} | {{description}} | Ticket: {{create-incident.number}}"
            - name: log-dd-event
              type: call
              call: datadog-store.create-event
              with:
                title: "Store IT Incident: {{store_number}} {{system_type}}"
                text: "{{description}}"
                tags: "store:{{store_number}},system:{{system_type}},source:servicenow"
  consumes:
    - type: http
      namespace: snow-p1
      baseUri: "https://target.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-it
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST
    - type: http
      namespace: datadog-store
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST

Searches SharePoint for documents matching a keyword query.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches SharePoint for documents matching a keyword query."
  tags:
    - knowledge
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: search-documents
          description: "Given a search keyword, return matching SharePoint documents. Use for document discovery."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Keyword search query."
          call: sharepoint.search-docs
          with:
            search_query: "{{search_query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/sites/target.sharepoint.com/drive/root/search(q='{{search_query}}')"
          inputParameters:
            - name: search_query
              in: query
          operations:
            - name: search-docs
              method: GET

When a Shipt delivery encounters an exception, creates a Salesforce case and notifies the delivery operations Slack channel.

naftiko: "0.5"
info:
  label: "Shipt Delivery Exception Handler"
  description: "When a Shipt delivery encounters an exception, creates a Salesforce case and notifies the delivery operations Slack channel."
  tags:
    - delivery
    - salesforce
    - slack
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: delivery-ops
      port: 8080
      tools:
        - name: handle-delivery-exception
          description: "Given an order number and exception type, create a case and notify delivery ops."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "Order number."
            - name: exception_type
              in: body
              type: string
              description: "Exception type."
            - name: guest_email
              in: body
              type: string
              description: "Guest email."
          steps:
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Delivery exception: {{order_number}} — {{exception_type}}"
                contact_email: "{{guest_email}}"
                priority: High
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "delivery-ops"
                text: "Delivery exception for order {{order_number}}: {{exception_type}}. Case: {{create-case.case_number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the last 20 messages from a Slack channel for quick context gathering.

naftiko: "0.5"
info:
  label: "Slack Channel History Lookup"
  description: "Retrieves the last 20 messages from a Slack channel for quick context gathering."
  tags:
    - communication
    - slack
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: get-channel-history
          description: "Given a Slack channel ID, return the last 20 messages. Use when summarizing recent channel activity."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Slack channel ID."
          call: slack.get-history
          with:
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: messages
              type: array
              mapping: "$.messages"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: conversations
          path: "/conversations.history?channel={{channel_id}}&limit=20"
          inputParameters:
            - name: channel_id
              in: query
          operations:
            - name: get-history
              method: GET

Triggers a Snowflake data pipeline refresh for Target Circle loyalty program analytics and notifies the loyalty team in Microsoft Teams when complete.

naftiko: "0.5"
info:
  label: "Snowflake Customer Loyalty Analytics Refresh"
  description: "Triggers a Snowflake data pipeline refresh for Target Circle loyalty program analytics and notifies the loyalty team in Microsoft Teams when complete."
  tags:
    - data
    - snowflake
    - microsoft-teams
    - loyalty
    - retail
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: loyalty-analytics
      port: 8080
      tools:
        - name: refresh-loyalty-analytics
          description: "Given a Snowflake database and schema for loyalty data, trigger the ETL task pipeline and notify the loyalty team Microsoft Teams channel. Use weekly or after bulk loyalty transaction uploads."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "Snowflake database containing loyalty analytics tables."
            - name: schema
              in: body
              type: string
              description: "Snowflake schema for Target Circle loyalty data."
            - name: task_name
              in: body
              type: string
              description: "Snowflake task name to resume and trigger."
          steps:
            - name: resume-task
              type: call
              call: snowflake-loyalty.resume-task
              with:
                database: "{{database}}"
                schema: "{{schema}}"
                task_name: "{{task_name}}"
            - name: notify-loyalty-team
              type: call
              call: msteams-loyalty.send-channel-message
              with:
                team_id: "$secrets.msteams_loyalty_team_id"
                channel_id: "$secrets.msteams_loyalty_channel_id"
                content: "Loyalty analytics pipeline triggered: {{database}}.{{schema}}.{{task_name}}. Data refresh in progress."
  consumes:
    - type: http
      namespace: snowflake-loyalty
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-resume
          path: "/databases/{{database}}/schemas/{{schema}}/tasks/{{task_name}}:resume"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
            - name: task_name
              in: path
          operations:
            - name: resume-task
              method: POST
    - type: http
      namespace: msteams-loyalty
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When Snowflake data quality checks fail, creates a Jira ticket and posts to the data-ops Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert to Jira"
  description: "When Snowflake data quality checks fail, creates a Jira ticket and posts to the data-ops Slack channel."
  tags:
    - data-engineering
    - snowflake
    - jira
    - slack
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: handle-dq-failure
          description: "Given a table name and check type, query failures, create Jira ticket, and notify data ops."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Snowflake table name."
            - name: check_type
              in: body
              type: string
              description: "Check type."
          steps:
            - name: get-failures
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT check_name, expected_value, actual_value FROM DATA_OPS.DQ_RESULTS WHERE table_name = '{{table_name}}' AND check_type = '{{check_type}}' AND status = 'FAIL' LIMIT 5"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issue_type: Bug
                summary: "DQ failure: {{check_type}} on {{table_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "data-ops-alerts"
                text: "DQ {{check_type}} failed on {{table_name}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Snowflake task fails, queries error details, creates a Jira ticket, and alerts data-ops via Slack.

naftiko: "0.5"
info:
  label: "Snowflake ETL Pipeline Failure Handler"
  description: "When a Snowflake task fails, queries error details, creates a Jira ticket, and alerts data-ops via Slack."
  tags:
    - data-engineering
    - snowflake
    - jira
    - slack
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-etl-failure
          description: "Given a Snowflake task name, query failure details, create Jira ticket, and notify data ops."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake task name."
          steps:
            - name: get-error
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT error_code, error_message FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}', RESULT_LIMIT=>1)) WHERE state = 'FAILED'"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issue_type: Bug
                summary: "ETL failure: {{task_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "data-ops-alerts"
                text: "ETL {{task_name}} failed: {{get-error.error_message}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Snowflake for current inventory levels by DPCI and distribution center.

naftiko: "0.5"
info:
  label: "Snowflake Inventory Level Query"
  description: "Queries Snowflake for current inventory levels by DPCI and distribution center."
  tags:
    - supply-chain
    - snowflake
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: query-inventory
          description: "Given a DPCI and distribution center code, return current on-hand quantity and days-of-supply. Use for replenishment planning."
          inputParameters:
            - name: dpci
              in: body
              type: string
              description: "Target DPCI item number."
            - name: dc_code
              in: body
              type: string
              description: "Distribution center code."
          call: snowflake.execute-query
          with:
            statement: "SELECT dpci, on_hand_qty, in_transit_qty, days_of_supply FROM SUPPLY_CHAIN.INVENTORY WHERE dpci = '{{dpci}}' AND dc_code = '{{dc_code}}'"
          outputParameters:
            - name: on_hand_qty
              type: integer
              mapping: "$.data[0][1]"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Queries Snowflake for daily retail sales data pipeline health, checks for stale or failed loads, and alerts the data engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Snowflake Retail Sales Analytics Pipeline Check"
  description: "Queries Snowflake for daily retail sales data pipeline health, checks for stale or failed loads, and alerts the data engineering team via Microsoft Teams."
  tags:
    - data
    - snowflake
    - microsoft-teams
    - monitoring
    - data-engineering
    - retail
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-sales-pipeline-health
          description: "Query Snowflake task history for the retail sales data pipeline and post a health status to the Microsoft Teams data-engineering channel. Use as a daily morning check before business analytics reports run."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "Snowflake database containing the retail sales pipeline tasks."
            - name: schema
              in: body
              type: string
              description: "Snowflake schema for the retail sales ETL tasks."
          steps:
            - name: check-tasks
              type: call
              call: snowflake-pipeline.query-tasks
              with:
                database: "{{database}}"
                schema: "{{schema}}"
            - name: post-health
              type: call
              call: msteams-data.send-channel-message
              with:
                team_id: "$secrets.msteams_data_team_id"
                channel_id: "$secrets.msteams_data_channel_id"
                content: "Retail sales pipeline health check for {{database}}.{{schema}}: Task history retrieved. Review any failed runs before reports execute."
  consumes:
    - type: http
      namespace: snowflake-pipeline
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/{{schema}}/tasks"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
          operations:
            - name: query-tasks
              method: GET
    - type: http
      namespace: msteams-data
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Snowflake for data quality anomalies in daily store sales feeds, and creates a ServiceNow data quality incident if row counts or null rates exceed expected thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Store Sales Data Quality Check"
  description: "Queries Snowflake for data quality anomalies in daily store sales feeds, and creates a ServiceNow data quality incident if row counts or null rates exceed expected thresholds."
  tags:
    - data
    - snowflake
    - servicenow
    - data-quality
    - retail
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: dq-ops
      port: 8080
      tools:
        - name: check-sales-data-quality
          description: "Given a Snowflake database and schema, query the data quality monitoring view for store sales feed anomalies (row count drops, null spikes) and open a ServiceNow data quality incident if thresholds are breached. Use as a daily pre-business-hours check."
          inputParameters:
            - name: database
              in: body
              type: string
              description: "Snowflake database containing the store sales data."
            - name: schema
              in: body
              type: string
              description: "Snowflake schema for retail sales monitoring views."
          steps:
            - name: run-dq-check
              type: call
              call: snowflake-dq.query-dq-view
              with:
                database: "{{database}}"
                schema: "{{schema}}"
            - name: create-dq-incident
              type: call
              call: snow-dq.create-incident
              with:
                category: "data_quality"
                short_description: "Sales data quality anomaly detected in {{database}}.{{schema}}"
                assigned_group: "Data_Engineering"
                description: "Snowflake data quality check failed for {{database}}.{{schema}}. Anomalies detected: {{run-dq-check.total}}. Review before morning reports execute."
  consumes:
    - type: http
      namespace: snowflake-dq
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: dq-views
          path: "/databases/{{database}}/schemas/{{schema}}/tables"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
          operations:
            - name: query-dq-view
              method: GET
    - type: http
      namespace: snow-dq
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

When Splunk detects a security anomaly, creates a ServiceNow incident and notifies SOC via Slack.

naftiko: "0.5"
info:
  label: "Splunk Security Alert to Incident"
  description: "When Splunk detects a security anomaly, creates a ServiceNow incident and notifies SOC via Slack."
  tags:
    - security
    - splunk
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: soc
      port: 8080
      tools:
        - name: handle-security-alert
          description: "Given a Splunk search ID and alert type, fetch results, create incident, and alert SOC."
          inputParameters:
            - name: search_id
              in: body
              type: string
              description: "Splunk search ID."
            - name: alert_type
              in: body
              type: string
              description: "Alert type."
          steps:
            - name: get-results
              type: call
              call: splunk.get-results
              with:
                search_id: "{{search_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                urgency: 2
                short_description: "Security alert: {{alert_type}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "soc-alerts"
                text: "Security alert: {{alert_type}}. Events: {{get-results.event_count}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.target.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: results
          path: "/search/jobs/{{search_id}}/results"
          inputParameters:
            - name: search_id
              in: path
          operations:
            - name: get-results
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://target.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a store reports an IT outage, creates a P1 ServiceNow incident, pages on-call via PagerDuty, and notifies store ops Slack.

naftiko: "0.5"
info:
  label: "Store IT Outage Response Orchestrator"
  description: "When a store reports an IT outage, creates a P1 ServiceNow incident, pages on-call via PagerDuty, and notifies store ops Slack."
  tags:
    - operations
    - servicenow
    - pagerduty
    - slack
    - retail
capability:
  exposes:
    - type: mcp
      namespace: store-ops
      port: 8080
      tools:
        - name: handle-store-outage
          description: "Given a store number and affected system, create P1 incident, page on-call, and notify ops."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "Store number."
            - name: affected_system
              in: body
              type: string
              description: "Affected system."
            - name: impact
              in: body
              type: string
              description: "Business impact."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: store_systems
                urgency: 1
                short_description: "[P1] Store {{store_number}} — {{affected_system}} outage"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: store-systems
                title: "Store {{store_number}} {{affected_system}} outage"
                urgency: high
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "store-ops-critical"
                text: "P1 at Store {{store_number}}: {{affected_system}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a markdown request is submitted, validates inventory in Snowflake, creates a ServiceNow approval, and notifies the category manager via Teams.

naftiko: "0.5"
info:
  label: "Store Markdown Approval Workflow"
  description: "When a markdown request is submitted, validates inventory in Snowflake, creates a ServiceNow approval, and notifies the category manager via Teams."
  tags:
    - merchandising
    - snowflake
    - servicenow
    - microsoft-teams
    - pricing
capability:
  exposes:
    - type: mcp
      namespace: markdown-ops
      port: 8080
      tools:
        - name: submit-markdown
          description: "Given a DPCI and markdown percentage, validate inventory, create approval, and notify manager."
          inputParameters:
            - name: dpci
              in: body
              type: string
              description: "DPCI."
            - name: markdown_pct
              in: body
              type: string
              description: "Markdown percentage."
            - name: manager_email
              in: body
              type: string
              description: "Category manager email."
          steps:
            - name: check-inventory
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT SUM(on_hand_qty) as total FROM SUPPLY_CHAIN.INVENTORY WHERE dpci = '{{dpci}}'"
            - name: create-approval
              type: call
              call: servicenow.create-request
              with:
                category: merchandising
                short_description: "Markdown: {{dpci}} — {{markdown_pct}}% off"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{manager_email}}"
                text: "Markdown request for {{dpci}}: {{markdown_pct}}% off. Inventory: {{check-inventory.total}}. Approval: {{create-approval.number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for planogram compliance scores by store, creates Jira tickets for non-compliant stores, and notifies visual merchandising via Slack.

naftiko: "0.5"
info:
  label: "Store Planogram Compliance Checker"
  description: "Queries Snowflake for planogram compliance scores by store, creates Jira tickets for non-compliant stores, and notifies visual merchandising via Slack."
  tags:
    - merchandising
    - snowflake
    - jira
    - slack
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: visual-merch
      port: 8080
      tools:
        - name: check-planogram-compliance
          description: "Given a district and compliance threshold, identify non-compliant stores and create follow-up tasks."
          inputParameters:
            - name: district
              in: body
              type: string
              description: "District code."
            - name: threshold
              in: body
              type: string
              description: "Minimum compliance score (0-100)."
          steps:
            - name: get-scores
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT store_number, compliance_score, last_audit_date FROM MERCH.PLANOGRAM_COMPLIANCE WHERE district = '{{district}}' AND compliance_score < {{threshold}} ORDER BY compliance_score ASC"
            - name: create-tickets
              type: call
              call: jira.create-issue
              with:
                project: MERCH
                issue_type: Task
                summary: "Planogram compliance: {{get-scores.row_count}} stores below {{threshold}}% in {{district}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "visual-merchandising"
                text: "Planogram audit for {{district}}: {{get-scores.row_count}} stores below {{threshold}}% compliance. Jira: {{create-tickets.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a price change is approved in Oracle, updates the product catalog in Snowflake and notifies the merchandising Slack channel.

naftiko: "0.5"
info:
  label: "Store Price Change Propagation"
  description: "When a price change is approved in Oracle, updates the product catalog in Snowflake and notifies the merchandising Slack channel."
  tags:
    - merchandising
    - oracle
    - snowflake
    - slack
    - pricing
capability:
  exposes:
    - type: mcp
      namespace: merchandising
      port: 8080
      tools:
        - name: propagate-price-change
          description: "Given an item DPCI and new price, update Snowflake catalog and notify merchandising. Use when pricing adjustments are approved."
          inputParameters:
            - name: dpci
              in: body
              type: string
              description: "Target DPCI item number."
            - name: new_price
              in: body
              type: string
              description: "New retail price."
            - name: effective_date
              in: body
              type: string
              description: "Effective date in YYYY-MM-DD."
          steps:
            - name: get-item
              type: call
              call: oracle.get-item
              with:
                dpci: "{{dpci}}"
            - name: update-catalog
              type: call
              call: snowflake.execute-statement
              with:
                statement: "UPDATE RETAIL.PRODUCT_CATALOG SET retail_price = {{new_price}}, price_effective_date = '{{effective_date}}' WHERE dpci = '{{dpci}}'"
            - name: notify-merchandising
              type: call
              call: slack.post-message
              with:
                channel: "merchandising-pricing"
                text: "Price change for {{get-item.description}} ({{dpci}}): ${{new_price}} effective {{effective_date}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: items
          path: "/inventoryItems/{{dpci}}"
          inputParameters:
            - name: dpci
              in: path
          operations:
            - name: get-item
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists all workbooks in a Tableau site filtered by project name.

naftiko: "0.5"
info:
  label: "Tableau Workbook List"
  description: "Lists all workbooks in a Tableau site filtered by project name."
  tags:
    - analytics
    - tableau
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: list-workbooks
          description: "Given a Tableau project name, return all workbooks. Use for analytics asset discovery."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "Tableau project name."
          call: tableau.list-workbooks
          with:
            project_name: "{{project_name}}"
          outputParameters:
            - name: workbooks
              type: array
              mapping: "$.workbooks.workbook"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.target.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks"
          operations:
            - name: list-workbooks
              method: GET

Syncs Target Plus marketplace partner orders from Oracle to Snowflake and sends fulfillment notifications to partners via Slack.

naftiko: "0.5"
info:
  label: "Target Plus Partner Order Sync"
  description: "Syncs Target Plus marketplace partner orders from Oracle to Snowflake and sends fulfillment notifications to partners via Slack."
  tags:
    - marketplace
    - oracle
    - snowflake
    - slack
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: marketplace-ops
      port: 8080
      tools:
        - name: sync-partner-orders
          description: "Given a partner ID and date, sync orders from Oracle to Snowflake and notify the partner channel."
          inputParameters:
            - name: partner_id
              in: body
              type: string
              description: "Target Plus partner ID."
            - name: order_date
              in: body
              type: string
              description: "Order date YYYY-MM-DD."
          steps:
            - name: get-orders
              type: call
              call: oracle.get-partner-orders
              with:
                partner_id: "{{partner_id}}"
                order_date: "{{order_date}}"
            - name: load-to-snowflake
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO MARKETPLACE.PARTNER_ORDERS (partner_id, order_date, order_count, total_gmv) VALUES ('{{partner_id}}', '{{order_date}}', {{get-orders.order_count}}, {{get-orders.total_gmv}})"
            - name: notify-partner
              type: call
              call: slack.post-message
              with:
                channel: "marketplace-partner-{{partner_id}}"
                text: "Partner {{partner_id}} orders for {{order_date}}: {{get-orders.order_count}} orders, ${{get-orders.total_gmv}} GMV."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: partner-orders
          path: "/salesOrders?q=PartnerId={{partner_id}}"
          inputParameters:
            - name: partner_id
              in: query
          operations:
            - name: get-partner-orders
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Detects Terraform state drift, creates a GitHub pull request with the fix, and alerts platform engineering via Slack.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection Remediation"
  description: "Detects Terraform state drift, creates a GitHub pull request with the fix, and alerts platform engineering via Slack."
  tags:
    - infrastructure
    - terraform
    - github
    - slack
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: platform-eng
      port: 8080
      tools:
        - name: handle-terraform-drift
          description: "Given a workspace and drift details, create a remediation PR and notify platform engineering."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Terraform workspace."
            - name: resource_address
              in: body
              type: string
              description: "Resource address with drift."
            - name: drift_summary
              in: body
              type: string
              description: "Drift summary."
          steps:
            - name: create-pr
              type: call
              call: github.create-pr
              with:
                repo: "target/infrastructure"
                head: "fix/drift-{{workspace}}"
                base: main
                title: "Fix drift: {{resource_address}}"
                body: "{{drift_summary}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "platform-engineering"
                text: "Terraform drift in {{workspace}}: {{resource_address}}. PR: {{create-pr.html_url}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: create-pr
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When an Oracle invoice has a price discrepancy, creates a Jira ticket for procurement and notifies the buyer via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Invoice Discrepancy Handler"
  description: "When an Oracle invoice has a price discrepancy, creates a Jira ticket for procurement and notifies the buyer via Microsoft Teams."
  tags:
    - procurement
    - finance
    - oracle
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: handle-invoice-discrepancy
          description: "Given an Oracle invoice number, fetch discrepancy details, create a Jira ticket, and notify the buyer. Use when three-way match failures occur."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "Oracle invoice number."
            - name: buyer_email
              in: body
              type: string
              description: "Buyer email."
          steps:
            - name: get-invoice
              type: call
              call: oracle.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: PROC
                issue_type: Task
                summary: "Invoice discrepancy: {{invoice_number}} — {{get-invoice.variance_amount}}"
            - name: notify-buyer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{buyer_email}}"
                text: "Invoice {{invoice_number}} discrepancy: {{get-invoice.variance_amount}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_number}}"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://target.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for weekly store sales metrics and posts a digest to the district leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Weekly Store Performance Digest"
  description: "Queries Snowflake for weekly store sales metrics and posts a digest to the district leadership Microsoft Teams channel."
  tags:
    - analytics
    - retail
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: retail-reporting
      port: 8080
      tools:
        - name: publish-store-performance
          description: "Given a district and week ending date, query Snowflake for store performance and send a digest to Teams. Use for weekly leadership reviews."
          inputParameters:
            - name: district
              in: body
              type: string
              description: "District code."
            - name: week_ending
              in: body
              type: string
              description: "Week ending date in YYYY-MM-DD."
          steps:
            - name: query-performance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT store_id, SUM(net_sales) as total_sales, SUM(transactions) as txns FROM RETAIL.WEEKLY_STORE_METRICS WHERE district = '{{district}}' AND week_ending = '{{week_ending}}' GROUP BY store_id ORDER BY total_sales DESC"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "{{district}}-leadership"
                channel: "store-performance"
                text: "Weekly performance for district {{district}} ending {{week_ending}}: {{query-performance.row_count}} stores reported."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Workday for team members who have not completed benefits enrollment and sends reminders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for team members who have not completed benefits enrollment and sends reminders via Microsoft Teams."
  tags:
    - hr
    - workday
    - microsoft-teams
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment deadline, find incomplete enrollments and send reminders."
          inputParameters:
            - name: enrollment_deadline
              in: body
              type: string
              description: "Deadline in YYYY-MM-DD."
          steps:
            - name: get-pending
              type: call
              call: workday.get-pending-enrollments
              with:
                deadline: "{{enrollment_deadline}}"
            - name: send-reminders
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-pending.employee_emails}}"
                text: "Reminder: Benefits enrollment due by {{enrollment_deadline}}. Complete in Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/target/benefits/pendingEnrollments"
          operations:
            - name: get-pending-enrollments
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a Workday employee by worker ID and returns their name, department, job title, and manager.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Looks up a Workday employee by worker ID and returns their name, department, job title, and manager."
  tags:
    - hr
    - workday
    - employee
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Given a Workday worker ID, return employee name, department, job title, location, and manager. Use for HR inquiries."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.d.FullName"
            - name: department
              type: string
              mapping: "$.d.Department"
  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: "/target/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

When an employee is terminated in Workday, deactivates their Microsoft 365 account, closes their open ServiceNow tickets, and notifies HR operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Employee Offboarding"
  description: "When an employee is terminated in Workday, deactivates their Microsoft 365 account, closes their open ServiceNow tickets, and notifies HR operations via Microsoft Teams."
  tags:
    - hr
    - workday
    - microsoft-teams
    - servicenow
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: offboard-employee
          description: "Given a Workday worker ID and Microsoft 365 user ID, deactivate the M365 account via Microsoft Graph, search for open ServiceNow tickets, and notify #hr-ops in Teams. Use on confirmed termination in Workday."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID of the departing employee."
            - name: m365_user_id
              in: body
              type: string
              description: "Microsoft 365 user object ID to deactivate."
            - name: snow_user_email
              in: body
              type: string
              description: "ServiceNow user email to search for open tickets."
          steps:
            - name: disable-m365-account
              type: call
              call: graph-users.update-user
              with:
                user_id: "{{m365_user_id}}"
                accountEnabled: "false"
            - name: find-open-tickets
              type: call
              call: snow-offboard.query-incidents
              with:
                caller_id: "{{snow_user_email}}"
                state: "1"
            - name: notify-hr
              type: call
              call: msteams-hr.send-channel-message
              with:
                team_id: "$secrets.msteams_hr_team_id"
                channel_id: "$secrets.msteams_hr_channel_id"
                content: "Offboarding complete for worker {{worker_id}}. M365 account {{m365_user_id}} disabled. Open ServiceNow tickets: {{find-open-tickets.total_count}} — reassign before departure."
  consumes:
    - type: http
      namespace: graph-users
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user-record
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: snow-offboard
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: caller_id
              in: query
            - name: state
              in: query
          operations:
            - name: query-incidents
              method: GET
    - type: http
      namespace: msteams-hr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new job requisition is created in Workday, validates budget in Oracle, creates a ServiceNow approval, and notifies the hiring manager.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Approval Flow"
  description: "When a new job requisition is created in Workday, validates budget in Oracle, creates a ServiceNow approval, and notifies the hiring manager."
  tags:
    - hr
    - workday
    - oracle
    - servicenow
    - microsoft-teams
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: process-job-requisition
          description: "Given a Workday requisition ID, validate budget, create approval, and notify manager."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: check-budget
              type: call
              call: oracle.get-budget
              with:
                cost_center: "{{get-requisition.cost_center}}"
            - name: create-approval
              type: call
              call: servicenow.create-request
              with:
                category: hr_recruiting
                short_description: "Requisition: {{get-requisition.job_title}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-requisition.hiring_manager_email}}"
                text: "Your requisition for {{get-requisition.job_title}} is submitted. Budget: {{check-budget.remaining}}. Ticket: {{create-approval.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: requisitions
          path: "/target/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://target.oraclecloud.com/fscmRestApi/resources/v2"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: budgets
          path: "/budgets/{{cost_center}}"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new store associate is hired in Workday, creates a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Teams welcome message to the store manager.

naftiko: "0.5"
info:
  label: "Workday New Store Associate Onboarding"
  description: "When a new store associate is hired in Workday, creates a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Teams welcome message to the store manager."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: onboard-store-associate
          description: "Given a Workday worker ID and store number, fetch new hire details, open a ServiceNow onboarding ticket for IT provisioning, and send a Teams welcome message to the store manager. Use when a new store associate hire is confirmed in Workday."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID for the new associate."
            - name: store_number
              in: body
              type: string
              description: "Target store number the associate is assigned to (e.g. T-2345)."
            - name: manager_upn
              in: body
              type: string
              description: "UPN of the store manager in Microsoft Teams."
          steps:
            - name: get-worker
              type: call
              call: workday-workers.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-onboarding-ticket
              type: call
              call: servicenow-onboard.create-incident
              with:
                category: "hr_onboarding"
                short_description: "New associate onboarding: {{get-worker.fullName}} at store {{store_number}}"
                assigned_group: "Store_IT_Support"
                description: "Provision access for {{get-worker.fullName}} (Worker ID: {{worker_id}}) at store {{store_number}}. Start date: {{get-worker.hireDate}}"
            - name: send-welcome
              type: call
              call: msteams-store.send-message
              with:
                recipient_upn: "{{manager_upn}}"
                content: "New team member {{get-worker.fullName}} joining store {{store_number}}. Onboarding ticket: {{create-onboarding-ticket.number}}"
  consumes:
    - type: http
      namespace: workday-workers
      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-onboard
      baseUri: "https://target.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-store
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user-messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an org restructure occurs in Workday, updates Okta groups and notifies affected managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Organizational Change Sync"
  description: "When an org restructure occurs in Workday, updates Okta groups and notifies affected managers via Microsoft Teams."
  tags:
    - hr
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: org-mgmt
      port: 8080
      tools:
        - name: sync-org-change
          description: "Given a Workday org ID, fetch structure, update Okta, and notify managers."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "Workday org ID."
          steps:
            - name: get-org
              type: call
              call: workday.get-org
              with:
                org_id: "{{org_id}}"
            - name: update-okta
              type: call
              call: okta.sync-group-members
              with:
                group_name: "{{get-org.org_name}}"
                members: "{{get-org.member_emails}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-org.manager_email}}"
                text: "Org change for {{get-org.org_name}}: {{get-org.member_count}} members updated."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: organizations
          path: "/target/organizations/{{org_id}}"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: get-org
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://target.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/groups/{{group_name}}/users"
          inputParameters:
            - name: group_name
              in: path
          operations:
            - name: sync-group-members
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Fetches active store headcount by location from Workday and posts a formatted report to the finance Microsoft Teams channel for workforce cost planning.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount by Store"
  description: "Fetches active store headcount by location from Workday and posts a formatted report to the finance Microsoft Teams channel for workforce cost planning."
  tags:
    - hr
    - finance
    - workday
    - microsoft-teams
    - reporting
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: publish-store-headcount
          description: "Retrieve active store associate headcount by location from Workday and post the summary to the Microsoft Teams finance channel. Use monthly for store labor cost reviews or weekly for scheduling optimization."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "Headcount report date in YYYY-MM-DD format."
          steps:
            - name: get-headcount
              type: call
              call: workday-hc.get-workers
              with:
                as_of_date: "{{as_of_date}}"
            - name: post-report
              type: call
              call: msteams-finance.send-channel-message
              with:
                team_id: "$secrets.msteams_finance_team_id"
                channel_id: "$secrets.msteams_finance_channel_id"
                content: "Store headcount as of {{as_of_date}}: Total active associates: {{get-headcount.total}}. Report sourced from Workday."
  consumes:
    - type: http
      namespace: workday-hc
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          inputParameters:
            - name: as_of_date
              in: query
          operations:
            - name: get-workers
              method: GET
    - type: http
      namespace: msteams-finance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Compares Workday payroll results with budgets in Snowflake and alerts the payroll team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Payroll Variance Alert"
  description: "Compares Workday payroll results with budgets in Snowflake and alerts the payroll team via Microsoft Teams."
  tags:
    - finance
    - hr
    - workday
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-ops
      port: 8080
      tools:
        - name: check-payroll-variance
          description: "Given a pay period, compare Workday payroll with budgets and alert payroll team."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period."
          steps:
            - name: get-payroll
              type: call
              call: workday.get-payroll-results
              with:
                pay_period: "{{pay_period}}"
            - name: log-variance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO FINANCE.PAYROLL_VARIANCE (pay_period, total_payroll) VALUES ('{{pay_period}}', {{get-payroll.total_amount}})"
            - name: alert
              type: call
              call: msteams.send-channel-message
              with:
                team_id: payroll-team
                channel: variance-alerts
                text: "Payroll variance for {{pay_period}}: Total ${{get-payroll.total_amount}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll
          path: "/target/payroll/results"
          operations:
            - name: get-payroll-results
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://target.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a team member is promoted in Workday, updates Okta group memberships and creates a ServiceNow access request.

naftiko: "0.5"
info:
  label: "Workday Promotion to Okta Role Update"
  description: "When a team member is promoted in Workday, updates Okta group memberships and creates a ServiceNow access request."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-mgmt
      port: 8080
      tools:
        - name: sync-promotion-access
          description: "Given a Workday worker ID, fetch new role, update Okta groups, and create access request. Use for role changes."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: update-okta
              type: call
              call: okta.update-groups
              with:
                user_login: "{{get-worker.work_email}}"
                new_groups: "{{get-worker.role_groups}}"
            - name: create-request
              type: call
              call: servicenow.create-request
              with:
                category: access_management
                short_description: "Access update: {{get-worker.full_name}} — {{get-worker.job_title}}"
  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: "/target/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://target.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: update-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://target.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

When an employee changes roles in Workday, creates a ServiceNow access change request and notifies IT via Microsoft Teams to update system access entitlements.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Update"
  description: "When an employee changes roles in Workday, creates a ServiceNow access change request and notifies IT via Microsoft Teams to update system access entitlements."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
    - access-management
    - identity
capability:
  exposes:
    - type: mcp
      namespace: access-ops
      port: 8080
      tools:
        - name: provision-role-change-access
          description: "Given a Workday worker ID, old job profile, and new job profile, create a ServiceNow access change request for IT to update application entitlements, and notify the IT access team in Microsoft Teams. Use on Workday position-change events."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID for the employee changing roles."
            - name: old_job_profile
              in: body
              type: string
              description: "Previous job profile or role name."
            - name: new_job_profile
              in: body
              type: string
              description: "New job profile or role name."
          steps:
            - name: get-worker
              type: call
              call: workday-role.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: create-access-request
              type: call
              call: snow-access.create-request
              with:
                short_description: "Access update: {{get-worker.fullName}} from {{old_job_profile}} to {{new_job_profile}}"
                assigned_group: "IT_Access_Management"
                description: "Worker {{worker_id}} role change. Update system entitlements from {{old_job_profile}} to {{new_job_profile}} access profile."
            - name: notify-it-access
              type: call
              call: msteams-access.send-channel-message
              with:
                team_id: "$secrets.msteams_it_team_id"
                channel_id: "$secrets.msteams_access_channel_id"
                content: "Access update needed: {{get-worker.fullName}} ({{worker_id}}) moved from {{old_job_profile}} to {{new_job_profile}}. Request: {{create-access-request.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: snow-access
      baseUri: "https://target.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: service-requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams-access
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a team member is terminated in Workday, deactivates their Okta account and creates a ServiceNow ticket for equipment retrieval.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When a team member is terminated in Workday, deactivates their Okta account and creates a ServiceNow ticket for equipment retrieval."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: process-termination
          description: "Given a Workday worker ID and termination date, deactivate Okta account and open equipment return ticket. Use when processing team member separations."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: termination_date
              in: body
              type: string
              description: "Termination date in YYYY-MM-DD."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                user_login: "{{get-worker.work_email}}"
            - name: open-equipment-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_offboarding
                short_description: "Equipment retrieval: {{get-worker.full_name}} — {{termination_date}}"
                assigned_group: IT_Asset_Management
  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: "/target/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://target.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_login}}/lifecycle/deactivate"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://target.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

Retrieves the current PTO and sick leave balance for a Workday team member.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Check"
  description: "Retrieves the current PTO and sick leave balance for a Workday team member."
  tags:
    - hr
    - workday
    - time-off
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given a Workday worker ID, return the current PTO and sick leave balance. Use for employee time-off inquiries."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday-pto.get-balance
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: pto_balance
              type: number
              mapping: "$.timeOffBalance.ptoHours"
            - name: sick_balance
              type: number
              mapping: "$.timeOffBalance.sickHours"
  consumes:
    - type: http
      namespace: workday-pto
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/target/workers/{{worker_id}}/timeOffBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-balance
              method: GET

When a Zendesk support ticket meets escalation criteria, creates a Salesforce case and notifies the guest services team via Slack.

naftiko: "0.5"
info:
  label: "Zendesk Ticket to Salesforce Case"
  description: "When a Zendesk support ticket meets escalation criteria, creates a Salesforce case and notifies the guest services team via Slack."
  tags:
    - customer-service
    - zendesk
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: support-ops
      port: 8080
      tools:
        - name: escalate-zendesk-ticket
          description: "Given a Zendesk ticket ID, fetch details, create Salesforce case, and notify guest services."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "Zendesk ticket ID."
          steps:
            - name: get-ticket
              type: call
              call: zendesk.get-ticket
              with:
                ticket_id: "{{ticket_id}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Escalated: {{get-ticket.subject}}"
                description: "{{get-ticket.description}}"
                priority: High
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "guest-services-escalations"
                text: "Zendesk ticket {{ticket_id}} escalated. Case: {{create-case.case_number}}. Subject: {{get-ticket.subject}}."
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://target.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://target.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves details for a Zoom meeting by ID including topic, start time, and duration.

naftiko: "0.5"
info:
  label: "Zoom Meeting Details Lookup"
  description: "Retrieves details for a Zoom meeting by ID including topic, start time, and duration."
  tags:
    - communication
    - zoom
    - meetings
capability:
  exposes:
    - type: mcp
      namespace: communication
      port: 8080
      tools:
        - name: get-meeting-details
          description: "Given a Zoom meeting ID, return the topic, start time, and duration. Use for meeting audit."
          inputParameters:
            - name: meeting_id
              in: body
              type: string
              description: "Zoom meeting ID."
          call: zoom.get-meeting
          with:
            meeting_id: "{{meeting_id}}"
          outputParameters:
            - name: topic
              type: string
              mapping: "$.topic"
            - name: start_time
              type: string
              mapping: "$.start_time"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/meetings/{{meeting_id}}"
          inputParameters:
            - name: meeting_id
              in: path
          operations:
            - name: get-meeting
              method: GET