Target Capabilities
Naftiko 0.5 capability definitions for Target - 100 capabilities showing integration workflows and service orchestrations.
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