Microsoft Capabilities
Naftiko 0.5 capability definitions for Microsoft - 100 capabilities showing integration workflows and service orchestrations.
Sends a ServiceNow incident description to Anthropic Claude for intelligent triage categorization, updates the incident with the AI-recommended category and priority, and notifies the IT ops Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Anthropic AI Triage Assistant"
description: "Sends a ServiceNow incident description to Anthropic Claude for intelligent triage categorization, updates the incident with the AI-recommended category and priority, and notifies the IT ops Microsoft Teams channel."
tags:
- ai
- itsm
- anthropic
- servicenow
- microsoft-teams
- intelligent-triage
capability:
exposes:
- type: mcp
namespace: ai-triage
port: 8080
tools:
- name: triage-incident-with-ai
description: "Given a ServiceNow incident number, send its description to Anthropic Claude for category and priority recommendations, update the incident with the AI output, and notify the IT Teams channel."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number to triage, e.g. INC0012345."
steps:
- name: get-incident
type: call
call: "servicenow-triage.get-incident"
with:
number: "{{incident_number}}"
- name: ai-categorize
type: call
call: "anthropic.create-message"
with:
model: "claude-opus-4-5"
content: "Categorize this IT incident and recommend priority (P1-P4): {{get-incident.description}}"
- name: update-incident
type: call
call: "servicenow-triage.update-incident"
with:
sys_id: "{{get-incident.sys_id}}"
category: "{{ai-categorize.category}}"
priority: "{{ai-categorize.priority}}"
- name: notify-it-ops
type: call
call: "msteams-triage.post-channel-message"
with:
channel_id: "ITOps"
text: "AI triage complete for {{incident_number}}: Category={{ai-categorize.category}} Priority={{ai-categorize.priority}}"
consumes:
- type: http
namespace: servicenow-triage
baseUri: "https://microsoft.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident/{{number}}"
inputParameters:
- name: number
in: path
operations:
- name: get-incident
method: GET
- name: update-incident
method: PATCH
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: msteams-triage
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Identifies stale Azure AD guest user accounts inactive for over 90 days, generates a removal candidate list in SharePoint, and sends a weekly cleanup report to the IT Governance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Azure Active Directory Guest Access Cleanup"
description: "Identifies stale Azure AD guest user accounts inactive for over 90 days, generates a removal candidate list in SharePoint, and sends a weekly cleanup report to the IT Governance Microsoft Teams channel."
tags:
- security
- identity
- azure-ad
- sharepoint
- microsoft-teams
- guest-access
- governance
capability:
exposes:
- type: mcp
namespace: guest-cleanup
port: 8080
tools:
- name: identify-stale-guest-accounts
description: "Query Microsoft Graph for guest users with no sign-in activity in the specified number of days, export the list to SharePoint, and post a cleanup report to the IT Governance Teams channel."
inputParameters:
- name: inactive_days
in: body
type: integer
description: "Number of days without sign-in that qualifies a guest account as stale. Default is 90."
- name: sharepoint_site_id
in: body
type: string
description: "SharePoint site ID where the stale guest report will be stored."
steps:
- name: list-stale-guests
type: call
call: "msgraph-guests.list-guest-users"
with:
inactive_days: "{{inactive_days}}"
user_type: "Guest"
- name: export-report
type: call
call: "sharepoint-governance.create-file"
with:
site_id: "{{sharepoint_site_id}}"
file_name: "StaleGuestAccounts_{{list-stale-guests.report_date}}.csv"
content: "{{list-stale-guests.csv_data}}"
- name: notify-it-gov
type: call
call: "msteams-it-gov.post-channel-message"
with:
channel_id: "ITGovernance"
text: "Guest access review: {{list-stale-guests.stale_count}} stale guest accounts identified (inactive {{inactive_days}}+ days). Report: {{export-report.file_url}}"
consumes:
- type: http
namespace: msgraph-guests
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: guest-users
path: "/users"
inputParameters:
- name: inactive_days
in: query
- name: user_type
in: query
operations:
- name: list-guest-users
method: GET
- type: http
namespace: sharepoint-governance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-file
method: POST
- type: http
namespace: msteams-it-gov
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries Azure AD for users with privileged role assignments, exports the list to a SharePoint audit folder, and posts a review reminder to the Security governance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Azure AD Privileged Access Review"
description: "Queries Azure AD for users with privileged role assignments, exports the list to a SharePoint audit folder, and posts a review reminder to the Security governance Microsoft Teams channel."
tags:
- security
- identity
- azure-ad
- sharepoint
- microsoft-teams
- access-review
- governance
capability:
exposes:
- type: mcp
namespace: identity-governance
port: 8080
tools:
- name: run-privileged-access-review
description: "Query Azure AD for all users with Global Admin, Security Admin, or Privileged Role Administrator assignments, export the list to SharePoint, and post a review reminder to the Security Teams channel."
inputParameters:
- name: role_names
in: body
type: string
description: "Comma-separated Azure AD role display names to review, e.g. 'Global Administrator,Security Administrator'."
- name: sharepoint_site_id
in: body
type: string
description: "SharePoint site ID where the audit export should be saved."
steps:
- name: get-role-assignments
type: call
call: "msgraph-governance.list-role-assignments"
with:
role_names: "{{role_names}}"
- name: export-to-sharepoint
type: call
call: "sharepoint-audit.create-file"
with:
site_id: "{{sharepoint_site_id}}"
file_name: "PrivilegedAccessReview_{{get-role-assignments.snapshot_date}}.csv"
content: "{{get-role-assignments.csv_data}}"
- name: post-review-reminder
type: call
call: "msteams-governance.post-channel-message"
with:
channel_id: "Security"
text: "Privileged access review complete. {{get-role-assignments.user_count}} privileged users found. Report saved to SharePoint: {{export-to-sharepoint.file_url}}"
consumes:
- type: http
namespace: msgraph-governance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: role-assignments
path: "/roleManagement/directory/roleAssignments"
inputParameters:
- name: role_names
in: query
operations:
- name: list-role-assignments
method: GET
- type: http
namespace: sharepoint-audit
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-file
method: POST
- type: http
namespace: msteams-governance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an employee is terminated in Workday, disables their Azure AD account, revokes active sessions, removes Microsoft 365 licenses, and posts a summary to Microsoft Teams IT channel.
naftiko: "0.5"
info:
label: "Azure AD User Offboarding"
description: "When an employee is terminated in Workday, disables their Azure AD account, revokes active sessions, removes Microsoft 365 licenses, and posts a summary to Microsoft Teams IT channel."
tags:
- hr
- offboarding
- workday
- microsoft-graph
- azure-ad
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID for a terminated employee, disable their Azure AD account, revoke sessions, remove M365 licenses, and notify the IT Teams channel."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID for the terminated employee."
- name: termination_date
in: body
type: string
description: "Effective termination date in ISO 8601 format."
steps:
- name: get-worker
type: call
call: "workday-lookup.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: disable-user
type: call
call: "msgraph-offboard.disable-user"
with:
user_id: "{{get-worker.azure_object_id}}"
- name: revoke-sessions
type: call
call: "msgraph-offboard.revoke-sessions"
with:
user_id: "{{get-worker.azure_object_id}}"
- name: notify-it
type: call
call: "msteams-offboard.post-channel-message"
with:
channel_id: "IT-Alerts"
text: "Offboarding complete for {{get-worker.full_name}} (termination: {{termination_date}}). AAD account disabled."
consumes:
- type: http
namespace: workday-lookup
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/microsoft/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-offboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-account
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- name: user-sessions
path: "/users/{{user_id}}/revokeSignInSessions"
inputParameters:
- name: user_id
in: path
operations:
- name: revoke-sessions
method: POST
- type: http
namespace: msteams-offboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors AKS cluster node health, cordons unhealthy nodes, notifies the platform team on Teams, and creates an Azure DevOps bug for remediation.
naftiko: "0.5"
info:
label: "Azure AKS Node Health Responder"
description: "Monitors AKS cluster node health, cordons unhealthy nodes, notifies the platform team on Teams, and creates an Azure DevOps bug for remediation."
tags:
- cloud
- kubernetes
- azure-kubernetes-service
- monitoring
- microsoft-teams
- azure-devops
capability:
exposes:
- type: mcp
namespace: aks-health
port: 8080
tools:
- name: handle-unhealthy-node
description: "Process an AKS unhealthy node event by cordoning the node, alerting the platform team, and creating a remediation bug."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group of the AKS cluster."
- name: cluster_name
in: body
type: string
description: "AKS cluster name."
- name: node_name
in: body
type: string
description: "Name of the unhealthy node."
steps:
- name: get-node-status
type: call
call: "aks-api.get-node"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
cluster_name: "{{cluster_name}}"
- name: notify-platform
type: call
call: "msteams-platform.post-channel-message"
with:
channel_id: "PlatformEngineering"
text: "AKS node {{node_name}} in cluster {{cluster_name}} is unhealthy. Status: {{get-node-status.condition}}. Cordon initiated."
- name: create-bug
type: call
call: "ado-platform.create-item"
with:
title: "Unhealthy AKS node: {{node_name}} in {{cluster_name}}"
work_item_type: "Bug"
consumes:
- type: http
namespace: aks-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: managed-clusters
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.ContainerService/managedClusters/{{cluster_name}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: cluster_name
in: path
operations:
- name: get-node
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: ado-platform
baseUri: "https://dev.azure.com/$secrets.ado_org/Platform/_apis/wit"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: work-items
path: "/workitems/$Bug"
operations:
- name: create-item
method: POST
Monitors Azure API Management for APIs approaching rate limits, notifies the API team on Teams, and creates an Azure DevOps task to review throttling policies.
naftiko: "0.5"
info:
label: "Azure API Management Rate Limit Alert"
description: "Monitors Azure API Management for APIs approaching rate limits, notifies the API team on Teams, and creates an Azure DevOps task to review throttling policies."
tags:
- api-management
- azure
- monitoring
- microsoft-teams
- azure-devops
capability:
exposes:
- type: mcp
namespace: apim-ratelimit
port: 8080
tools:
- name: handle-rate-limit-warning
description: "Detect APIs nearing rate limits in Azure API Management, alert the API team, and create a review task."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: apim_name
in: body
type: string
description: "API Management service name."
steps:
- name: get-analytics
type: call
call: "apim-api.get-analytics"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
apim_name: "{{apim_name}}"
- name: alert-team
type: call
call: "msteams-api.post-channel-message"
with:
channel_id: "APITeam"
text: "Rate limit warning for APIM {{apim_name}}: {{get-analytics.top_api}} at {{get-analytics.utilization}}% of quota."
- name: create-task
type: call
call: "ado-api-team.create-item"
with:
title: "Review rate limits for {{get-analytics.top_api}} in {{apim_name}}"
work_item_type: "Task"
consumes:
- type: http
namespace: apim-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: analytics
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.ApiManagement/service/{{apim_name}}/reports/byApi"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: apim_name
in: path
operations:
- name: get-analytics
method: GET
- type: http
namespace: msteams-api
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: ado-api-team
baseUri: "https://dev.azure.com/$secrets.ado_org/APITeam/_apis/wit"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: work-items
path: "/workitems/$Task"
operations:
- name: create-item
method: POST
Toggles a feature flag in Azure App Configuration, invalidates related caches, and notifies the engineering team on Teams about the feature state change.
naftiko: "0.5"
info:
label: "Azure App Configuration Feature Flag Toggler"
description: "Toggles a feature flag in Azure App Configuration, invalidates related caches, and notifies the engineering team on Teams about the feature state change."
tags:
- devops
- azure
- feature-flags
- microsoft-teams
- configuration
capability:
exposes:
- type: mcp
namespace: feature-flags
port: 8080
tools:
- name: toggle-feature
description: "Toggle a feature flag in Azure App Configuration and notify the engineering team."
inputParameters:
- name: config_store
in: body
type: string
description: "App Configuration store name."
- name: feature_name
in: body
type: string
description: "Feature flag name."
- name: enabled
in: body
type: boolean
description: "Target feature state."
steps:
- name: update-flag
type: call
call: "appconfig-api.set-key-value"
with:
config_store: "{{config_store}}"
key: ".appconfig.featureflag/{{feature_name}}"
- name: notify-eng
type: call
call: "msteams-eng-flags.post-channel-message"
with:
channel_id: "Engineering"
text: "Feature flag {{feature_name}} set to {{enabled}} in {{config_store}}. Change by automation. Verify in staging."
consumes:
- type: http
namespace: appconfig-api
baseUri: "https://{{config_store}}.azconfig.io"
authentication:
type: bearer
token: "$secrets.appconfig_token"
resources:
- name: key-values
path: "/kv/{{key}}"
inputParameters:
- name: key
in: path
operations:
- name: set-key-value
method: PUT
- type: http
namespace: msteams-eng-flags
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks Azure App Service SSL certificates approaching expiration, triggers renewal via Key Vault, and notifies the web team on Teams and via email.
naftiko: "0.5"
info:
label: "Azure App Service Certificate Renewal"
description: "Checks Azure App Service SSL certificates approaching expiration, triggers renewal via Key Vault, and notifies the web team on Teams and via email."
tags:
- security
- azure
- certificates
- key-vault
- microsoft-teams
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: cert-renewal
port: 8080
tools:
- name: check-and-renew-certs
description: "Check App Service certificates nearing expiry, renew via Key Vault, and notify the web team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: vault_name
in: body
type: string
description: "Key Vault name holding the certificates."
steps:
- name: list-certificates
type: call
call: "appservice-certs.list-certificates"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
- name: trigger-renewal
type: call
call: "keyvault-certs.create-certificate"
with:
vault_name: "{{vault_name}}"
- name: notify-web-team
type: call
call: "msteams-web.post-channel-message"
with:
channel_id: "WebOps"
text: "Certificate renewal triggered for {{list-certificates.expiring_count}} certificates in {{resource_group}}. Key Vault: {{vault_name}}."
- name: email-ops
type: call
call: "graph-mail-certs.send-mail"
with:
sender_id: "cert-admin@microsoft.com"
subject: "SSL Certificate Renewal — {{resource_group}}"
body: "{{list-certificates.expiring_count}} certificates renewed via Key Vault {{vault_name}}."
consumes:
- type: http
namespace: appservice-certs
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: certificates
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Web/certificates"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
operations:
- name: list-certificates
method: GET
- type: http
namespace: keyvault-certs
baseUri: "https://{{vault_name}}.vault.azure.net"
authentication:
type: bearer
token: "$secrets.azure_keyvault_token"
resources:
- name: certificates
path: "/certificates"
operations:
- name: create-certificate
method: POST
- type: http
namespace: msteams-web
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: graph-mail-certs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
Uploads a file to a specified Azure Blob Storage container, returning the blob URI for downstream consumption.
naftiko: "0.5"
info:
label: "Azure Blob Storage Upload"
description: "Uploads a file to a specified Azure Blob Storage container, returning the blob URI for downstream consumption."
tags:
- cloud
- storage
- azure
- azure-storage
capability:
exposes:
- type: mcp
namespace: blob-upload
port: 8080
tools:
- name: upload-blob
description: "Upload a file to an Azure Blob Storage container given the storage account, container name, and blob name."
inputParameters:
- name: account_name
in: body
type: string
description: "Azure storage account name."
- name: container_name
in: body
type: string
description: "Target blob container name."
- name: blob_name
in: body
type: string
description: "Name for the uploaded blob."
consumes:
- type: http
namespace: azure-blob
baseUri: "https://{{account_name}}.blob.core.windows.net"
authentication:
type: bearer
token: "$secrets.azure_storage_token"
resources:
- name: blobs
path: "/{{container_name}}/{{blob_name}}"
inputParameters:
- name: container_name
in: path
- name: blob_name
in: path
operations:
- name: put-blob
method: PUT
When an Azure budget threshold is exceeded, fetches the budget details, posts alerts to both Microsoft Teams and Slack finance channels for cross-platform visibility.
naftiko: "0.5"
info:
label: "Azure Budget Alert to Slack and Teams"
description: "When an Azure budget threshold is exceeded, fetches the budget details, posts alerts to both Microsoft Teams and Slack finance channels for cross-platform visibility."
tags:
- finops
- azure
- microsoft-teams
- slack
- cost-management
capability:
exposes:
- type: mcp
namespace: budget-alert
port: 8080
tools:
- name: broadcast-budget-alert
description: "Fetch Azure budget status and broadcast alerts to both Teams and Slack."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: budget_name
in: body
type: string
description: "Azure budget name."
steps:
- name: get-budget
type: call
call: "azure-budgets.get-budget"
with:
subscription_id: "{{subscription_id}}"
budget_name: "{{budget_name}}"
- name: alert-teams
type: call
call: "msteams-finance.post-channel-message"
with:
channel_id: "Finance"
text: "Budget alert: {{budget_name}} at {{get-budget.current_spend_percentage}}% of limit (${{get-budget.amount}}). Current spend: ${{get-budget.current_spend}}."
- name: alert-slack
type: call
call: "slack-finance.post-message"
with:
channel: "finance-alerts"
text: "Azure budget {{budget_name}} exceeded threshold. Spend: ${{get-budget.current_spend}} / ${{get-budget.amount}}."
consumes:
- type: http
namespace: azure-budgets
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: budgets
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.Consumption/budgets/{{budget_name}}"
inputParameters:
- name: subscription_id
in: path
- name: budget_name
in: path
operations:
- name: get-budget
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: slack-finance
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Executes a search query against an Azure AI Search index and returns matching documents.
naftiko: "0.5"
info:
label: "Azure Cognitive Search Query"
description: "Executes a search query against an Azure AI Search index and returns matching documents."
tags:
- search
- ai
- azure
- data
capability:
exposes:
- type: mcp
namespace: ai-search
port: 8080
tools:
- name: search-documents
description: "Search an Azure AI Search index with a query string."
inputParameters:
- name: service_name
in: body
type: string
description: "Azure AI Search service name."
- name: index_name
in: body
type: string
description: "Index name to search."
- name: query
in: body
type: string
description: "Search query text."
consumes:
- type: http
namespace: azure-search
baseUri: "https://{{service_name}}.search.windows.net"
authentication:
type: apiKey
name: api-key
value: "$secrets.azure_search_key"
resources:
- name: search
path: "/indexes/{{index_name}}/docs/search"
inputParameters:
- name: index_name
in: path
operations:
- name: query-index
method: POST
Creates and starts an Azure Container Instance in a specified resource group with a given container image.
naftiko: "0.5"
info:
label: "Azure Container Instance Launcher"
description: "Creates and starts an Azure Container Instance in a specified resource group with a given container image."
tags:
- cloud
- containers
- azure
- compute
capability:
exposes:
- type: mcp
namespace: aci-launcher
port: 8080
tools:
- name: launch-container
description: "Launch an Azure Container Instance with a specified image in a resource group."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: container_group_name
in: body
type: string
description: "Name for the container group."
- name: image
in: body
type: string
description: "Container image URI."
consumes:
- type: http
namespace: azure-aci
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: container-groups
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.ContainerInstance/containerGroups/{{container_group_name}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: container_group_name
in: path
operations:
- name: create-container-group
method: PUT
Triggers a vulnerability scan on an Azure Container Registry image, fetches the scan results, and posts critical findings to the security and DevOps Teams channels.
naftiko: "0.5"
info:
label: "Azure Container Registry Vulnerability Scanner"
description: "Triggers a vulnerability scan on an Azure Container Registry image, fetches the scan results, and posts critical findings to the security and DevOps Teams channels."
tags:
- security
- containers
- azure
- devops
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: acr-scan
port: 8080
tools:
- name: scan-container-image
description: "Trigger and report on a container image vulnerability scan in Azure Container Registry."
inputParameters:
- name: registry_name
in: body
type: string
description: "ACR registry name."
- name: repository
in: body
type: string
description: "Container repository name."
- name: tag
in: body
type: string
description: "Image tag to scan."
steps:
- name: get-scan-results
type: call
call: "acr-api.get-manifest"
with:
registry_name: "{{registry_name}}"
repository: "{{repository}}"
tag: "{{tag}}"
- name: alert-security
type: call
call: "msteams-container-sec.post-channel-message"
with:
channel_id: "SecurityOps"
text: "ACR vulnerability scan for {{registry_name}}/{{repository}}:{{tag}}: {{get-scan-results.critical_count}} critical, {{get-scan-results.high_count}} high vulnerabilities."
- name: alert-devops
type: call
call: "msteams-container-devops.post-channel-message"
with:
channel_id: "DevOps"
text: "Container image {{repository}}:{{tag}} scan complete. Action required: {{get-scan-results.critical_count}} critical findings."
consumes:
- type: http
namespace: acr-api
baseUri: "https://{{registry_name}}.azurecr.io"
authentication:
type: bearer
token: "$secrets.acr_token"
resources:
- name: manifests
path: "/v2/{{repository}}/manifests/{{tag}}"
inputParameters:
- name: repository
in: path
- name: tag
in: path
operations:
- name: get-manifest
method: GET
- type: http
namespace: msteams-container-sec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: msteams-container-devops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors Cosmos DB RU consumption, scales throughput when utilization exceeds threshold, and notifies the data team on Teams with the new provisioned RUs.
naftiko: "0.5"
info:
label: "Azure Cosmos DB Throughput Scaler"
description: "Monitors Cosmos DB RU consumption, scales throughput when utilization exceeds threshold, and notifies the data team on Teams with the new provisioned RUs."
tags:
- data
- database
- azure
- cosmos-db
- microsoft-teams
- autoscaling
capability:
exposes:
- type: mcp
namespace: cosmos-scaler
port: 8080
tools:
- name: scale-throughput
description: "Check Cosmos DB RU utilization and scale throughput if above threshold, then notify the data team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: account_name
in: body
type: string
description: "Cosmos DB account name."
- name: database_name
in: body
type: string
description: "Database name."
steps:
- name: get-metrics
type: call
call: "cosmos-api.get-metrics"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
account_name: "{{account_name}}"
- name: update-throughput
type: call
call: "cosmos-api.update-throughput"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
account_name: "{{account_name}}"
database_name: "{{database_name}}"
- name: notify-team
type: call
call: "msteams-data-cosmos.post-channel-message"
with:
channel_id: "DataEngineering"
text: "Cosmos DB {{account_name}}/{{database_name}} throughput scaled. Current RU utilization: {{get-metrics.ru_percentage}}%."
consumes:
- type: http
namespace: cosmos-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: metrics
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DocumentDB/databaseAccounts/{{account_name}}/providers/Microsoft.Insights/metrics"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: account_name
in: path
operations:
- name: get-metrics
method: GET
- name: throughput
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DocumentDB/databaseAccounts/{{account_name}}/sqlDatabases/{{database_name}}/throughputSettings/default"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: account_name
in: path
- name: database_name
in: path
operations:
- name: update-throughput
method: PUT
- type: http
namespace: msteams-data-cosmos
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When Azure Cost Management detects a spend anomaly above threshold, fetches cost breakdown by resource group, posts an alert to Microsoft Teams, and opens a ServiceNow change request for investigation.
naftiko: "0.5"
info:
label: "Azure Cost Anomaly Responder"
description: "When Azure Cost Management detects a spend anomaly above threshold, fetches cost breakdown by resource group, posts an alert to Microsoft Teams, and opens a ServiceNow change request for investigation."
tags:
- cloud
- finops
- azure
- cost-management
- microsoft-teams
- servicenow
- monitoring
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: handle-cost-anomaly
description: "Given an Azure subscription ID and anomaly alert ID, fetch the cost breakdown, post an alert to Teams, and open a ServiceNow change request for cost investigation."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID where the anomaly was detected."
- name: anomaly_id
in: body
type: string
description: "The Azure Cost Management anomaly alert identifier."
- name: threshold_usd
in: body
type: number
description: "Spend threshold in USD that triggered the alert."
steps:
- name: get-cost-breakdown
type: call
call: "azure-cost.get-anomaly"
with:
subscription_id: "{{subscription_id}}"
anomaly_id: "{{anomaly_id}}"
- name: alert-teams
type: call
call: "msteams-finops.post-channel-message"
with:
channel_id: "CloudOps"
text: "Cost anomaly detected in subscription {{subscription_id}}. Estimated overage: ${{threshold_usd}}. Resource group: {{get-cost-breakdown.top_resource_group}}"
- name: open-change
type: call
call: "servicenow-finops.create-change"
with:
short_description: "Azure cost anomaly investigation: subscription {{subscription_id}}"
category: "cloud_cost"
description: "Anomaly ID: {{anomaly_id}}\nTop resource group: {{get-cost-breakdown.top_resource_group}}\nEstimated overage: ${{threshold_usd}}"
consumes:
- type: http
namespace: azure-cost
baseUri: "https://management.azure.com/subscriptions"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: anomalies
path: "/{{subscription_id}}/providers/Microsoft.CostManagement/anomalies/{{anomaly_id}}"
inputParameters:
- name: subscription_id
in: path
- name: anomaly_id
in: path
operations:
- name: get-anomaly
method: GET
- type: http
namespace: msteams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: servicenow-finops
baseUri: "https://microsoft.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
When an Azure Data Factory pipeline run fails, fetches the error details, posts an alert to the data engineering Teams channel, and opens a Jira ticket for investigation.
naftiko: "0.5"
info:
label: "Azure Data Factory Pipeline Failure Handler"
description: "When an Azure Data Factory pipeline run fails, fetches the error details, posts an alert to the data engineering Teams channel, and opens a Jira ticket for investigation."
tags:
- data
- etl
- azure-data-factory
- microsoft-teams
- jira
capability:
exposes:
- type: mcp
namespace: adf-failure
port: 8080
tools:
- name: handle-pipeline-failure
description: "Process an ADF pipeline failure by fetching run details, alerting the data team, and creating a Jira issue."
inputParameters:
- name: factory_name
in: body
type: string
description: "Azure Data Factory name."
- name: run_id
in: body
type: string
description: "Pipeline run ID."
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
steps:
- name: get-run-details
type: call
call: "adf-api.get-pipeline-run"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
factory_name: "{{factory_name}}"
run_id: "{{run_id}}"
- name: alert-data-team
type: call
call: "msteams-data.post-channel-message"
with:
channel_id: "DataEngineering"
text: "ADF pipeline failure in {{factory_name}}. Pipeline: {{get-run-details.pipeline_name}}. Error: {{get-run-details.error_message}}"
- name: create-jira-ticket
type: call
call: "jira-data.create-issue"
with:
project_key: "DATA"
issue_type: "Bug"
summary: "ADF pipeline failure: {{get-run-details.pipeline_name}} in {{factory_name}}"
description: "Run ID: {{run_id}}\nError: {{get-run-details.error_message}}"
consumes:
- type: http
namespace: adf-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: pipeline-runs
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DataFactory/factories/{{factory_name}}/pipelineruns/{{run_id}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: factory_name
in: path
- name: run_id
in: path
operations:
- name: get-pipeline-run
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: jira-data
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Monitors Azure Databricks job runs for failures, creates a Jira ticket with job details, and posts an alert to the Data Engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Azure Databricks Job Failure Alert"
description: "Monitors Azure Databricks job runs for failures, creates a Jira ticket with job details, and posts an alert to the Data Engineering Microsoft Teams channel."
tags:
- data
- engineering
- azure-databricks
- jira
- microsoft-teams
- pipeline-monitoring
capability:
exposes:
- type: mcp
namespace: databricks-ops
port: 8080
tools:
- name: handle-databricks-job-failure
description: "Given an Azure Databricks workspace URL and failed job run ID, fetch job run details, create a Jira bug in the DATA project, and alert the Data Engineering Teams channel."
inputParameters:
- name: workspace_url
in: body
type: string
description: "Azure Databricks workspace URL, e.g. adb-1234567890.12.azuredatabricks.net."
- name: run_id
in: body
type: string
description: "The Databricks job run ID that failed."
- name: job_name
in: body
type: string
description: "Human-readable name of the Databricks job."
steps:
- name: get-run-details
type: call
call: "databricks.get-run"
with:
run_id: "{{run_id}}"
- name: create-jira-bug
type: call
call: "jira-data-eng.create-issue"
with:
project_key: "DATA"
issuetype: "Bug"
summary: "[Databricks] Job failure: {{job_name}} (Run {{run_id}})"
description: "State: {{get-run-details.state}}\nError: {{get-run-details.error_message}}\nWorkspace: {{workspace_url}}"
- name: alert-teams
type: call
call: "msteams-dataeng.post-channel-message"
with:
channel_id: "DataEngineering"
text: "Databricks job failure: {{job_name}} | Run: {{run_id}} | Jira: {{create-jira-bug.key}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://{{workspace_url}}/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: job-runs
path: "/jobs/runs/get"
inputParameters:
- name: run_id
in: query
operations:
- name: get-run
method: GET
- type: http
namespace: jira-data-eng
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-dataeng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Triggers an Azure Databricks notebook run, monitors its status, and posts the result with output metrics to the data science Teams channel.
naftiko: "0.5"
info:
label: "Azure Databricks Notebook Scheduler"
description: "Triggers an Azure Databricks notebook run, monitors its status, and posts the result with output metrics to the data science Teams channel."
tags:
- data
- azure-databricks
- machine-learning
- microsoft-teams
- analytics
capability:
exposes:
- type: mcp
namespace: databricks-scheduler
port: 8080
tools:
- name: run-notebook
description: "Trigger a Databricks notebook run, wait for completion, and post results to Teams."
inputParameters:
- name: workspace_url
in: body
type: string
description: "Databricks workspace URL."
- name: notebook_path
in: body
type: string
description: "Full path to the notebook."
steps:
- name: submit-run
type: call
call: "databricks-api.submit-run"
with:
workspace_url: "{{workspace_url}}"
notebook_path: "{{notebook_path}}"
- name: get-run-status
type: call
call: "databricks-api.get-run"
with:
workspace_url: "{{workspace_url}}"
run_id: "{{submit-run.run_id}}"
- name: notify-ds-team
type: call
call: "msteams-datascience.post-channel-message"
with:
channel_id: "DataScience"
text: "Databricks notebook {{notebook_path}} completed. Status: {{get-run-status.state}}. Duration: {{get-run-status.execution_duration_ms}}ms."
consumes:
- type: http
namespace: databricks-api
baseUri: "{{workspace_url}}/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: runs-submit
path: "/jobs/runs/submit"
operations:
- name: submit-run
method: POST
- name: runs-get
path: "/jobs/runs/get"
operations:
- name: get-run
method: GET
- type: http
namespace: msteams-datascience
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Before a release proceeds in Azure DevOps, validates SonarQube quality gate status, checks Azure Monitor for active critical alerts, and posts gate results to Teams.
naftiko: "0.5"
info:
label: "Azure DevOps Release Gate Checker"
description: "Before a release proceeds in Azure DevOps, validates SonarQube quality gate status, checks Azure Monitor for active critical alerts, and posts gate results to Teams."
tags:
- devops
- ci-cd
- azure-devops
- code-quality
- monitoring
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: release-gates
port: 8080
tools:
- name: validate-release-gates
description: "Check SonarQube quality gate and Azure Monitor alerts before allowing an Azure DevOps release."
inputParameters:
- name: project_key
in: body
type: string
description: "SonarQube project key."
- name: subscription_id
in: body
type: string
description: "Azure subscription ID for monitoring checks."
steps:
- name: check-sonar
type: call
call: "sonarqube-api.get-quality-gate"
with:
project_key: "{{project_key}}"
- name: check-alerts
type: call
call: "azure-monitor-alerts.list-active"
with:
subscription_id: "{{subscription_id}}"
- name: post-results
type: call
call: "msteams-releases.post-channel-message"
with:
channel_id: "Releases"
text: "Release gate results — SonarQube: {{check-sonar.status}}, Active critical alerts: {{check-alerts.critical_count}}."
consumes:
- type: http
namespace: sonarqube-api
baseUri: "https://sonarqube.microsoft.com/api"
authentication:
type: bearer
token: "$secrets.sonarqube_token"
resources:
- name: quality-gates
path: "/qualitygates/project_status"
operations:
- name: get-quality-gate
method: GET
- type: http
namespace: azure-monitor-alerts
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: alerts
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.AlertsManagement/alerts"
inputParameters:
- name: subscription_id
in: path
operations:
- name: list-active
method: GET
- type: http
namespace: msteams-releases
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Creates a new work item in an Azure DevOps project given the organization, project, work item type, and title.
naftiko: "0.5"
info:
label: "Azure DevOps Work Item Creator"
description: "Creates a new work item in an Azure DevOps project given the organization, project, work item type, and title."
tags:
- devops
- project-management
- azure-devops
capability:
exposes:
- type: mcp
namespace: ado-workitems
port: 8080
tools:
- name: create-work-item
description: "Create a work item in Azure DevOps with the specified type and title."
inputParameters:
- name: organization
in: body
type: string
description: "Azure DevOps organization name."
- name: project
in: body
type: string
description: "Project name."
- name: work_item_type
in: body
type: string
description: "Work item type such as Bug, Task, or User Story."
- name: title
in: body
type: string
description: "Title for the work item."
consumes:
- type: http
namespace: ado-api
baseUri: "https://dev.azure.com/{{organization}}/{{project}}/_apis/wit"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: work-items
path: "/workitems/${{work_item_type}}"
inputParameters:
- name: work_item_type
in: path
operations:
- name: create-item
method: POST
Creates or updates a DNS record set in an Azure DNS zone for automated infrastructure provisioning.
naftiko: "0.5"
info:
label: "Azure DNS Record Updater"
description: "Creates or updates a DNS record set in an Azure DNS zone for automated infrastructure provisioning."
tags:
- infrastructure
- networking
- azure
- dns
capability:
exposes:
- type: mcp
namespace: azure-dns
port: 8080
tools:
- name: upsert-dns-record
description: "Create or update a DNS record in an Azure DNS zone."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group containing the DNS zone."
- name: zone_name
in: body
type: string
description: "DNS zone name."
- name: record_name
in: body
type: string
description: "DNS record name."
- name: record_type
in: body
type: string
description: "DNS record type such as A, CNAME, or TXT."
consumes:
- type: http
namespace: azure-dns-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: record-sets
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Network/dnsZones/{{zone_name}}/{{record_type}}/{{record_name}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: zone_name
in: path
- name: record_type
in: path
- name: record_name
in: path
operations:
- name: create-or-update
method: PUT
Creates an Event Grid subscription for a topic, validates the endpoint, and posts a confirmation to the platform engineering Teams channel.
naftiko: "0.5"
info:
label: "Azure Event Grid Subscription Manager"
description: "Creates an Event Grid subscription for a topic, validates the endpoint, and posts a confirmation to the platform engineering Teams channel."
tags:
- integration
- events
- azure
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: eventgrid-mgr
port: 8080
tools:
- name: create-subscription
description: "Create an Azure Event Grid subscription and confirm it in Teams."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: topic_name
in: body
type: string
description: "Event Grid topic name."
- name: subscription_name
in: body
type: string
description: "Event subscription name."
- name: endpoint_url
in: body
type: string
description: "Webhook endpoint URL."
steps:
- name: create-sub
type: call
call: "eventgrid-api.create-event-subscription"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
topic_name: "{{topic_name}}"
subscription_name: "{{subscription_name}}"
- name: confirm-teams
type: call
call: "msteams-platform-eg.post-channel-message"
with:
channel_id: "PlatformEngineering"
text: "Event Grid subscription {{subscription_name}} created for topic {{topic_name}}. Endpoint: {{endpoint_url}}. Status: {{create-sub.provisioning_state}}"
consumes:
- type: http
namespace: eventgrid-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: event-subscriptions
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.EventGrid/topics/{{topic_name}}/eventSubscriptions/{{subscription_name}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: topic_name
in: path
- name: subscription_name
in: path
operations:
- name: create-event-subscription
method: PUT
- type: http
namespace: msteams-platform-eg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors Azure Front Door backend health probes, detects unhealthy backends, alerts the networking team on Teams, and creates a PagerDuty incident.
naftiko: "0.5"
info:
label: "Azure Front Door Health Monitor"
description: "Monitors Azure Front Door backend health probes, detects unhealthy backends, alerts the networking team on Teams, and creates a PagerDuty incident."
tags:
- networking
- cdn
- azure
- monitoring
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: frontdoor-health
port: 8080
tools:
- name: check-backend-health
description: "Check Azure Front Door backend health, alert the networking team, and escalate to PagerDuty if backends are unhealthy."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: frontdoor_name
in: body
type: string
description: "Azure Front Door profile name."
steps:
- name: get-health
type: call
call: "frontdoor-api.get-health-probes"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
frontdoor_name: "{{frontdoor_name}}"
- name: alert-networking
type: call
call: "msteams-network.post-channel-message"
with:
channel_id: "Networking"
text: "Front Door {{frontdoor_name}} health check: {{get-health.healthy_count}} healthy, {{get-health.unhealthy_count}} unhealthy backends."
- name: escalate-pagerduty
type: call
call: "pagerduty-network.create-incident"
with:
service_id: "frontdoor-service"
title: "Unhealthy backends on Front Door {{frontdoor_name}}"
consumes:
- type: http
namespace: frontdoor-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: health-probes
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Network/frontDoors/{{frontdoor_name}}/backendPools/default/healthProbeSettings"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: frontdoor_name
in: path
operations:
- name: get-health-probes
method: GET
- type: http
namespace: msteams-network
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: pagerduty-network
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
Invokes an Azure Function via its HTTP trigger endpoint, passing a JSON payload and returning the function response.
naftiko: "0.5"
info:
label: "Azure Function Invocation"
description: "Invokes an Azure Function via its HTTP trigger endpoint, passing a JSON payload and returning the function response."
tags:
- cloud
- serverless
- azure-functions
- compute
capability:
exposes:
- type: mcp
namespace: azure-fn
port: 8080
tools:
- name: invoke-function
description: "Invoke an Azure Function by its HTTP trigger URL with a JSON payload."
inputParameters:
- name: function_url
in: body
type: string
description: "Full HTTP trigger URL for the Azure Function."
consumes:
- type: http
namespace: azure-func
baseUri: "{{function_url}}"
authentication:
type: apiKey
name: x-functions-key
value: "$secrets.azure_function_key"
resources:
- name: trigger
path: "/"
operations:
- name: invoke
method: POST
When a Terraform Cloud run completes in a production workspace, creates a ServiceNow change record, logs the change in Datadog, and notifies the Cloud Operations Teams channel.
naftiko: "0.5"
info:
label: "Azure Infrastructure Change Management"
description: "When a Terraform Cloud run completes in a production workspace, creates a ServiceNow change record, logs the change in Datadog, and notifies the Cloud Operations Teams channel."
tags:
- cloud
- infrastructure
- terraform
- servicenow
- datadog
- change-management
capability:
exposes:
- type: mcp
namespace: change-management
port: 8080
tools:
- name: register-infrastructure-change
description: "Given a completed Terraform Cloud run ID and workspace name, create a ServiceNow change record, push a Datadog deployment event, and post the change summary to the CloudOps Teams channel."
inputParameters:
- name: run_id
in: body
type: string
description: "Terraform Cloud run ID that completed."
- name: workspace_name
in: body
type: string
description: "Terraform Cloud workspace name, used as the environment identifier."
- name: applied_by
in: body
type: string
description: "UPN of the user or service principal that triggered the apply."
steps:
- name: get-run
type: call
call: "terraform-change.get-run"
with:
run_id: "{{run_id}}"
- name: create-change
type: call
call: "servicenow-change.create-change"
with:
short_description: "Infrastructure change: {{workspace_name}} — Terraform run {{run_id}}"
category: "infrastructure"
applied_by: "{{applied_by}}"
- name: log-datadog-event
type: call
call: "datadog-change.create-event"
with:
title: "Terraform Apply: {{workspace_name}}"
text: "Run ID: {{run_id}} | Status: {{get-run.status}} | Applied by: {{applied_by}}"
tags: "env:{{workspace_name}},source:terraform"
- name: notify-cloudops
type: call
call: "msteams-cloudops.post-channel-message"
with:
channel_id: "CloudOps"
text: "Infrastructure change applied: {{workspace_name}} | Run: {{run_id}} | SNOW: {{create-change.number}}"
consumes:
- type: http
namespace: terraform-change
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs/{{run_id}}"
inputParameters:
- name: run_id
in: path
operations:
- name: get-run
method: GET
- type: http
namespace: servicenow-change
baseUri: "https://microsoft.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: datadog-change
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams-cloudops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a secret value from Azure Key Vault given the vault name and secret name, for use in downstream automation steps.
naftiko: "0.5"
info:
label: "Azure Key Vault Secret Retrieval"
description: "Retrieves a secret value from Azure Key Vault given the vault name and secret name, for use in downstream automation steps."
tags:
- security
- azure
- key-vault
- secrets-management
capability:
exposes:
- type: mcp
namespace: keyvault-secrets
port: 8080
tools:
- name: get-secret
description: "Retrieve a secret from Azure Key Vault by vault name and secret name."
inputParameters:
- name: vault_name
in: body
type: string
description: "Azure Key Vault name."
- name: secret_name
in: body
type: string
description: "Name of the secret to retrieve."
consumes:
- type: http
namespace: azure-keyvault
baseUri: "https://{{vault_name}}.vault.azure.net"
authentication:
type: bearer
token: "$secrets.azure_keyvault_token"
resources:
- name: secrets
path: "/secrets/{{secret_name}}"
inputParameters:
- name: secret_name
in: path
operations:
- name: get-secret-value
method: GET
Executes a Kusto query against an Azure Log Analytics workspace and returns the result set.
naftiko: "0.5"
info:
label: "Azure Log Analytics Query"
description: "Executes a Kusto query against an Azure Log Analytics workspace and returns the result set."
tags:
- monitoring
- observability
- azure
- log-analytics
capability:
exposes:
- type: mcp
namespace: log-query
port: 8080
tools:
- name: run-query
description: "Execute a KQL query against a Log Analytics workspace."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Log Analytics workspace ID."
- name: query
in: body
type: string
description: "KQL query string."
consumes:
- type: http
namespace: log-analytics
baseUri: "https://api.loganalytics.io/v1"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: query
path: "/workspaces/{{workspace_id}}/query"
inputParameters:
- name: workspace_id
in: path
operations:
- name: execute-query
method: POST
Fetches failed Logic App run actions, retries the failed run, and posts the retry result to the integration team's Teams channel.
naftiko: "0.5"
info:
label: "Azure Logic App Error Replay"
description: "Fetches failed Logic App run actions, retries the failed run, and posts the retry result to the integration team's Teams channel."
tags:
- integration
- automation
- azure
- microsoft-teams
- error-handling
capability:
exposes:
- type: mcp
namespace: logicapp-retry
port: 8080
tools:
- name: retry-failed-run
description: "Fetch details of a failed Logic App run, trigger a retry, and notify the integration team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: logic_app_name
in: body
type: string
description: "Logic App name."
- name: run_id
in: body
type: string
description: "Failed run ID."
steps:
- name: get-run
type: call
call: "logicapp-api.get-run"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
logic_app_name: "{{logic_app_name}}"
run_id: "{{run_id}}"
- name: trigger-resubmit
type: call
call: "logicapp-api.resubmit-run"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
logic_app_name: "{{logic_app_name}}"
run_id: "{{run_id}}"
- name: notify-team
type: call
call: "msteams-integration.post-channel-message"
with:
channel_id: "Integration"
text: "Logic App {{logic_app_name}} run {{run_id}} retried. Original error: {{get-run.error_code}}. Retry status: {{trigger-resubmit.status}}."
consumes:
- type: http
namespace: logicapp-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: runs
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Logic/workflows/{{logic_app_name}}/runs/{{run_id}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: logic_app_name
in: path
- name: run_id
in: path
operations:
- name: get-run
method: GET
- name: resubmit-run
method: POST
- type: http
namespace: msteams-integration
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Triggers an Azure Machine Learning model deployment, monitors the endpoint health, and posts deployment status to the ML engineering Teams channel.
naftiko: "0.5"
info:
label: "Azure ML Model Deployment Pipeline"
description: "Triggers an Azure Machine Learning model deployment, monitors the endpoint health, and posts deployment status to the ML engineering Teams channel."
tags:
- ai
- machine-learning
- azure-machine-learning
- microsoft-teams
- deployment
capability:
exposes:
- type: mcp
namespace: ml-deploy
port: 8080
tools:
- name: deploy-model
description: "Deploy an Azure ML model to a managed endpoint, check health, and notify the ML team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: workspace_name
in: body
type: string
description: "Azure ML workspace name."
- name: endpoint_name
in: body
type: string
description: "Managed endpoint name."
steps:
- name: create-deployment
type: call
call: "azureml-api.create-deployment"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
workspace_name: "{{workspace_name}}"
endpoint_name: "{{endpoint_name}}"
- name: check-health
type: call
call: "azureml-api.get-endpoint"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
workspace_name: "{{workspace_name}}"
endpoint_name: "{{endpoint_name}}"
- name: notify-ml-team
type: call
call: "msteams-ml.post-channel-message"
with:
channel_id: "MLEngineering"
text: "Model deployed to endpoint {{endpoint_name}}. Status: {{check-health.provisioning_state}}. Scoring URI: {{check-health.scoring_uri}}"
consumes:
- type: http
namespace: azureml-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: deployments
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.MachineLearningServices/workspaces/{{workspace_name}}/onlineEndpoints/{{endpoint_name}}/deployments"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: workspace_name
in: path
- name: endpoint_name
in: path
operations:
- name: create-deployment
method: PUT
- name: endpoints
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.MachineLearningServices/workspaces/{{workspace_name}}/onlineEndpoints/{{endpoint_name}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: workspace_name
in: path
- name: endpoint_name
in: path
operations:
- name: get-endpoint
method: GET
- type: http
namespace: msteams-ml
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries Azure Policy compliance state for a subscription, generates a compliance summary, emails it to stakeholders, and posts highlights to a Teams governance channel.
naftiko: "0.5"
info:
label: "Azure Policy Compliance Reporter"
description: "Queries Azure Policy compliance state for a subscription, generates a compliance summary, emails it to stakeholders, and posts highlights to a Teams governance channel."
tags:
- governance
- compliance
- azure
- microsoft-outlook
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: policy-compliance
port: 8080
tools:
- name: generate-compliance-report
description: "Generate an Azure Policy compliance report, email it to stakeholders, and post highlights to Teams."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
steps:
- name: get-compliance
type: call
call: "azure-policy.get-compliance-state"
with:
subscription_id: "{{subscription_id}}"
- name: email-report
type: call
call: "graph-mail-gov.send-mail"
with:
sender_id: "governance@microsoft.com"
subject: "Azure Policy Compliance Report — Subscription {{subscription_id}}"
body: "Compliant: {{get-compliance.compliant_count}} | Non-compliant: {{get-compliance.non_compliant_count}} | Exempt: {{get-compliance.exempt_count}}"
- name: notify-teams
type: call
call: "msteams-gov.post-channel-message"
with:
channel_id: "Governance"
text: "Policy compliance report for subscription {{subscription_id}}: {{get-compliance.compliant_count}} compliant, {{get-compliance.non_compliant_count}} non-compliant."
consumes:
- type: http
namespace: azure-policy
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: compliance-states
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.PolicyInsights/policyStates/latest/summarize"
inputParameters:
- name: subscription_id
in: path
operations:
- name: get-compliance-state
method: POST
- type: http
namespace: graph-mail-gov
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
- type: http
namespace: msteams-gov
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Scans Microsoft Purview for newly classified sensitive data assets, generates a summary report, and sends it to the data governance team via Teams and email.
naftiko: "0.5"
info:
label: "Azure Purview Data Classification Reporter"
description: "Scans Microsoft Purview for newly classified sensitive data assets, generates a summary report, and sends it to the data governance team via Teams and email."
tags:
- governance
- data
- azure
- purview
- microsoft-teams
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: purview-report
port: 8080
tools:
- name: report-classifications
description: "Fetch new Purview data classifications and notify the governance team."
inputParameters:
- name: account_name
in: body
type: string
description: "Microsoft Purview account name."
steps:
- name: get-classifications
type: call
call: "purview-api.search-assets"
with:
account_name: "{{account_name}}"
- name: notify-teams
type: call
call: "msteams-governance.post-channel-message"
with:
channel_id: "DataGovernance"
text: "Purview classification report for {{account_name}}: {{get-classifications.new_classified_count}} new sensitive assets detected."
- name: email-report
type: call
call: "graph-mail-purview.send-mail"
with:
sender_id: "data-governance@microsoft.com"
subject: "Purview Data Classification Report — {{account_name}}"
body: "New sensitive assets: {{get-classifications.new_classified_count}}. Top classifications: {{get-classifications.top_labels}}"
consumes:
- type: http
namespace: purview-api
baseUri: "https://{{account_name}}.purview.azure.com"
authentication:
type: bearer
token: "$secrets.purview_token"
resources:
- name: search
path: "/catalog/api/search/query"
operations:
- name: search-assets
method: POST
- type: http
namespace: msteams-governance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: graph-mail-purview
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
Triggers a Terraform Cloud workspace run to provision Azure infrastructure, monitors the run status, and posts the apply summary to a Microsoft Teams DevOps channel.
naftiko: "0.5"
info:
label: "Azure Resource Provisioning via Terraform"
description: "Triggers a Terraform Cloud workspace run to provision Azure infrastructure, monitors the run status, and posts the apply summary to a Microsoft Teams DevOps channel."
tags:
- cloud
- infrastructure
- terraform
- azure
- microsoft-teams
- devops
- provisioning
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: provision-azure-resources
description: "Given a Terraform Cloud workspace ID and a set of variable overrides, trigger a workspace run to provision Azure infrastructure, then post the run outcome to Teams DevOps channel."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Terraform Cloud workspace ID to trigger a run on."
- name: environment
in: body
type: string
description: "Target environment name, e.g. 'staging' or 'production'."
steps:
- name: trigger-run
type: call
call: "terraform.create-run"
with:
workspace_id: "{{workspace_id}}"
message: "Provisioning triggered for {{environment}} by agent"
- name: notify-devops
type: call
call: "msteams-infra.post-channel-message"
with:
channel_id: "DevOps"
text: "Terraform run triggered for workspace {{workspace_id}} targeting {{environment}}. Run ID: {{trigger-run.run_id}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: msteams-infra
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Scans Azure resources for missing mandatory tags, applies default tags where possible, and reports non-compliant resources to the governance team via Teams and a SharePoint list.
naftiko: "0.5"
info:
label: "Azure Resource Tag Compliance Enforcer"
description: "Scans Azure resources for missing mandatory tags, applies default tags where possible, and reports non-compliant resources to the governance team via Teams and a SharePoint list."
tags:
- governance
- azure
- compliance
- microsoft-teams
- sharepoint
capability:
exposes:
- type: mcp
namespace: tag-compliance
port: 8080
tools:
- name: enforce-tags
description: "Scan resources for missing tags, apply defaults, and report to the governance team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
steps:
- name: get-resources
type: call
call: "azure-resources.list-resources"
with:
subscription_id: "{{subscription_id}}"
- name: notify-governance
type: call
call: "msteams-governance-tags.post-channel-message"
with:
channel_id: "CloudGovernance"
text: "Tag compliance scan for subscription {{subscription_id}}: {{get-resources.non_compliant_count}} resources missing mandatory tags."
- name: log-to-sharepoint
type: call
call: "graph-sp-tags.create-list-item"
with:
site_id: "governance-hub"
list_id: "tag-compliance-log"
consumes:
- type: http
namespace: azure-resources
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: resources
path: "/subscriptions/{{subscription_id}}/resources"
inputParameters:
- name: subscription_id
in: path
operations:
- name: list-resources
method: GET
- type: http
namespace: msteams-governance-tags
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: graph-sp-tags
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: list-items
path: "/sites/{{site_id}}/lists/{{list_id}}/items"
inputParameters:
- name: site_id
in: path
- name: list_id
in: path
operations:
- name: create-list-item
method: POST
When a new Microsoft Sentinel incident is created, fetches the incident details and related alerts, assigns severity-based ownership, and posts triage instructions to the SOC Teams channel.
naftiko: "0.5"
info:
label: "Azure Sentinel Incident Triage"
description: "When a new Microsoft Sentinel incident is created, fetches the incident details and related alerts, assigns severity-based ownership, and posts triage instructions to the SOC Teams channel."
tags:
- security
- siem
- azure
- sentinel
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sentinel-triage
port: 8080
tools:
- name: triage-incident
description: "Triage a Sentinel incident by fetching details, assigning an owner, and posting SOC instructions."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group of the Sentinel workspace."
- name: workspace_name
in: body
type: string
description: "Log Analytics workspace name."
- name: incident_id
in: body
type: string
description: "Sentinel incident ID."
steps:
- name: get-incident
type: call
call: "sentinel-api.get-incident"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
workspace_name: "{{workspace_name}}"
incident_id: "{{incident_id}}"
- name: update-owner
type: call
call: "sentinel-api.update-incident"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
workspace_name: "{{workspace_name}}"
incident_id: "{{incident_id}}"
- name: notify-soc
type: call
call: "msteams-soc.post-channel-message"
with:
channel_id: "SOC"
text: "Sentinel incident {{incident_id}}: {{get-incident.title}} (Severity: {{get-incident.severity}}). Owner assigned. Begin triage per runbook."
consumes:
- type: http
namespace: sentinel-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: incidents
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.OperationalInsights/workspaces/{{workspace_name}}/providers/Microsoft.SecurityInsights/incidents/{{incident_id}}"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: workspace_name
in: path
- name: incident_id
in: path
operations:
- name: get-incident
method: GET
- name: update-incident
method: PATCH
- type: http
namespace: msteams-soc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Sends a message to an Azure Service Bus queue for asynchronous processing by downstream consumers.
naftiko: "0.5"
info:
label: "Azure Service Bus Message Sender"
description: "Sends a message to an Azure Service Bus queue for asynchronous processing by downstream consumers."
tags:
- messaging
- integration
- azure
- service-bus
capability:
exposes:
- type: mcp
namespace: servicebus-send
port: 8080
tools:
- name: send-message
description: "Send a message to an Azure Service Bus queue."
inputParameters:
- name: namespace_name
in: body
type: string
description: "Service Bus namespace name."
- name: queue_name
in: body
type: string
description: "Target queue name."
- name: message_body
in: body
type: string
description: "Message payload."
consumes:
- type: http
namespace: azure-servicebus
baseUri: "https://{{namespace_name}}.servicebus.windows.net"
authentication:
type: bearer
token: "$secrets.servicebus_token"
resources:
- name: queue-messages
path: "/{{queue_name}}/messages"
inputParameters:
- name: queue_name
in: path
operations:
- name: send
method: POST
Monitors Azure SQL Database availability, triggers failover to the secondary replica when health degrades, and notifies the DBA team on Teams and creates a ServiceNow incident.
naftiko: "0.5"
info:
label: "Azure SQL Database Auto Failover"
description: "Monitors Azure SQL Database availability, triggers failover to the secondary replica when health degrades, and notifies the DBA team on Teams and creates a ServiceNow incident."
tags:
- database
- azure
- high-availability
- microsoft-teams
- servicenow
capability:
exposes:
- type: mcp
namespace: sql-failover
port: 8080
tools:
- name: trigger-failover
description: "Monitor SQL Database health, trigger failover, and alert the DBA team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: server_name
in: body
type: string
description: "Azure SQL server name."
- name: failover_group
in: body
type: string
description: "Failover group name."
steps:
- name: initiate-failover
type: call
call: "sql-api.failover"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
server_name: "{{server_name}}"
failover_group: "{{failover_group}}"
- name: alert-dba
type: call
call: "msteams-dba.post-channel-message"
with:
channel_id: "DBA"
text: "SQL failover triggered for {{server_name}}/{{failover_group}}. Status: {{initiate-failover.status}}. Verify connectivity."
- name: create-snow-incident
type: call
call: "servicenow-dba.create-incident"
with:
short_description: "Azure SQL failover: {{server_name}}/{{failover_group}}"
urgency: "2"
consumes:
- type: http
namespace: sql-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: failover-groups
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Sql/servers/{{server_name}}/failoverGroups/{{failover_group}}/failover"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: server_name
in: path
- name: failover_group
in: path
operations:
- name: failover
method: POST
- type: http
namespace: msteams-dba
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: servicenow-dba
baseUri: "https://microsoft.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 GitHub push triggers an Azure Static Web Apps deployment, monitors the deployment status and posts the result with the preview URL to the frontend Teams channel.
naftiko: "0.5"
info:
label: "Azure Static Web App Deploy Notifier"
description: "When a GitHub push triggers an Azure Static Web Apps deployment, monitors the deployment status and posts the result with the preview URL to the frontend Teams channel."
tags:
- devops
- web
- azure
- github
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: swa-deploy
port: 8080
tools:
- name: track-swa-deployment
description: "Monitor a Static Web App deployment triggered by a GitHub push and notify the frontend team."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: swa_name
in: body
type: string
description: "Static Web App name."
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
steps:
- name: get-deploy-status
type: call
call: "swa-api.get-builds"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
swa_name: "{{swa_name}}"
- name: notify-frontend
type: call
call: "msteams-frontend.post-channel-message"
with:
channel_id: "Frontend"
text: "Static Web App {{swa_name}} deployment from {{repo}}: {{get-deploy-status.status}}. Preview: {{get-deploy-status.hostname}}"
consumes:
- type: http
namespace: swa-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: builds
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Web/staticSites/{{swa_name}}/builds"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: swa_name
in: path
operations:
- name: get-builds
method: GET
- type: http
namespace: msteams-frontend
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Monitors Azure Synapse Analytics for long-running queries, fetches query details, alerts the data team on Teams, and logs the event to Azure Log Analytics.
naftiko: "0.5"
info:
label: "Azure Synapse Query Performance Alert"
description: "Monitors Azure Synapse Analytics for long-running queries, fetches query details, alerts the data team on Teams, and logs the event to Azure Log Analytics."
tags:
- data
- analytics
- azure-synapse-analytics
- monitoring
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: synapse-perf
port: 8080
tools:
- name: handle-slow-query
description: "Detect and respond to long-running Synapse queries by alerting the data team and logging to Log Analytics."
inputParameters:
- name: workspace_name
in: body
type: string
description: "Synapse workspace name."
- name: threshold_minutes
in: body
type: number
description: "Query duration threshold in minutes."
steps:
- name: get-slow-queries
type: call
call: "synapse-api.list-sql-queries"
with:
workspace_name: "{{workspace_name}}"
- name: alert-team
type: call
call: "msteams-dataops.post-channel-message"
with:
channel_id: "DataOps"
text: "Slow query alert in Synapse workspace {{workspace_name}}: {{get-slow-queries.count}} queries exceeding {{threshold_minutes}} min threshold."
- name: log-event
type: call
call: "log-analytics-synapse.post-log"
with:
log_type: "SynapseSlowQuery"
body: "Workspace: {{workspace_name}}, Count: {{get-slow-queries.count}}"
consumes:
- type: http
namespace: synapse-api
baseUri: "https://{{workspace_name}}.sql.azuresynapse.net"
authentication:
type: bearer
token: "$secrets.synapse_token"
resources:
- name: sql-queries
path: "/monitoring/sql/queries"
operations:
- name: list-sql-queries
method: GET
- type: http
namespace: msteams-dataops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: log-analytics-synapse
baseUri: "https://$secrets.log_analytics_workspace_id.ods.opinsights.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: custom-logs
path: "/api/logs"
operations:
- name: post-log
method: POST
Retrieves the health status of endpoints in an Azure Traffic Manager profile, returning endpoint monitoring state and failover readiness.
naftiko: "0.5"
info:
label: "Azure Traffic Manager Health Check"
description: "Retrieves the health status of endpoints in an Azure Traffic Manager profile, returning endpoint monitoring state and failover readiness."
tags:
- azure
- networking
- traffic-manager
- monitoring
capability:
exposes:
- type: mcp
namespace: traffic-manager-health
port: 8080
tools:
- name: get-traffic-manager-health
description: "Check health status of all endpoints in an Azure Traffic Manager profile."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group containing the Traffic Manager profile."
- name: profile_name
in: body
type: string
description: "Traffic Manager profile name."
call: "azure.get-tm-profile"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
profile_name: "{{profile_name}}"
outputParameters:
- name: profile_status
type: string
mapping: "$.properties.profileStatus"
- name: endpoints
type: array
mapping: "$.properties.endpoints"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_management_token"
resources:
- name: tm-profile
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Network/trafficManagerProfiles/{{profile_name}}?api-version=2022-04-01"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: profile_name
in: path
operations:
- name: get-tm-profile
method: GET
Monitors Azure Virtual Desktop session host health, identifies disconnected sessions exceeding a threshold, alerts the VDI team on Teams, and logs findings to Log Analytics.
naftiko: "0.5"
info:
label: "Azure Virtual Desktop Session Monitor"
description: "Monitors Azure Virtual Desktop session host health, identifies disconnected sessions exceeding a threshold, alerts the VDI team on Teams, and logs findings to Log Analytics."
tags:
- endpoint-management
- azure-virtual-desktop
- monitoring
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: avd-monitor
port: 8080
tools:
- name: check-sessions
description: "Monitor AVD session host health, alert on disconnected sessions, and log to Log Analytics."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group name."
- name: host_pool_name
in: body
type: string
description: "AVD host pool name."
steps:
- name: get-sessions
type: call
call: "avd-api.list-sessions"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
host_pool_name: "{{host_pool_name}}"
- name: alert-vdi
type: call
call: "msteams-vdi.post-channel-message"
with:
channel_id: "VDI"
text: "AVD session monitor for {{host_pool_name}}: {{get-sessions.active_count}} active, {{get-sessions.disconnected_count}} disconnected sessions."
- name: log-to-analytics
type: call
call: "log-analytics-avd.post-log"
with:
log_type: "AVDSessionHealth"
body: "HostPool: {{host_pool_name}}, Active: {{get-sessions.active_count}}, Disconnected: {{get-sessions.disconnected_count}}"
consumes:
- type: http
namespace: avd-api
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: sessions
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DesktopVirtualization/hostPools/{{host_pool_name}}/userSessions"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: host_pool_name
in: path
operations:
- name: list-sessions
method: GET
- type: http
namespace: msteams-vdi
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: log-analytics-avd
baseUri: "https://$secrets.log_analytics_workspace_id.ods.opinsights.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: custom-logs
path: "/api/logs"
operations:
- name: post-log
method: POST
When a VM scale set triggers an autoscale event, captures the scaling metrics from Azure Monitor, posts a summary to Teams, and creates a tracking work item in Azure DevOps.
naftiko: "0.5"
info:
label: "Azure VM Scale Set Autoscale Alert"
description: "When a VM scale set triggers an autoscale event, captures the scaling metrics from Azure Monitor, posts a summary to Teams, and creates a tracking work item in Azure DevOps."
tags:
- cloud
- compute
- azure
- monitoring
- microsoft-teams
- azure-devops
capability:
exposes:
- type: mcp
namespace: vmss-autoscale
port: 8080
tools:
- name: handle-autoscale-event
description: "Process an Azure VM Scale Set autoscale event by fetching metrics, alerting Teams, and logging a work item in Azure DevOps."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID."
- name: resource_group
in: body
type: string
description: "Resource group containing the VMSS."
- name: vmss_name
in: body
type: string
description: "VM scale set name."
steps:
- name: get-metrics
type: call
call: "azure-monitor.get-vmss-metrics"
with:
subscription_id: "{{subscription_id}}"
resource_group: "{{resource_group}}"
vmss_name: "{{vmss_name}}"
- name: notify-teams
type: call
call: "msteams-infra.post-channel-message"
with:
channel_id: "InfraOps"
text: "Autoscale event on VMSS {{vmss_name}}: current instances {{get-metrics.instance_count}}, CPU {{get-metrics.avg_cpu}}%"
- name: create-work-item
type: call
call: "ado-infra.create-item"
with:
title: "Autoscale event: {{vmss_name}} scaled to {{get-metrics.instance_count}} instances"
work_item_type: "Task"
consumes:
- type: http
namespace: azure-monitor
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: vmss-metrics
path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.Compute/virtualMachineScaleSets/{{vmss_name}}/providers/Microsoft.Insights/metrics"
inputParameters:
- name: subscription_id
in: path
- name: resource_group
in: path
- name: vmss_name
in: path
operations:
- name: get-vmss-metrics
method: GET
- type: http
namespace: msteams-infra
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: ado-infra
baseUri: "https://dev.azure.com/$secrets.ado_org/InfraOps/_apis/wit"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: work-items
path: "/workitems/$Task"
operations:
- name: create-item
method: POST
Sends a prompt to the Azure OpenAI Service chat completions endpoint and returns the generated response.
naftiko: "0.5"
info:
label: "Copilot Chat Completion"
description: "Sends a prompt to the Azure OpenAI Service chat completions endpoint and returns the generated response."
tags:
- ai
- generative-ai
- azure
- copilot
- llm
capability:
exposes:
- type: mcp
namespace: copilot-chat
port: 8080
tools:
- name: chat-complete
description: "Send a user prompt to Azure OpenAI chat completions and return the assistant response."
inputParameters:
- name: deployment_id
in: body
type: string
description: "Azure OpenAI deployment name."
- name: prompt
in: body
type: string
description: "User prompt text."
consumes:
- type: http
namespace: azure-openai
baseUri: "https://$secrets.azure_openai_endpoint.openai.azure.com/openai/deployments/{{deployment_id}}"
authentication:
type: apiKey
name: api-key
value: "$secrets.azure_openai_key"
resources:
- name: chat-completions
path: "/chat/completions"
inputParameters:
- name: deployment_id
in: path
operations:
- name: create-completion
method: POST
Takes a user question, searches Azure AI Search for relevant documents, passes the results to Azure OpenAI for RAG-based answer generation, and returns the answer with source citations.
naftiko: "0.5"
info:
label: "Copilot Document QA Agent"
description: "Takes a user question, searches Azure AI Search for relevant documents, passes the results to Azure OpenAI for RAG-based answer generation, and returns the answer with source citations."
tags:
- ai
- generative-ai
- azure
- search
- copilot
- rag
capability:
exposes:
- type: mcp
namespace: doc-qa
port: 8080
tools:
- name: answer-question
description: "Answer a question using RAG by searching Azure AI Search and generating a response with Azure OpenAI."
inputParameters:
- name: question
in: body
type: string
description: "User question to answer."
- name: index_name
in: body
type: string
description: "Azure AI Search index name."
- name: service_name
in: body
type: string
description: "Azure AI Search service name."
steps:
- name: search-docs
type: call
call: "azure-search-rag.query-index"
with:
service_name: "{{service_name}}"
index_name: "{{index_name}}"
query: "{{question}}"
- name: generate-answer
type: call
call: "azure-openai-rag.create-completion"
with:
deployment_id: "gpt-4o"
prompt: "Answer the following question based on these documents:\n\nDocuments: {{search-docs.results}}\n\nQuestion: {{question}}"
consumes:
- type: http
namespace: azure-search-rag
baseUri: "https://{{service_name}}.search.windows.net"
authentication:
type: apiKey
name: api-key
value: "$secrets.azure_search_key"
resources:
- name: search
path: "/indexes/{{index_name}}/docs/search"
inputParameters:
- name: index_name
in: path
operations:
- name: query-index
method: POST
- type: http
namespace: azure-openai-rag
baseUri: "https://$secrets.azure_openai_endpoint.openai.azure.com/openai/deployments/{{deployment_id}}"
authentication:
type: apiKey
name: api-key
value: "$secrets.azure_openai_key"
resources:
- name: completions
path: "/chat/completions"
inputParameters:
- name: deployment_id
in: path
operations:
- name: create-completion
method: POST
When Datadog detects error rate spike following a deployment, triggers an Azure DevOps pipeline rollback, creates a ServiceNow P1 incident, and alerts the Engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Datadog Deployment Rollback Trigger"
description: "When Datadog detects error rate spike following a deployment, triggers an Azure DevOps pipeline rollback, creates a ServiceNow P1 incident, and alerts the Engineering Microsoft Teams channel."
tags:
- devops
- observability
- datadog
- azure-devops
- servicenow
- rollback
- incident-response
capability:
exposes:
- type: mcp
namespace: deployment-ops
port: 8080
tools:
- name: trigger-deployment-rollback
description: "Given a Datadog monitor alert ID and Azure DevOps pipeline ID, trigger an Azure DevOps rollback pipeline run, open a ServiceNow P1 incident, and alert the Engineering Teams channel."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Datadog monitor ID that detected the error rate spike."
- name: pipeline_id
in: body
type: string
description: "Azure DevOps pipeline ID configured for rollback."
- name: azure_organization
in: body
type: string
description: "Azure DevOps organization name."
- name: azure_project
in: body
type: string
description: "Azure DevOps project name."
steps:
- name: get-monitor
type: call
call: "datadog-rollback.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: trigger-rollback
type: call
call: "azure-devops.trigger-pipeline"
with:
organization: "{{azure_organization}}"
project: "{{azure_project}}"
pipeline_id: "{{pipeline_id}}"
- name: create-p1
type: call
call: "servicenow-rollback.create-incident"
with:
short_description: "Deployment rollback triggered: {{get-monitor.name}}"
urgency: "1"
category: "deployment"
- name: alert-engineering
type: call
call: "msteams-deployment.post-channel-message"
with:
channel_id: "Engineering"
text: "Rollback triggered for {{azure_project}}/{{pipeline_id}}. Monitor: {{get-monitor.name}} | P1: {{create-p1.number}}"
consumes:
- type: http
namespace: datadog-rollback
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: azure-devops
baseUri: "https://dev.azure.com"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: pipelines
path: "/{{organization}}/{{project}}/_apis/pipelines/{{pipeline_id}}/runs"
inputParameters:
- name: organization
in: path
- name: project
in: path
- name: pipeline_id
in: path
operations:
- name: trigger-pipeline
method: POST
- type: http
namespace: servicenow-rollback
baseUri: "https://microsoft.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-deployment
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Polls Datadog SLO status for target services, posts breach alerts to Microsoft Teams on-call channel, and opens ServiceNow incidents for any SLO below threshold.
naftiko: "0.5"
info:
label: "Datadog SLO Breach Alert"
description: "Polls Datadog SLO status for target services, posts breach alerts to Microsoft Teams on-call channel, and opens ServiceNow incidents for any SLO below threshold."
tags:
- observability
- slo
- datadog
- servicenow
- microsoft-teams
- reliability
capability:
exposes:
- type: mcp
namespace: reliability-ops
port: 8080
tools:
- name: check-slo-breaches
description: "Given a Datadog SLO group ID and minimum compliance threshold, list SLOs below the threshold, open ServiceNow P2 incidents for each breached SLO, and post a summary to the OnCall Teams channel."
inputParameters:
- name: slo_group_id
in: body
type: string
description: "Datadog SLO group or service tag to query."
- name: compliance_threshold
in: body
type: number
description: "Minimum SLO compliance percentage (e.g. 99.9) below which an alert is triggered."
steps:
- name: get-slo-status
type: call
call: "datadog-slo.list-slos"
with:
tags: "service:{{slo_group_id}}"
- name: create-snow-incident
type: call
call: "servicenow-slo.create-incident"
with:
short_description: "SLO breach: {{slo_group_id}} below {{compliance_threshold}}%"
urgency: "2"
category: "reliability"
- name: alert-oncall
type: call
call: "msteams-slo.post-channel-message"
with:
channel_id: "OnCall"
text: "SLO breach: {{slo_group_id}} at {{get-slo-status.compliance}}% (threshold {{compliance_threshold}}%). SNOW: {{create-snow-incident.number}}"
consumes:
- type: http
namespace: datadog-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"
inputParameters:
- name: tags
in: query
operations:
- name: list-slos
method: GET
- type: http
namespace: servicenow-slo
baseUri: "https://microsoft.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-slo
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When Microsoft Defender for Endpoint raises a high-severity alert, fetches incident details, isolates the affected device, notifies the security team on Teams, and opens a ServiceNow incident.
naftiko: "0.5"
info:
label: "Defender Threat Incident Handler"
description: "When Microsoft Defender for Endpoint raises a high-severity alert, fetches incident details, isolates the affected device, notifies the security team on Teams, and opens a ServiceNow incident."
tags:
- security
- microsoft-defender
- incident-response
- microsoft-teams
- servicenow
capability:
exposes:
- type: mcp
namespace: threat-response
port: 8080
tools:
- name: handle-defender-alert
description: "Process a Defender for Endpoint alert by fetching details, isolating the device, notifying security, and opening a ServiceNow incident."
inputParameters:
- name: alert_id
in: body
type: string
description: "Defender alert ID."
- name: device_id
in: body
type: string
description: "Device ID to isolate."
steps:
- name: get-alert
type: call
call: "defender-api.get-alert-details"
with:
alert_id: "{{alert_id}}"
- name: isolate-device
type: call
call: "defender-api.isolate-machine"
with:
device_id: "{{device_id}}"
- name: notify-security
type: call
call: "msteams-security.post-channel-message"
with:
channel_id: "SecurityOps"
text: "CRITICAL: Defender alert {{alert_id}} — {{get-alert.title}}. Device {{device_id}} isolated."
- name: open-incident
type: call
call: "servicenow-sec.create-incident"
with:
short_description: "Defender alert: {{get-alert.title}}"
urgency: "1"
description: "Alert ID: {{alert_id}}\nDevice: {{device_id}}\nSeverity: {{get-alert.severity}}"
consumes:
- type: http
namespace: defender-api
baseUri: "https://api.securitycenter.microsoft.com/api"
authentication:
type: bearer
token: "$secrets.defender_token"
resources:
- name: alerts
path: "/alerts/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-alert-details
method: GET
- name: machines
path: "/machines/{{device_id}}/isolate"
inputParameters:
- name: device_id
in: path
operations:
- name: isolate-machine
method: POST
- type: http
namespace: msteams-security
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: servicenow-sec
baseUri: "https://microsoft.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Creates a new contact record in Dynamics 365 CRM via the Dataverse Web API.
naftiko: "0.5"
info:
label: "Dynamics 365 Contact Creator"
description: "Creates a new contact record in Dynamics 365 CRM via the Dataverse Web API."
tags:
- crm
- dynamics-365
- sales
- microsoft
capability:
exposes:
- type: mcp
namespace: d365-contacts
port: 8080
tools:
- name: create-contact
description: "Create a new contact in Dynamics 365 with the given name and email."
inputParameters:
- name: first_name
in: body
type: string
description: "Contact first name."
- name: last_name
in: body
type: string
description: "Contact last name."
- name: email
in: body
type: string
description: "Contact email address."
consumes:
- type: http
namespace: d365-api
baseUri: "https://$secrets.d365_org.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.d365_token"
resources:
- name: contacts
path: "/contacts"
operations:
- name: create
method: POST
When a high-priority Dynamics 365 customer service case is created, opens a linked ServiceNow incident for internal tracking and notifies the customer success team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Dynamics 365 Customer Case to ServiceNow Ticket"
description: "When a high-priority Dynamics 365 customer service case is created, opens a linked ServiceNow incident for internal tracking and notifies the customer success team via Microsoft Teams."
tags:
- customer-support
- crm
- dynamics-365
- servicenow
- microsoft-teams
- case-management
capability:
exposes:
- type: mcp
namespace: customer-support
port: 8080
tools:
- name: escalate-customer-case
description: "Given a Dynamics 365 case number with Priority 1 or 2, create a linked ServiceNow incident for internal IT tracking and notify the customer success Teams channel."
inputParameters:
- name: case_number
in: body
type: string
description: "Dynamics 365 case number to escalate, e.g. CAS-10001."
- name: customer_name
in: body
type: string
description: "Customer display name associated with the case."
steps:
- name: get-case
type: call
call: "dynamics365-cs.get-case"
with:
case_number: "{{case_number}}"
- name: create-snow-incident
type: call
call: "servicenow-cs.create-incident"
with:
short_description: "Customer escalation: {{customer_name}} — {{get-case.title}}"
category: "customer_support"
urgency: "{{get-case.priority}}"
- name: notify-cs-team
type: call
call: "msteams-cs.post-channel-message"
with:
channel_id: "CustomerSuccess"
text: "Escalation opened for {{customer_name}}: {{case_number}} | ServiceNow: {{create-snow-incident.number}}"
consumes:
- type: http
namespace: dynamics365-cs
baseUri: "https://microsoft.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.dynamics365_token"
resources:
- name: cases
path: "/incidents/{{case_number}}"
inputParameters:
- name: case_number
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: servicenow-cs
baseUri: "https://microsoft.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-cs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an invoice is created in Dynamics 365, extracts the invoice details, creates a corresponding entry in QuickBooks Online, and logs the sync to a SharePoint audit list.
naftiko: "0.5"
info:
label: "Dynamics 365 Invoice to QuickBooks Sync"
description: "When an invoice is created in Dynamics 365, extracts the invoice details, creates a corresponding entry in QuickBooks Online, and logs the sync to a SharePoint audit list."
tags:
- erp
- finance
- dynamics-365
- integration
- sharepoint
capability:
exposes:
- type: mcp
namespace: invoice-sync
port: 8080
tools:
- name: sync-invoice
description: "Sync a Dynamics 365 invoice to QuickBooks Online and log the sync event."
inputParameters:
- name: invoice_id
in: body
type: string
description: "Dynamics 365 invoice ID."
steps:
- name: get-invoice
type: call
call: "d365-invoices.get-invoice"
with:
invoice_id: "{{invoice_id}}"
- name: create-qb-invoice
type: call
call: "quickbooks-api.create-invoice"
with:
customer_name: "{{get-invoice.customer_name}}"
amount: "{{get-invoice.total_amount}}"
- name: log-to-sharepoint
type: call
call: "graph-sp-audit.create-list-item"
with:
site_id: "finance-audit"
list_id: "invoice-sync-log"
consumes:
- type: http
namespace: d365-invoices
baseUri: "https://$secrets.d365_org.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.d365_token"
resources:
- name: invoices
path: "/invoices({{invoice_id}})"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: quickbooks-api
baseUri: "https://quickbooks.api.intuit.com/v3/company/$secrets.qb_company_id"
authentication:
type: bearer
token: "$secrets.quickbooks_token"
resources:
- name: invoices
path: "/invoice"
operations:
- name: create-invoice
method: POST
- type: http
namespace: graph-sp-audit
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: list-items
path: "/sites/{{site_id}}/lists/{{list_id}}/items"
inputParameters:
- name: site_id
in: path
- name: list_id
in: path
operations:
- name: create-list-item
method: POST
When a new lead is created in Dynamics 365, enriches it with LinkedIn data, scores the lead, and creates a follow-up task for the sales rep in Dynamics 365.
naftiko: "0.5"
info:
label: "Dynamics 365 Lead Qualification Workflow"
description: "When a new lead is created in Dynamics 365, enriches it with LinkedIn data, scores the lead, and creates a follow-up task for the sales rep in Dynamics 365."
tags:
- crm
- sales
- dynamics-365
- linkedin
- automation
capability:
exposes:
- type: mcp
namespace: lead-qualification
port: 8080
tools:
- name: qualify-lead
description: "Enrich a Dynamics 365 lead with LinkedIn data, score it, and create a follow-up task."
inputParameters:
- name: lead_id
in: body
type: string
description: "Dynamics 365 lead ID."
- name: company_name
in: body
type: string
description: "Company name for LinkedIn lookup."
steps:
- name: get-lead
type: call
call: "d365-leads.get-lead"
with:
lead_id: "{{lead_id}}"
- name: enrich-linkedin
type: call
call: "linkedin-enrich.company-lookup"
with:
company_name: "{{company_name}}"
- name: create-followup
type: call
call: "d365-tasks.create-task"
with:
subject: "Follow up with {{get-lead.fullname}} at {{company_name}}"
regarding_id: "{{lead_id}}"
description: "Company size: {{enrich-linkedin.employee_count}}. Industry: {{enrich-linkedin.industry}}"
consumes:
- type: http
namespace: d365-leads
baseUri: "https://$secrets.d365_org.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.d365_token"
resources:
- name: leads
path: "/leads({{lead_id}})"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- type: http
namespace: linkedin-enrich
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: companies
path: "/organizationAcls"
operations:
- name: company-lookup
method: GET
- type: http
namespace: d365-tasks
baseUri: "https://$secrets.d365_org.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.d365_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
method: POST
Queries open opportunities from Dynamics 365 CRM and pushes a refreshed dataset to Power BI for executive pipeline reporting.
naftiko: "0.5"
info:
label: "Dynamics 365 Opportunity Sync to Power BI"
description: "Queries open opportunities from Dynamics 365 CRM and pushes a refreshed dataset to Power BI for executive pipeline reporting."
tags:
- sales
- crm
- dynamics-365
- power-bi
- reporting
- data
capability:
exposes:
- type: mcp
namespace: sales-reporting
port: 8080
tools:
- name: sync-pipeline-to-powerbi
description: "Given a Dynamics 365 sales stage filter, query all open opportunities and push the results to a Power BI streaming dataset for live pipeline dashboards."
inputParameters:
- name: stage_filter
in: body
type: string
description: "Opportunity sales stage to filter by, e.g. 'Proposal' or 'Negotiation'."
- name: dataset_id
in: body
type: string
description: "Power BI streaming dataset ID to push rows into."
steps:
- name: get-opportunities
type: call
call: "dynamics365.list-opportunities"
with:
stage: "{{stage_filter}}"
- name: push-to-powerbi
type: call
call: "powerbi.push-rows"
with:
dataset_id: "{{dataset_id}}"
rows: "{{get-opportunities.records}}"
consumes:
- type: http
namespace: dynamics365
baseUri: "https://microsoft.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.dynamics365_token"
resources:
- name: opportunities
path: "/opportunities"
inputParameters:
- name: stage
in: query
operations:
- name: list-opportunities
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: streaming-datasets
path: "/datasets/{{dataset_id}}/rows"
inputParameters:
- name: dataset_id
in: path
operations:
- name: push-rows
method: POST
When a new hire is provisioned in Workday, creates an Azure AD account via Microsoft Graph, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is provisioned in Workday, creates an Azure AD account via Microsoft Graph, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- microsoft-graph
- servicenow
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and start date, orchestrate full onboarding: create Azure AD account, open ServiceNow ticket, provision SharePoint folder, and send Teams welcome card."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in ISO 8601 format (YYYY-MM-DD)."
- name: department
in: body
type: string
description: "Department name used to assign SharePoint site and Teams channel."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: create-aad-user
type: call
call: "msgraph.create-user"
with:
displayName: "{{get-worker.full_name}}"
userPrincipalName: "{{get-worker.work_email}}"
department: "{{department}}"
- name: open-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-worker.full_name}}"
category: "hr_onboarding"
assigned_to: "IT_Onboarding"
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "hr-onboarding"
folder_path: "OnboardingDocs/{{get-worker.full_name}}_{{start_date}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Welcome to Microsoft, {{get-worker.first_name}}! 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: "/microsoft/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://microsoft.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chat-messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Audits Entra ID conditional access policies for compliance gaps, generates a summary report, and sends the findings to the security team via email and Teams.
naftiko: "0.5"
info:
label: "Entra Conditional Access Compliance Checker"
description: "Audits Entra ID conditional access policies for compliance gaps, generates a summary report, and sends the findings to the security team via email and Teams."
tags:
- security
- identity
- entra
- compliance
- microsoft-teams
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: ca-compliance
port: 8080
tools:
- name: audit-conditional-access
description: "Audit Entra ID conditional access policies and report compliance findings to the security team."
inputParameters:
- name: policy_filter
in: body
type: string
description: "Optional filter to scope policies, e.g. displayName prefix."
steps:
- name: list-policies
type: call
call: "graph-ca.list-policies"
with: {}
- name: notify-teams
type: call
call: "msteams-compliance.post-channel-message"
with:
channel_id: "SecurityCompliance"
text: "Conditional Access audit complete. Policies reviewed: {{list-policies.count}}. Non-compliant: {{list-policies.non_compliant_count}}"
- name: email-report
type: call
call: "graph-mail.send-mail"
with:
sender_id: "compliance-bot@microsoft.com"
subject: "Conditional Access Compliance Report"
body: "Policies reviewed: {{list-policies.count}}. Non-compliant: {{list-policies.non_compliant_count}}. Review in Entra admin center."
consumes:
- type: http
namespace: graph-ca
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: policies
path: "/identity/conditionalAccess/policies"
operations:
- name: list-policies
method: GET
- type: http
namespace: msteams-compliance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: graph-mail
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
When Entra ID Protection detects a risky sign-in, fetches the risk details, forces a password reset, and notifies the user and SOC team via email and Teams.
naftiko: "0.5"
info:
label: "Entra Sign-In Risk Responder"
description: "When Entra ID Protection detects a risky sign-in, fetches the risk details, forces a password reset, and notifies the user and SOC team via email and Teams."
tags:
- security
- identity
- entra
- microsoft-teams
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: signin-risk
port: 8080
tools:
- name: respond-to-risky-signin
description: "Fetch risky sign-in details, force password reset, and notify the user and SOC."
inputParameters:
- name: risk_detection_id
in: body
type: string
description: "Entra ID risk detection ID."
steps:
- name: get-risk
type: call
call: "graph-risk.get-risk-detection"
with:
risk_detection_id: "{{risk_detection_id}}"
- name: notify-soc
type: call
call: "msteams-soc-risk.post-channel-message"
with:
channel_id: "SOC"
text: "Risky sign-in detected for {{get-risk.user_display_name}} from {{get-risk.ip_address}} ({{get-risk.location}}). Risk level: {{get-risk.risk_level}}. Password reset initiated."
- name: email-user
type: call
call: "graph-mail-risk.send-mail"
with:
sender_id: "security@microsoft.com"
subject: "Security Alert — Suspicious Sign-In Detected"
body: "A suspicious sign-in was detected on your account from {{get-risk.ip_address}}. Your password has been reset as a precaution. Please contact IT if this was you."
consumes:
- type: http
namespace: graph-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: risk-detections
path: "/identityProtection/riskDetections/{{risk_detection_id}}"
inputParameters:
- name: risk_detection_id
in: path
operations:
- name: get-risk-detection
method: GET
- type: http
namespace: msteams-soc-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: graph-mail-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
Reads data from an Excel Online workbook stored in SharePoint, transforms it for a Power BI push dataset, and posts a data freshness confirmation to the analytics Teams channel.
naftiko: "0.5"
info:
label: "Excel Online Data Pipeline"
description: "Reads data from an Excel Online workbook stored in SharePoint, transforms it for a Power BI push dataset, and posts a data freshness confirmation to the analytics Teams channel."
tags:
- data
- microsoft-excel
- sharepoint
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: excel-pipeline
port: 8080
tools:
- name: sync-excel-to-powerbi
description: "Read Excel data from SharePoint, push to Power BI, and confirm data freshness."
inputParameters:
- name: site_id
in: body
type: string
description: "SharePoint site ID."
- name: item_id
in: body
type: string
description: "Excel workbook item ID."
- name: sheet_name
in: body
type: string
description: "Worksheet name to read."
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID."
steps:
- name: read-excel
type: call
call: "graph-excel.get-range"
with:
site_id: "{{site_id}}"
item_id: "{{item_id}}"
sheet_name: "{{sheet_name}}"
- name: push-to-powerbi
type: call
call: "powerbi-excel.push-rows"
with:
dataset_id: "{{dataset_id}}"
rows: "{{read-excel.values}}"
- name: confirm-freshness
type: call
call: "msteams-analytics.post-channel-message"
with:
channel_id: "Analytics"
text: "Excel data pipeline complete: {{read-excel.row_count}} rows from {{sheet_name}} pushed to Power BI dataset {{dataset_id}}."
consumes:
- type: http
namespace: graph-excel
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: ranges
path: "/sites/{{site_id}}/drive/items/{{item_id}}/workbook/worksheets/{{sheet_name}}/usedRange"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
- name: sheet_name
in: path
operations:
- name: get-range
method: GET
- type: http
namespace: powerbi-excel
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{dataset_id}}/tables/ExcelData/rows"
inputParameters:
- name: dataset_id
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-analytics
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a GitHub Actions deployment workflow completes, records the deployment in Azure DevOps release tracking, updates the deployment dashboard in Power BI, and notifies the team on Teams.
naftiko: "0.5"
info:
label: "GitHub Actions Deployment Tracker"
description: "When a GitHub Actions deployment workflow completes, records the deployment in Azure DevOps release tracking, updates the deployment dashboard in Power BI, and notifies the team on Teams."
tags:
- devops
- ci-cd
- github-actions
- azure-devops
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: deploy-tracker
port: 8080
tools:
- name: track-deployment
description: "Record a GitHub Actions deployment in ADO, update Power BI dashboard, and notify the team."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: environment
in: body
type: string
description: "Deployment environment (staging, production)."
steps:
- name: get-workflow-run
type: call
call: "github-actions.get-run"
with:
repo: "{{repo}}"
run_id: "{{run_id}}"
- name: push-to-powerbi
type: call
call: "powerbi-deploy.push-rows"
with:
dataset_id: "deployment-tracker"
rows: "{{get-workflow-run.summary}}"
- name: notify-team
type: call
call: "msteams-deploy.post-channel-message"
with:
channel_id: "Deployments"
text: "Deployment to {{environment}} complete for {{repo}}. Status: {{get-workflow-run.conclusion}}. Duration: {{get-workflow-run.duration_seconds}}s"
consumes:
- type: http
namespace: github-actions
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-run
method: GET
- type: http
namespace: powerbi-deploy
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{dataset_id}}/tables/Deployments/rows"
inputParameters:
- name: dataset_id
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-deploy
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts an alert to Microsoft Teams engineering channel, and adds a Datadog deployment marker.
naftiko: "0.5"
info:
label: "GitHub Actions Pipeline Failure Handler"
description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts an alert to Microsoft Teams engineering channel, and adds a Datadog deployment marker."
tags:
- devops
- cicd
- github
- github-actions
- jira
- microsoft-teams
- datadog
capability:
exposes:
- type: mcp
namespace: devops-cicd
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions workflow failure, create a Jira bug in the ENG project, post an alert to Teams engineering channel, and add a Datadog deployment event marker."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: workflow_name
in: body
type: string
description: "Name of the GitHub Actions workflow that failed."
- name: run_id
in: body
type: string
description: "The GitHub Actions run ID for the failed workflow."
- name: branch
in: body
type: string
description: "Branch name on which the failure occurred."
- name: commit_sha
in: body
type: string
description: "Git commit SHA that triggered the failing run."
steps:
- name: create-jira-bug
type: call
call: "jira-eng.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
description: "Run ID: {{run_id}}\nCommit: {{commit_sha}}\nRepo: {{repo}}"
- name: post-teams-alert
type: call
call: "msteams-cicd.post-channel-message"
with:
channel_id: "Engineering"
text: "Pipeline failure: {{workflow_name}} on {{branch}} in {{repo}}. Jira: {{create-jira-bug.key}}"
- name: add-datadog-event
type: call
call: "datadog.create-event"
with:
title: "CI Failure: {{repo}}/{{branch}}"
text: "Workflow {{workflow_name}} failed on commit {{commit_sha}}"
tags: "env:ci,repo:{{repo}}"
consumes:
- type: http
namespace: jira-eng
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-cicd
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
On a pull request to main, runs a code coverage check via GitHub Actions status API, blocks merge if coverage drops below threshold, and posts the gate result to Jira and Microsoft Teams.
naftiko: "0.5"
info:
label: "GitHub Code Quality Gate"
description: "On a pull request to main, runs a code coverage check via GitHub Actions status API, blocks merge if coverage drops below threshold, and posts the gate result to Jira and Microsoft Teams."
tags:
- devops
- code-quality
- github
- jira
- microsoft-teams
- testing
capability:
exposes:
- type: mcp
namespace: quality-gates
port: 8080
tools:
- name: enforce-coverage-gate
description: "Given a GitHub repo, PR number, and minimum coverage threshold, check the PR's coverage status from GitHub Checks API, comment the result on the PR, and post to Engineering Teams if the gate fails."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: pr_number
in: body
type: integer
description: "Pull request number to check coverage for."
- name: coverage_threshold
in: body
type: number
description: "Minimum code coverage percentage required to pass, e.g. 80.0."
steps:
- name: get-check-runs
type: call
call: "github-checks.list-check-runs"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
- name: post-pr-comment
type: call
call: "github-comments.create-pr-comment"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
body: "Coverage gate: {{get-check-runs.coverage}}% (threshold: {{coverage_threshold}}%) — {{get-check-runs.gate_result}}"
- name: notify-eng
type: call
call: "msteams-quality.post-channel-message"
with:
channel_id: "Engineering"
text: "Coverage gate {{get-check-runs.gate_result}} for PR #{{pr_number}} in {{repo}}. Coverage: {{get-check-runs.coverage}}%"
consumes:
- type: http
namespace: github-checks
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: check-runs
path: "/repos/{{repo}}/commits/{{pr_number}}/check-runs"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: list-check-runs
method: GET
- type: http
namespace: github-comments
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: issue-comments
path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: create-pr-comment
method: POST
- type: http
namespace: msteams-quality
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches GitHub Copilot usage metrics for an organization, writes them to a Power BI dataset, and posts a weekly summary to the engineering Teams channel.
naftiko: "0.5"
info:
label: "GitHub Copilot Usage Dashboard Sync"
description: "Fetches GitHub Copilot usage metrics for an organization, writes them to a Power BI dataset, and posts a weekly summary to the engineering Teams channel."
tags:
- devops
- github-copilot
- analytics
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: copilot-usage
port: 8080
tools:
- name: sync-copilot-usage
description: "Fetch GitHub Copilot usage data for an org, push to Power BI, and notify the engineering team."
inputParameters:
- name: org
in: body
type: string
description: "GitHub organization name."
steps:
- name: get-usage
type: call
call: "github-copilot.get-usage-metrics"
with:
org: "{{org}}"
- name: push-to-powerbi
type: call
call: "powerbi-copilot.push-rows"
with:
dataset_id: "copilot-usage-dataset"
rows: "{{get-usage.daily_metrics}}"
- name: notify-eng
type: call
call: "msteams-eng.post-channel-message"
with:
channel_id: "Engineering"
text: "Copilot usage sync complete for {{org}}. Total suggestions accepted: {{get-usage.total_accepted}}. Acceptance rate: {{get-usage.acceptance_rate}}%"
consumes:
- type: http
namespace: github-copilot
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: copilot-usage
path: "/orgs/{{org}}/copilot/usage"
inputParameters:
- name: org
in: path
operations:
- name: get-usage-metrics
method: GET
- type: http
namespace: powerbi-copilot
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{dataset_id}}/tables/UsageMetrics/rows"
inputParameters:
- name: dataset_id
in: path
operations:
- name: push-rows
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches open Dependabot vulnerability alerts for a GitHub organization's repositories and creates Jira tickets in the Security project for critical and high severity alerts.
naftiko: "0.5"
info:
label: "GitHub Dependabot Alert to Jira"
description: "Fetches open Dependabot vulnerability alerts for a GitHub organization's repositories and creates Jira tickets in the Security project for critical and high severity alerts."
tags:
- security
- devops
- github
- jira
- vulnerability-management
- dependabot
capability:
exposes:
- type: mcp
namespace: dependency-security
port: 8080
tools:
- name: sync-dependabot-to-jira
description: "Given a GitHub organization name, fetch all open Dependabot alerts at critical or high severity and create a Jira ticket in the SEC project for each unique package vulnerability."
inputParameters:
- name: github_org
in: body
type: string
description: "GitHub organization to scan for Dependabot alerts."
- name: min_severity
in: body
type: string
description: "Minimum severity to sync: 'high' or 'critical'."
steps:
- name: get-dependabot-alerts
type: call
call: "github-deps.list-dependabot-alerts"
with:
org: "{{github_org}}"
severity: "{{min_severity}}"
- name: create-jira-issue
type: call
call: "jira-deps.create-issue"
with:
project_key: "SEC"
issuetype: "Bug"
summary: "Dependabot alerts: {{get-dependabot-alerts.alert_count}} {{min_severity}}+ in {{github_org}}"
description: "Affected packages: {{get-dependabot-alerts.package_names}}\nRepositories: {{get-dependabot-alerts.repo_names}}"
consumes:
- type: http
namespace: github-deps
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/orgs/{{org}}/dependabot/alerts"
inputParameters:
- name: org
in: path
- name: severity
in: query
operations:
- name: list-dependabot-alerts
method: GET
- type: http
namespace: jira-deps
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
When a GitHub issue is labeled for tracking, creates a corresponding work item in Azure DevOps and posts a link back as a GitHub comment.
naftiko: "0.5"
info:
label: "GitHub Issue to Azure DevOps Sync"
description: "When a GitHub issue is labeled for tracking, creates a corresponding work item in Azure DevOps and posts a link back as a GitHub comment."
tags:
- devops
- github
- azure-devops
- project-management
- integration
capability:
exposes:
- type: mcp
namespace: issue-sync
port: 8080
tools:
- name: sync-issue-to-ado
description: "Sync a GitHub issue to Azure DevOps as a work item and comment back with the link."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: issue_number
in: body
type: integer
description: "GitHub issue number."
- name: ado_project
in: body
type: string
description: "Azure DevOps project name."
steps:
- name: get-issue
type: call
call: "github-issues.get-issue"
with:
repo: "{{repo}}"
issue_number: "{{issue_number}}"
- name: create-work-item
type: call
call: "ado-sync.create-item"
with:
title: "{{get-issue.title}}"
work_item_type: "User Story"
description: "Synced from GitHub issue #{{issue_number}} in {{repo}}"
- name: comment-back
type: call
call: "github-comments-sync.create-comment"
with:
repo: "{{repo}}"
issue_number: "{{issue_number}}"
body: "Tracked in Azure DevOps: {{create-work-item.url}}"
consumes:
- type: http
namespace: github-issues
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: issues
path: "/repos/{{repo}}/issues/{{issue_number}}"
inputParameters:
- name: repo
in: path
- name: issue_number
in: path
operations:
- name: get-issue
method: GET
- type: http
namespace: ado-sync
baseUri: "https://dev.azure.com/$secrets.ado_org/{{ado_project}}/_apis/wit"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: work-items
path: "/workitems/$User Story"
operations:
- name: create-item
method: POST
- type: http
namespace: github-comments-sync
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: comments
path: "/repos/{{repo}}/issues/{{issue_number}}/comments"
inputParameters:
- name: repo
in: path
- name: issue_number
in: path
operations:
- name: create-comment
method: POST
When a pull request is opened, analyzes the changed files to determine appropriate labels, applies them, and posts a summary to the repository's Teams channel.
naftiko: "0.5"
info:
label: "GitHub Pull Request Auto Labeler"
description: "When a pull request is opened, analyzes the changed files to determine appropriate labels, applies them, and posts a summary to the repository's Teams channel."
tags:
- devops
- github
- automation
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pr-labeler
port: 8080
tools:
- name: auto-label-pr
description: "Analyze PR changed files, apply labels, and notify the team."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: pr_number
in: body
type: integer
description: "Pull request number."
steps:
- name: get-files
type: call
call: "github-pr-files.list-files"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
- name: add-labels
type: call
call: "github-pr-labels.add-labels"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
- name: notify-team
type: call
call: "msteams-repo.post-channel-message"
with:
channel_id: "Engineering"
text: "PR #{{pr_number}} in {{repo}} auto-labeled: {{get-files.detected_labels}}. Files changed: {{get-files.file_count}}."
consumes:
- type: http
namespace: github-pr-files
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pr-files
path: "/repos/{{repo}}/pulls/{{pr_number}}/files"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: list-files
method: GET
- type: http
namespace: github-pr-labels
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: labels
path: "/repos/{{repo}}/issues/{{pr_number}}/labels"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: add-labels
method: POST
- type: http
namespace: msteams-repo
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
On a new GitHub pull request to a protected branch, triggers an Azure Defender for DevOps scan, posts scan results as a PR comment, and opens a Jira security ticket if critical findings are detected.
naftiko: "0.5"
info:
label: "GitHub Pull Request Security Scan"
description: "On a new GitHub pull request to a protected branch, triggers an Azure Defender for DevOps scan, posts scan results as a PR comment, and opens a Jira security ticket if critical findings are detected."
tags:
- devops
- security
- github
- azure-defender
- jira
- code-review
capability:
exposes:
- type: mcp
namespace: devops-security
port: 8080
tools:
- name: handle-pr-security-scan
description: "Given a GitHub PR number, repo, and head SHA, trigger an Azure Defender scan, post findings as a PR comment, and open a Jira security bug if critical issues are found."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format, e.g. microsoft/vscode."
- name: pr_number
in: body
type: integer
description: "The GitHub pull request number."
- name: head_sha
in: body
type: string
description: "The commit SHA of the PR head to scan."
steps:
- name: trigger-scan
type: call
call: "azure-defender.trigger-scan"
with:
repository: "{{repo}}"
commit_sha: "{{head_sha}}"
- name: post-comment
type: call
call: "github-pr.create-pr-comment"
with:
repo: "{{repo}}"
pr_number: "{{pr_number}}"
body: "Security scan complete. Scan ID: {{trigger-scan.scan_id}} | Status: {{trigger-scan.status}} | Findings: {{trigger-scan.critical_count}} critical"
- name: open-jira-ticket
type: call
call: "jira-security.create-issue"
with:
project_key: "SEC"
issuetype: "Bug"
summary: "[Security] Critical findings in PR #{{pr_number}} — {{repo}}"
description: "Scan ID: {{trigger-scan.scan_id}}\nCommit: {{head_sha}}\nCritical issues: {{trigger-scan.critical_count}}"
consumes:
- type: http
namespace: azure-defender
baseUri: "https://management.azure.com/subscriptions"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: devops-scans
path: "/providers/Microsoft.Security/devopsScans"
operations:
- name: trigger-scan
method: POST
- type: http
namespace: github-pr
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pr-comments
path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
inputParameters:
- name: repo
in: path
- name: pr_number
in: path
operations:
- name: create-pr-comment
method: POST
- type: http
namespace: jira-security
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Creates a new GitHub repository in a specified organization with configurable visibility and initialization options.
naftiko: "0.5"
info:
label: "GitHub Repository Creator"
description: "Creates a new GitHub repository in a specified organization with configurable visibility and initialization options."
tags:
- devops
- github
- source-control
capability:
exposes:
- type: mcp
namespace: gh-repos
port: 8080
tools:
- name: create-repository
description: "Create a new GitHub repository in the given organization."
inputParameters:
- name: org
in: body
type: string
description: "GitHub organization name."
- name: repo_name
in: body
type: string
description: "Name for the new repository."
- name: visibility
in: body
type: string
description: "Repository visibility: public or private."
consumes:
- type: http
namespace: github-repos
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: org-repos
path: "/orgs/{{org}}/repos"
inputParameters:
- name: org
in: path
operations:
- name: create-repo
method: POST
Queries GitHub Security Advisory alerts for a repository, prioritizes critical vulnerabilities, creates Jira tickets for each, and posts a digest to the Security Teams channel.
naftiko: "0.5"
info:
label: "GitHub Repository Security Advisory Triage"
description: "Queries GitHub Security Advisory alerts for a repository, prioritizes critical vulnerabilities, creates Jira tickets for each, and posts a digest to the Security Teams channel."
tags:
- security
- devops
- github
- jira
- microsoft-teams
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-triage
port: 8080
tools:
- name: triage-security-advisories
description: "Given a GitHub organization and severity filter, list open security advisories, create a Jira ticket for each critical advisory, and post a triage digest to the Security Teams channel."
inputParameters:
- name: github_org
in: body
type: string
description: "GitHub organization name to scan for security advisories."
- name: severity
in: body
type: string
description: "Minimum severity level to triage: 'low', 'medium', 'high', or 'critical'."
steps:
- name: list-advisories
type: call
call: "github-security.list-org-advisories"
with:
org: "{{github_org}}"
severity: "{{severity}}"
- name: create-jira-tickets
type: call
call: "jira-sec.create-issue"
with:
project_key: "SEC"
issuetype: "Bug"
summary: "Security advisory triage: {{github_org}} — {{list-advisories.advisory_count}} advisories"
description: "Advisories: {{list-advisories.advisory_ids}}\nSeverity filter: {{severity}}"
- name: post-digest
type: call
call: "msteams-security.post-channel-message"
with:
channel_id: "Security"
text: "Security advisory triage for {{github_org}}: {{list-advisories.advisory_count}} advisories found at {{severity}}+ severity. Jira: {{create-jira-tickets.key}}"
consumes:
- type: http
namespace: github-security
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: org-advisories
path: "/orgs/{{org}}/security-advisories"
inputParameters:
- name: org
in: path
- name: severity
in: query
operations:
- name: list-org-advisories
method: GET
- type: http
namespace: jira-sec
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-security
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When GitHub detects a secret in a repository, fetches the alert details, rotates the compromised credential in Azure Key Vault, and notifies the security team on Teams.
naftiko: "0.5"
info:
label: "GitHub Secret Scanning Alert Handler"
description: "When GitHub detects a secret in a repository, fetches the alert details, rotates the compromised credential in Azure Key Vault, and notifies the security team on Teams."
tags:
- security
- github
- key-vault
- microsoft-teams
- secrets-management
capability:
exposes:
- type: mcp
namespace: secret-scan
port: 8080
tools:
- name: handle-secret-alert
description: "Respond to a GitHub secret scanning alert by fetching details, rotating the secret, and alerting the security team."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: alert_number
in: body
type: integer
description: "Secret scanning alert number."
- name: vault_name
in: body
type: string
description: "Azure Key Vault containing the compromised secret."
steps:
- name: get-alert
type: call
call: "github-secret-api.get-alert"
with:
repo: "{{repo}}"
alert_number: "{{alert_number}}"
- name: rotate-secret
type: call
call: "keyvault-rotate.update-secret"
with:
vault_name: "{{vault_name}}"
secret_name: "{{get-alert.secret_type}}"
- name: notify-security
type: call
call: "msteams-secops.post-channel-message"
with:
channel_id: "SecurityOps"
text: "Secret scanning alert #{{alert_number}} in {{repo}}: {{get-alert.secret_type}} detected. Secret rotated in Key Vault {{vault_name}}."
consumes:
- type: http
namespace: github-secret-api
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: secret-alerts
path: "/repos/{{repo}}/secret-scanning/alerts/{{alert_number}}"
inputParameters:
- name: repo
in: path
- name: alert_number
in: path
operations:
- name: get-alert
method: GET
- type: http
namespace: keyvault-rotate
baseUri: "https://{{vault_name}}.vault.azure.net"
authentication:
type: bearer
token: "$secrets.azure_keyvault_token"
resources:
- name: secrets
path: "/secrets/{{secret_name}}"
inputParameters:
- name: secret_name
in: path
operations:
- name: update-secret
method: PUT
- type: http
namespace: msteams-secops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Scans Intune-managed devices for compliance policy violations, sends a warning email to the device owner, and logs non-compliant devices to a SharePoint compliance list.
naftiko: "0.5"
info:
label: "Intune Device Compliance Enforcer"
description: "Scans Intune-managed devices for compliance policy violations, sends a warning email to the device owner, and logs non-compliant devices to a SharePoint compliance list."
tags:
- security
- endpoint-management
- intune
- microsoft-outlook
- sharepoint
capability:
exposes:
- type: mcp
namespace: intune-compliance
port: 8080
tools:
- name: enforce-compliance
description: "Scan devices for compliance violations, warn device owners, and log to SharePoint."
inputParameters:
- name: policy_id
in: body
type: string
description: "Intune compliance policy ID."
steps:
- name: get-noncompliant
type: call
call: "graph-intune-compliance.list-noncompliant"
with:
policy_id: "{{policy_id}}"
- name: email-owner
type: call
call: "graph-mail-intune.send-mail"
with:
sender_id: "intune-compliance@microsoft.com"
subject: "Device Compliance Warning"
body: "Your device is non-compliant with policy {{policy_id}}. Please remediate within 48 hours or access will be restricted."
- name: log-to-sharepoint
type: call
call: "graph-sp-compliance.create-list-item"
with:
site_id: "compliance-site"
list_id: "noncompliant-devices"
consumes:
- type: http
namespace: graph-intune-compliance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: device-compliance
path: "/deviceManagement/deviceCompliancePolicies/{{policy_id}}/deviceStatuses"
inputParameters:
- name: policy_id
in: path
operations:
- name: list-noncompliant
method: GET
- type: http
namespace: graph-mail-intune
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
- type: http
namespace: graph-sp-compliance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: list-items
path: "/sites/{{site_id}}/lists/{{list_id}}/items"
inputParameters:
- name: site_id
in: path
- name: list_id
in: path
operations:
- name: create-list-item
method: POST
Queries Jira for backlog items older than 30 days with no recent updates, generates a grooming digest, and posts it to the Engineering Microsoft Teams channel to prompt sprint planning action.
naftiko: "0.5"
info:
label: "Jira Backlog Grooming Digest"
description: "Queries Jira for backlog items older than 30 days with no recent updates, generates a grooming digest, and posts it to the Engineering Microsoft Teams channel to prompt sprint planning action."
tags:
- devops
- agile
- jira
- microsoft-teams
- backlog
- sprint-planning
capability:
exposes:
- type: mcp
namespace: agile-grooming
port: 8080
tools:
- name: digest-stale-backlog
description: "Given a Jira project key and staleness threshold in days, list backlog issues not updated within the threshold, and post a grooming digest to the Engineering Teams channel."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key to query the backlog for, e.g. ENG."
- name: stale_days
in: body
type: integer
description: "Number of days without an update to flag an issue as stale. Default is 30."
steps:
- name: get-stale-issues
type: call
call: "jira-backlog.search-issues"
with:
project: "{{project_key}}"
status: "Backlog"
updated_before_days: "{{stale_days}}"
- name: post-digest
type: call
call: "msteams-grooming.post-channel-message"
with:
channel_id: "Engineering"
text: "Backlog grooming: {{get-stale-issues.count}} issues in {{project_key}} not updated in {{stale_days}}+ days. Top items: {{get-stale-issues.summary_list}}"
consumes:
- type: http
namespace: jira-backlog
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/search"
inputParameters:
- name: project
in: query
- name: status
in: query
- name: updated_before_days
in: query
operations:
- name: search-issues
method: GET
- type: http
namespace: msteams-grooming
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches completed sprint data from Jira Software, calculates velocity metrics, and posts a weekly sprint digest to the Engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Digest"
description: "Fetches completed sprint data from Jira Software, calculates velocity metrics, and posts a weekly sprint digest to the Engineering Microsoft Teams channel."
tags:
- devops
- engineering
- jira
- microsoft-teams
- agile
- reporting
capability:
exposes:
- type: mcp
namespace: agile-reporting
port: 8080
tools:
- name: digest-sprint-velocity
description: "Given a Jira board ID and number of completed sprints to analyze, calculate average velocity and post a digest to the Engineering Teams channel."
inputParameters:
- name: board_id
in: body
type: string
description: "Jira Software board ID to pull sprint data from."
- name: sprint_count
in: body
type: integer
description: "Number of recent completed sprints to include in the velocity calculation."
steps:
- name: get-sprints
type: call
call: "jira-agile.list-completed-sprints"
with:
board_id: "{{board_id}}"
limit: "{{sprint_count}}"
- name: post-digest
type: call
call: "msteams-eng.post-channel-message"
with:
channel_id: "Engineering"
text: "Sprint velocity digest for board {{board_id}}: {{get-sprints.average_velocity}} avg story points over {{sprint_count}} sprints. Last sprint: {{get-sprints.last_sprint_name}}"
consumes:
- type: http
namespace: jira-agile
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: board-sprints
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
- name: limit
in: query
operations:
- name: list-completed-sprints
method: GET
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Publishes a text post to a LinkedIn company page using the LinkedIn Marketing API.
naftiko: "0.5"
info:
label: "LinkedIn Company Page Post"
description: "Publishes a text post to a LinkedIn company page using the LinkedIn Marketing API."
tags:
- social-media
- marketing
- linkedin
capability:
exposes:
- type: mcp
namespace: linkedin-posts
port: 8080
tools:
- name: publish-company-post
description: "Publish a text post to a LinkedIn company page."
inputParameters:
- name: organization_id
in: body
type: string
description: "LinkedIn organization URN ID."
- name: post_text
in: body
type: string
description: "Text content for the post."
consumes:
- type: http
namespace: linkedin-api
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: ugc-posts
path: "/ugcPosts"
operations:
- name: create-post
method: POST
Fetches recruiter pipeline metrics from LinkedIn Talent Solutions, syncs them to a Dynamics 365 HR module, and posts a weekly summary to the talent acquisition Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Recruiter Pipeline Tracker"
description: "Fetches recruiter pipeline metrics from LinkedIn Talent Solutions, syncs them to a Dynamics 365 HR module, and posts a weekly summary to the talent acquisition Teams channel."
tags:
- recruiting
- linkedin
- dynamics-365
- microsoft-teams
- hr
capability:
exposes:
- type: mcp
namespace: recruiter-pipeline
port: 8080
tools:
- name: sync-pipeline-metrics
description: "Fetch LinkedIn recruiter pipeline data, sync to Dynamics 365, and post a summary to Teams."
inputParameters:
- name: org_id
in: body
type: string
description: "LinkedIn organization ID."
steps:
- name: get-pipeline
type: call
call: "linkedin-talent.get-pipeline"
with:
org_id: "{{org_id}}"
- name: sync-to-d365
type: call
call: "d365-hr.create-record"
with:
entity: "recruiting_pipeline_metrics"
- name: post-summary
type: call
call: "msteams-talent.post-channel-message"
with:
channel_id: "TalentAcquisition"
text: "LinkedIn recruiter pipeline update: {{get-pipeline.open_positions}} open, {{get-pipeline.candidates_in_review}} in review, {{get-pipeline.offers_extended}} offers extended."
consumes:
- type: http
namespace: linkedin-talent
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: pipeline
path: "/talentPipeline"
operations:
- name: get-pipeline
method: GET
- type: http
namespace: d365-hr
baseUri: "https://$secrets.d365_org.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.d365_token"
resources:
- name: records
path: "/{{entity}}"
inputParameters:
- name: entity
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: msteams-talent
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches open job requisitions from Workday, creates LinkedIn job postings for each approved position, and reports posting confirmations to a Microsoft Teams HR channel.
naftiko: "0.5"
info:
label: "LinkedIn Talent Campaign Publisher"
description: "Fetches open job requisitions from Workday, creates LinkedIn job postings for each approved position, and reports posting confirmations to a Microsoft Teams HR channel."
tags:
- hr
- recruiting
- workday
- linkedin
- microsoft-teams
- talent-acquisition
capability:
exposes:
- type: mcp
namespace: hr-recruiting
port: 8080
tools:
- name: publish-jobs-to-linkedin
description: "Given a Workday job requisition status filter, fetch approved open positions and create LinkedIn job postings for each, then report results to the HR Teams channel."
inputParameters:
- name: requisition_status
in: body
type: string
description: "Workday requisition status to filter by, e.g. 'Approved' or 'Open'."
- name: linkedin_organization_id
in: body
type: string
description: "LinkedIn Organization ID to post jobs under."
steps:
- name: get-requisitions
type: call
call: "workday-recruiting.list-job-requisitions"
with:
status: "{{requisition_status}}"
- name: create-linkedin-jobs
type: call
call: "linkedin.create-job-posting"
with:
organization_id: "{{linkedin_organization_id}}"
job_data: "{{get-requisitions.requisitions}}"
- name: notify-hr
type: call
call: "msteams-hr.post-channel-message"
with:
channel_id: "HR-Recruiting"
text: "Published {{create-linkedin-jobs.posted_count}} jobs to LinkedIn for organization {{linkedin_organization_id}}."
consumes:
- type: http
namespace: workday-recruiting
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/microsoft/jobRequisitions"
inputParameters:
- name: status
in: query
operations:
- name: list-job-requisitions
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: job-postings
path: "/jobPostings"
operations:
- name: create-job-posting
method: POST
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Reviews inactive Microsoft 365 groups, notifies group owners via email for attestation, and archives groups that remain unattested after the review period.
naftiko: "0.5"
info:
label: "M365 Group Lifecycle Manager"
description: "Reviews inactive Microsoft 365 groups, notifies group owners via email for attestation, and archives groups that remain unattested after the review period."
tags:
- governance
- microsoft-365
- microsoft-graph
- microsoft-outlook
- collaboration
capability:
exposes:
- type: mcp
namespace: group-lifecycle
port: 8080
tools:
- name: review-inactive-groups
description: "Identify inactive M365 groups, email owners for attestation, and flag groups for archival."
inputParameters:
- name: inactivity_days
in: body
type: integer
description: "Number of days of inactivity to qualify as inactive."
steps:
- name: list-groups
type: call
call: "graph-groups.list-groups"
with: {}
- name: notify-owners
type: call
call: "graph-mail-lifecycle.send-mail"
with:
sender_id: "m365-lifecycle@microsoft.com"
subject: "M365 Group Attestation Required"
body: "Your group has been inactive for more than {{inactivity_days}} days. Please attest continued need or the group will be archived."
- name: post-summary
type: call
call: "msteams-it.post-channel-message"
with:
channel_id: "ITGovernance"
text: "M365 group lifecycle review: {{list-groups.inactive_count}} inactive groups identified. Owners notified for attestation."
consumes:
- type: http
namespace: graph-groups
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: groups
path: "/groups"
operations:
- name: list-groups
method: GET
- type: http
namespace: graph-mail-lifecycle
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Microsoft 365 DLP policy match is detected, fetches the incident details from the Compliance Center, notifies the compliance officer via email, and logs the event to a SharePoint audit trail.
naftiko: "0.5"
info:
label: "Microsoft 365 DLP Incident Handler"
description: "When a Microsoft 365 DLP policy match is detected, fetches the incident details from the Compliance Center, notifies the compliance officer via email, and logs the event to a SharePoint audit trail."
tags:
- compliance
- data-loss-prevention
- microsoft-365
- microsoft-outlook
- sharepoint
capability:
exposes:
- type: mcp
namespace: dlp-handler
port: 8080
tools:
- name: handle-dlp-incident
description: "Process a DLP policy match by fetching details, notifying compliance, and logging to SharePoint."
inputParameters:
- name: incident_id
in: body
type: string
description: "DLP incident ID."
steps:
- name: get-incident
type: call
call: "compliance-api.get-dlp-incident"
with:
incident_id: "{{incident_id}}"
- name: email-compliance
type: call
call: "graph-mail-dlp.send-mail"
with:
sender_id: "dlp-alerts@microsoft.com"
subject: "DLP Policy Match — Incident {{incident_id}}"
body: "Policy: {{get-incident.policy_name}}. Matched content in {{get-incident.location}}. Sensitivity: {{get-incident.sensitivity_label}}. Review required."
- name: log-audit
type: call
call: "graph-sp-dlp.create-list-item"
with:
site_id: "compliance-hub"
list_id: "dlp-audit-trail"
consumes:
- type: http
namespace: compliance-api
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: dlp-incidents
path: "/security/informationProtection/dlpIncidents/{{incident_id}}"
inputParameters:
- name: incident_id
in: path
operations:
- name: get-dlp-incident
method: GET
- type: http
namespace: graph-mail-dlp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
- type: http
namespace: graph-sp-dlp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: list-items
path: "/sites/{{site_id}}/lists/{{list_id}}/items"
inputParameters:
- name: site_id
in: path
- name: list_id
in: path
operations:
- name: create-list-item
method: POST
Queries Microsoft Graph for assigned Microsoft 365 licenses and compares usage with actual sign-in activity, then posts an optimization report to SharePoint and alerts the IT Procurement Teams channel.
naftiko: "0.5"
info:
label: "Microsoft 365 License Optimization Report"
description: "Queries Microsoft Graph for assigned Microsoft 365 licenses and compares usage with actual sign-in activity, then posts an optimization report to SharePoint and alerts the IT Procurement Teams channel."
tags:
- it
- licensing
- microsoft-graph
- sharepoint
- microsoft-teams
- cost-optimization
capability:
exposes:
- type: mcp
namespace: license-ops
port: 8080
tools:
- name: generate-license-optimization-report
description: "Query all assigned Microsoft 365 licenses via Microsoft Graph, identify users with no sign-in in the last 90 days, save a report to SharePoint, and alert the IT Procurement Teams channel with reclamation candidates."
inputParameters:
- name: inactive_days_threshold
in: body
type: integer
description: "Number of days without sign-in to flag a user as inactive. Default is 90."
- name: sharepoint_site_id
in: body
type: string
description: "SharePoint site ID where the license report will be saved."
steps:
- name: get-license-details
type: call
call: "msgraph-licenses.list-subscribed-skus"
with:
inactive_threshold: "{{inactive_days_threshold}}"
- name: save-report
type: call
call: "sharepoint-licenses.create-file"
with:
site_id: "{{sharepoint_site_id}}"
file_name: "LicenseOptimizationReport.csv"
content: "{{get-license-details.csv_data}}"
- name: alert-procurement
type: call
call: "msteams-procurement.post-channel-message"
with:
channel_id: "ITProcurement"
text: "License optimization: {{get-license-details.reclaimable_count}} licenses reclaimable from inactive users. Report: {{save-report.file_url}}"
consumes:
- type: http
namespace: msgraph-licenses
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: subscribed-skus
path: "/subscribedSkus"
inputParameters:
- name: inactive_threshold
in: query
operations:
- name: list-subscribed-skus
method: GET
- type: http
namespace: sharepoint-licenses
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-file
method: POST
- type: http
namespace: msteams-procurement
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a user profile from Microsoft Entra ID via the Microsoft Graph API given a user principal name or object ID.
naftiko: "0.5"
info:
label: "Microsoft Graph User Lookup"
description: "Retrieves a user profile from Microsoft Entra ID via the Microsoft Graph API given a user principal name or object ID."
tags:
- identity
- microsoft-graph
- entra
- azure-active-directory
capability:
exposes:
- type: mcp
namespace: graph-users
port: 8080
tools:
- name: get-user-profile
description: "Look up a user profile in Microsoft Entra ID by user principal name or object ID."
inputParameters:
- name: user_id
in: body
type: string
description: "User principal name or object ID."
consumes:
- type: http
namespace: msgraph-users
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: get-user
method: GET
Scans a user's OneDrive for files exceeding a size threshold, generates a report, and emails the user with cleanup recommendations.
naftiko: "0.5"
info:
label: "OneDrive Large File Scanner"
description: "Scans a user's OneDrive for files exceeding a size threshold, generates a report, and emails the user with cleanup recommendations."
tags:
- storage
- microsoft-graph
- onedrive
- microsoft-outlook
- governance
capability:
exposes:
- type: mcp
namespace: onedrive-scanner
port: 8080
tools:
- name: scan-large-files
description: "Scan OneDrive for files exceeding a size threshold and email the user with findings."
inputParameters:
- name: user_id
in: body
type: string
description: "User principal name or ID."
- name: threshold_mb
in: body
type: number
description: "File size threshold in megabytes."
steps:
- name: list-files
type: call
call: "graph-onedrive.list-children"
with:
user_id: "{{user_id}}"
- name: email-report
type: call
call: "graph-mail-storage.send-mail"
with:
sender_id: "storage-admin@microsoft.com"
subject: "OneDrive Storage Report — Large Files Detected"
body: "We found {{list-files.large_file_count}} files exceeding {{threshold_mb}}MB in your OneDrive. Total size: {{list-files.total_large_mb}}MB. Please review and clean up."
consumes:
- type: http
namespace: graph-onedrive
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-children
path: "/users/{{user_id}}/drive/root/children"
inputParameters:
- name: user_id
in: path
operations:
- name: list-children
method: GET
- type: http
namespace: graph-mail-storage
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
Fetches a document from SharePoint, sends it to the OpenAI API for summarization, and posts the summary to a Microsoft Teams channel thread.
naftiko: "0.5"
info:
label: "OpenAI Document Summarization"
description: "Fetches a document from SharePoint, sends it to the OpenAI API for summarization, and posts the summary to a Microsoft Teams channel thread."
tags:
- ai
- automation
- openai
- sharepoint
- microsoft-teams
- document-intelligence
capability:
exposes:
- type: mcp
namespace: ai-docs
port: 8080
tools:
- name: summarize-sharepoint-document
description: "Given a SharePoint site ID and document item ID, fetch the document content, summarize it with OpenAI GPT-4, and post the summary to a specified Teams channel."
inputParameters:
- name: site_id
in: body
type: string
description: "SharePoint site ID where the document is stored."
- name: item_id
in: body
type: string
description: "The SharePoint drive item ID of the document to summarize."
- name: teams_channel_id
in: body
type: string
description: "Teams channel ID where the summary should be posted."
steps:
- name: fetch-document
type: call
call: "sharepoint-docs.get-drive-item-content"
with:
site_id: "{{site_id}}"
item_id: "{{item_id}}"
- name: summarize
type: call
call: "openai.create-chat-completion"
with:
model: "gpt-4o"
content: "Summarize this document concisely: {{fetch-document.text_content}}"
- name: post-summary
type: call
call: "msteams-docs.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
text: "Document Summary: {{summarize.choices_0_message_content}}"
consumes:
- type: http
namespace: sharepoint-docs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-item-content
path: "/sites/{{site_id}}/drive/items/{{item_id}}/content"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
operations:
- name: get-drive-item-content
method: GET
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: chat-completions
path: "/chat/completions"
operations:
- name: create-chat-completion
method: POST
- type: http
namespace: msteams-docs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Sends an email on behalf of a user via Microsoft Graph Mail API.
naftiko: "0.5"
info:
label: "Outlook Email Sender"
description: "Sends an email on behalf of a user via Microsoft Graph Mail API."
tags:
- communication
- email
- microsoft-outlook
- microsoft-graph
capability:
exposes:
- type: mcp
namespace: outlook-mail
port: 8080
tools:
- name: send-email
description: "Send an email through Microsoft Outlook via the Graph API."
inputParameters:
- name: sender_id
in: body
type: string
description: "User ID or principal name of the sender."
- name: to_address
in: body
type: string
description: "Recipient email address."
- name: subject
in: body
type: string
description: "Email subject line."
- name: body_content
in: body
type: string
description: "Email body in plain text."
consumes:
- type: http
namespace: graph-mail
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send
method: POST
Creates a task in Microsoft Planner via the Graph API, assigning it to a plan and bucket.
naftiko: "0.5"
info:
label: "Planner Task Creator"
description: "Creates a task in Microsoft Planner via the Graph API, assigning it to a plan and bucket."
tags:
- project-management
- planner
- microsoft-graph
- collaboration
capability:
exposes:
- type: mcp
namespace: planner-tasks
port: 8080
tools:
- name: create-task
description: "Create a task in Microsoft Planner for a specified plan and bucket."
inputParameters:
- name: plan_id
in: body
type: string
description: "Planner plan ID."
- name: bucket_id
in: body
type: string
description: "Planner bucket ID."
- name: title
in: body
type: string
description: "Task title."
consumes:
- type: http
namespace: graph-planner
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "/planner/tasks"
operations:
- name: create-task
method: POST
When a Power Automate flow run fails, fetches the run history, identifies the failed action, notifies the flow owner via Outlook, and creates a work item in Azure DevOps.
naftiko: "0.5"
info:
label: "Power Automate Flow Failure Escalation"
description: "When a Power Automate flow run fails, fetches the run history, identifies the failed action, notifies the flow owner via Outlook, and creates a work item in Azure DevOps."
tags:
- automation
- power-automate
- microsoft-outlook
- azure-devops
- monitoring
capability:
exposes:
- type: mcp
namespace: flow-failure
port: 8080
tools:
- name: escalate-flow-failure
description: "Escalate a Power Automate flow failure by fetching details, emailing the owner, and creating a work item."
inputParameters:
- name: environment_id
in: body
type: string
description: "Power Platform environment ID."
- name: flow_id
in: body
type: string
description: "Flow ID."
- name: run_id
in: body
type: string
description: "Flow run ID."
steps:
- name: get-run
type: call
call: "flow-api.get-run"
with:
environment_id: "{{environment_id}}"
flow_id: "{{flow_id}}"
run_id: "{{run_id}}"
- name: email-owner
type: call
call: "graph-mail-flow.send-mail"
with:
sender_id: "automation-alerts@microsoft.com"
subject: "Power Automate flow failure: {{flow_id}}"
body: "Flow run {{run_id}} failed. Error: {{get-run.error_message}}. Please investigate."
- name: create-work-item
type: call
call: "ado-automation.create-item"
with:
title: "Power Automate failure: flow {{flow_id}} run {{run_id}}"
work_item_type: "Bug"
consumes:
- type: http
namespace: flow-api
baseUri: "https://api.flow.microsoft.com"
authentication:
type: bearer
token: "$secrets.flow_token"
resources:
- name: flow-runs
path: "/providers/Microsoft.ProcessSimple/environments/{{environment_id}}/flows/{{flow_id}}/runs/{{run_id}}"
inputParameters:
- name: environment_id
in: path
- name: flow_id
in: path
- name: run_id
in: path
operations:
- name: get-run
method: GET
- type: http
namespace: graph-mail-flow
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
- type: http
namespace: ado-automation
baseUri: "https://dev.azure.com/$secrets.ado_org/Automation/_apis/wit"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: work-items
path: "/workitems/$Bug"
operations:
- name: create-item
method: POST
Triggers a Power BI dataset refresh on demand and monitors the refresh status, posting the result to a Microsoft Teams data channel when complete.
naftiko: "0.5"
info:
label: "Power BI Report Refresh Trigger"
description: "Triggers a Power BI dataset refresh on demand and monitors the refresh status, posting the result to a Microsoft Teams data channel when complete."
tags:
- data
- analytics
- power-bi
- microsoft-teams
- reporting
- bi
capability:
exposes:
- type: mcp
namespace: bi-refresh
port: 8080
tools:
- name: refresh-powerbi-dataset
description: "Given a Power BI dataset ID, trigger a refresh and post the completion status to the Data Teams channel. Use when stakeholders need up-to-date dashboard data outside the scheduled refresh window."
inputParameters:
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID to refresh."
- name: notify_channel
in: body
type: string
description: "Teams channel ID to post refresh completion status to."
steps:
- name: trigger-refresh
type: call
call: "powerbi-refresh.trigger-dataset-refresh"
with:
dataset_id: "{{dataset_id}}"
- name: notify-complete
type: call
call: "msteams-data.post-channel-message"
with:
channel_id: "{{notify_channel}}"
text: "Power BI dataset {{dataset_id}} refresh triggered. Request ID: {{trigger-refresh.request_id}}"
consumes:
- type: http
namespace: powerbi-refresh
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-dataset-refresh
method: POST
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Provisions a new Power Platform environment with specified DLP policies, configures security roles, and notifies the platform admin team on Teams.
naftiko: "0.5"
info:
label: "Power Platform Environment Provisioner"
description: "Provisions a new Power Platform environment with specified DLP policies, configures security roles, and notifies the platform admin team on Teams."
tags:
- platform
- power-platform
- governance
- microsoft-teams
- administration
capability:
exposes:
- type: mcp
namespace: pp-provisioner
port: 8080
tools:
- name: provision-environment
description: "Create a new Power Platform environment, apply DLP policies, and notify admins."
inputParameters:
- name: display_name
in: body
type: string
description: "Display name for the new environment."
- name: environment_type
in: body
type: string
description: "Environment type: Sandbox or Production."
- name: region
in: body
type: string
description: "Azure region for the environment."
steps:
- name: create-env
type: call
call: "pp-admin.create-environment"
with:
display_name: "{{display_name}}"
environment_type: "{{environment_type}}"
region: "{{region}}"
- name: apply-dlp
type: call
call: "pp-admin.apply-dlp-policy"
with:
environment_id: "{{create-env.environment_id}}"
- name: notify-admins
type: call
call: "msteams-pp-admin.post-channel-message"
with:
channel_id: "PlatformAdmins"
text: "New Power Platform environment provisioned: {{display_name}} ({{environment_type}}) in {{region}}. Environment ID: {{create-env.environment_id}}. DLP policies applied."
consumes:
- type: http
namespace: pp-admin
baseUri: "https://api.bap.microsoft.com"
authentication:
type: bearer
token: "$secrets.power_platform_token"
resources:
- name: environments
path: "/providers/Microsoft.BusinessAppPlatform/environments"
operations:
- name: create-environment
method: POST
- name: dlp-policies
path: "/providers/Microsoft.BusinessAppPlatform/environments/{{environment_id}}/dlpPolicies"
inputParameters:
- name: environment_id
in: path
operations:
- name: apply-dlp-policy
method: POST
- type: http
namespace: msteams-pp-admin
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Fetches new Salesforce leads, enriches them with LinkedIn company data, updates Salesforce records with enrichment, and notifies the sales team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Lead Enrichment and Sync"
description: "Fetches new Salesforce leads, enriches them with LinkedIn company data, updates Salesforce records with enrichment, and notifies the sales team via Microsoft Teams."
tags:
- sales
- crm
- salesforce
- linkedin
- microsoft-teams
- lead-enrichment
capability:
exposes:
- type: mcp
namespace: sales-enrichment
port: 8080
tools:
- name: enrich-salesforce-leads
description: "Given a Salesforce lead creation date range, fetch new leads, look up company data from LinkedIn, update lead records in Salesforce with enriched data, and post a summary to the Sales Teams channel."
inputParameters:
- name: created_after
in: body
type: string
description: "ISO 8601 date string; only leads created after this date will be enriched."
- name: limit
in: body
type: integer
description: "Maximum number of leads to process in this batch. Default is 50."
steps:
- name: get-leads
type: call
call: "salesforce-leads.list-leads"
with:
created_after: "{{created_after}}"
limit: "{{limit}}"
- name: enrich-company
type: call
call: "linkedin-enrich.search-companies"
with:
company_names: "{{get-leads.company_names}}"
- name: update-leads
type: call
call: "salesforce-leads.update-lead"
with:
lead_ids: "{{get-leads.ids}}"
enrichment_data: "{{enrich-company.results}}"
- name: notify-sales
type: call
call: "msteams-sales.post-channel-message"
with:
channel_id: "Sales"
text: "Enriched {{get-leads.count}} leads with LinkedIn company data. Updated in Salesforce."
consumes:
- type: http
namespace: salesforce-leads
baseUri: "https://microsoft.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead"
inputParameters:
- name: created_after
in: query
- name: limit
in: query
operations:
- name: list-leads
method: GET
- name: update-lead
method: PATCH
- type: http
namespace: linkedin-enrich
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: companies
path: "/organizations"
inputParameters:
- name: company_names
in: query
operations:
- name: search-companies
method: GET
- type: http
namespace: msteams-sales
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Salesforce opportunity is marked Closed Won, fetches deal details, updates the Dynamics 365 ERP account record, and sends a congratulatory Microsoft Teams message to the owning sales rep.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Close Notification"
description: "When a Salesforce opportunity is marked Closed Won, fetches deal details, updates the Dynamics 365 ERP account record, and sends a congratulatory Microsoft Teams message to the owning sales rep."
tags:
- sales
- crm
- salesforce
- dynamics-365
- microsoft-teams
- opportunity-management
capability:
exposes:
- type: mcp
namespace: sales-closures
port: 8080
tools:
- name: handle-opportunity-closed-won
description: "Given a Salesforce opportunity ID marked Closed Won, fetch deal details, update the linked Dynamics 365 account with deal value, and send a Teams congratulations to the owning rep."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID that was marked Closed Won."
steps:
- name: get-opportunity
type: call
call: "salesforce-opps.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: update-dynamics-account
type: call
call: "dynamics365-accounts.update-account"
with:
account_id: "{{get-opportunity.account_id}}"
deal_value: "{{get-opportunity.amount}}"
- name: notify-rep
type: call
call: "msteams-sales-notify.send-message"
with:
recipient_upn: "{{get-opportunity.owner_email}}"
text: "Congratulations! Opportunity {{get-opportunity.name}} closed for ${{get-opportunity.amount}}. Dynamics account updated."
consumes:
- type: http
namespace: salesforce-opps
baseUri: "https://microsoft.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: dynamics365-accounts
baseUri: "https://microsoft.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.dynamics365_token"
resources:
- name: accounts
path: "/accounts/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
- type: http
namespace: msteams-sales-notify
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-mail
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Fetches pending expense reports from SAP Concur, routes each to the approver's Microsoft Teams approval card, and updates the Concur report status when the approver responds.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "Fetches pending expense reports from SAP Concur, routes each to the approver's Microsoft Teams approval card, and updates the Concur report status when the approver responds."
tags:
- finance
- erp
- sap-concur
- microsoft-teams
- approval
- expense-management
capability:
exposes:
- type: mcp
namespace: finance-approvals
port: 8080
tools:
- name: route-expense-approvals
description: "Given an approver's Workday employee ID, fetch their pending SAP Concur expense reports and send an approval card to their Microsoft Teams inbox for each report."
inputParameters:
- name: approver_employee_id
in: body
type: string
description: "Workday employee ID of the expense report approver."
steps:
- name: get-pending-reports
type: call
call: "sap-concur.list-expense-reports"
with:
approver_id: "{{approver_employee_id}}"
status: "Submitted"
- name: send-approval-card
type: call
call: "msteams-approvals.send-message"
with:
recipient_upn: "{{approver_employee_id}}"
text: "You have {{get-pending-reports.count}} expense reports pending approval. Reports: {{get-pending-reports.report_ids}}"
consumes:
- type: http
namespace: sap-concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports"
inputParameters:
- name: approver_id
in: query
- name: status
in: query
operations:
- name: list-expense-reports
method: GET
- type: http
namespace: msteams-approvals
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-mail
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Fetches approved invoices from SAP Concur, validates against Dynamics 365 purchase orders, and posts a matched invoice summary to the Finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "SAP Concur Invoice Processing"
description: "Fetches approved invoices from SAP Concur, validates against Dynamics 365 purchase orders, and posts a matched invoice summary to the Finance Microsoft Teams channel."
tags:
- finance
- erp
- sap-concur
- dynamics-365
- microsoft-teams
- invoice-processing
capability:
exposes:
- type: mcp
namespace: finance-invoicing
port: 8080
tools:
- name: process-approved-invoices
description: "Fetch approved invoices from SAP Concur, validate each against a Dynamics 365 purchase order, and post a reconciliation summary to the Finance Teams channel."
inputParameters:
- name: period_start
in: body
type: string
description: "Start of the invoice period in ISO 8601 format."
- name: period_end
in: body
type: string
description: "End of the invoice period in ISO 8601 format."
steps:
- name: get-invoices
type: call
call: "concur-invoices.list-invoices"
with:
status: "Approved"
start_date: "{{period_start}}"
end_date: "{{period_end}}"
- name: validate-po
type: call
call: "dynamics365-po.list-purchase-orders"
with:
invoice_ids: "{{get-invoices.invoice_ids}}"
- name: notify-finance
type: call
call: "msteams-finance.post-channel-message"
with:
channel_id: "Finance"
text: "Invoice processing complete: {{get-invoices.count}} invoices approved for {{period_start}} to {{period_end}}. PO match rate: {{validate-po.match_rate}}%"
consumes:
- type: http
namespace: concur-invoices
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: invoices
path: "/invoice/paymentrequests"
inputParameters:
- name: status
in: query
- name: start_date
in: query
- name: end_date
in: query
operations:
- name: list-invoices
method: GET
- type: http
namespace: dynamics365-po
baseUri: "https://microsoft.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.dynamics365_token"
resources:
- name: purchase-orders
path: "/purchaseorders"
inputParameters:
- name: invoice_ids
in: query
operations:
- name: list-purchase-orders
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a P1 ServiceNow incident is created, queries Datadog for correlated monitors in alert state, enriches the incident description, and posts the full context to Microsoft Teams on-call channel.
naftiko: "0.5"
info:
label: "ServiceNow Incident to Datadog Correlation"
description: "When a P1 ServiceNow incident is created, queries Datadog for correlated monitors in alert state, enriches the incident description, and posts the full context to Microsoft Teams on-call channel."
tags:
- itsm
- incident-response
- servicenow
- datadog
- microsoft-teams
- observability
capability:
exposes:
- type: mcp
namespace: itsm-ops
port: 8080
tools:
- name: enrich-p1-incident
description: "Given a ServiceNow P1 incident number, fetch correlated Datadog monitors in ALERT state, update the incident description with monitor links, and post the full context to the on-call Teams channel."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number, e.g. INC0012345."
- name: affected_service
in: body
type: string
description: "Service name tag to query in Datadog monitors."
steps:
- name: get-incident
type: call
call: "servicenow-p1.get-incident"
with:
number: "{{incident_number}}"
- name: get-monitors
type: call
call: "datadog-monitors.list-monitors"
with:
tag_filter: "service:{{affected_service}}"
monitor_status: "Alert"
- name: update-incident
type: call
call: "servicenow-p1.update-incident"
with:
sys_id: "{{get-incident.sys_id}}"
description: "{{get-incident.description}}\n\nCorrelated Datadog monitors in ALERT: {{get-monitors.monitor_names}}"
- name: notify-oncall
type: call
call: "msteams-oncall.post-channel-message"
with:
channel_id: "OnCall"
text: "P1 Incident {{incident_number}} — Service: {{affected_service}} | {{get-monitors.alert_count}} Datadog monitors in ALERT"
consumes:
- type: http
namespace: servicenow-p1
baseUri: "https://microsoft.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident/{{number}}"
inputParameters:
- name: number
in: path
operations:
- name: get-incident
method: GET
- name: update-incident
method: PATCH
- type: http
namespace: datadog-monitors
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor"
inputParameters:
- name: tag_filter
in: query
- name: monitor_status
in: query
operations:
- name: list-monitors
method: GET
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a document is uploaded to a SharePoint library, sends an approval request via Teams adaptive card, and upon approval updates the document metadata and notifies the uploader via Outlook.
naftiko: "0.5"
info:
label: "SharePoint Document Approval Workflow"
description: "When a document is uploaded to a SharePoint library, sends an approval request via Teams adaptive card, and upon approval updates the document metadata and notifies the uploader via Outlook."
tags:
- collaboration
- sharepoint
- microsoft-teams
- microsoft-outlook
- workflow
capability:
exposes:
- type: mcp
namespace: doc-approval
port: 8080
tools:
- name: request-approval
description: "Initiate a document approval by notifying the approver on Teams and updating SharePoint metadata on completion."
inputParameters:
- name: site_id
in: body
type: string
description: "SharePoint site ID."
- name: item_id
in: body
type: string
description: "Document item ID."
- name: approver_email
in: body
type: string
description: "Approver's email address."
steps:
- name: get-document
type: call
call: "graph-sp-docs.get-item"
with:
site_id: "{{site_id}}"
item_id: "{{item_id}}"
- name: send-approval
type: call
call: "msteams-approval.post-channel-message"
with:
channel_id: "Approvals"
text: "Document approval requested: {{get-document.name}} — please review. Approver: {{approver_email}}"
- name: email-uploader
type: call
call: "graph-mail-approval.send-mail"
with:
sender_id: "approvals@microsoft.com"
subject: "Approval requested for {{get-document.name}}"
body: "Your document {{get-document.name}} has been sent for approval to {{approver_email}}."
consumes:
- type: http
namespace: graph-sp-docs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: items
path: "/sites/{{site_id}}/drive/items/{{item_id}}"
inputParameters:
- name: site_id
in: path
- name: item_id
in: path
operations:
- name: get-item
method: GET
- type: http
namespace: msteams-approval
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: graph-mail-approval
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: send-mail
path: "/users/{{sender_id}}/sendMail"
inputParameters:
- name: sender_id
in: path
operations:
- name: send-mail
method: POST
Reads items from a SharePoint Online list via the Microsoft Graph API for reporting or downstream processing.
naftiko: "0.5"
info:
label: "SharePoint List Items Reader"
description: "Reads items from a SharePoint Online list via the Microsoft Graph API for reporting or downstream processing."
tags:
- data
- sharepoint
- microsoft-graph
- collaboration
capability:
exposes:
- type: mcp
namespace: sharepoint-lists
port: 8080
tools:
- name: get-list-items
description: "Retrieve all items from a SharePoint list given the site ID and list ID."
inputParameters:
- name: site_id
in: body
type: string
description: "SharePoint site ID."
- name: list_id
in: body
type: string
description: "SharePoint list ID."
consumes:
- type: http
namespace: graph-sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: list-items
path: "/sites/{{site_id}}/lists/{{list_id}}/items"
inputParameters:
- name: site_id
in: path
- name: list_id
in: path
operations:
- name: list-items
method: GET
Checks Snowflake task execution history for failures, reports failed tasks to Datadog as custom metrics, and opens a Jira ticket for any tasks that have failed more than once in 24 hours.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Health Monitor"
description: "Checks Snowflake task execution history for failures, reports failed tasks to Datadog as custom metrics, and opens a Jira ticket for any tasks that have failed more than once in 24 hours."
tags:
- data
- analytics
- snowflake
- datadog
- jira
- pipeline-monitoring
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: monitor-snowflake-tasks
description: "Given a Snowflake warehouse name, query task execution history for failures in the last 24 hours, push failure counts to Datadog, and open Jira tickets for tasks with repeated failures."
inputParameters:
- name: warehouse_name
in: body
type: string
description: "Snowflake warehouse name to query task history for."
- name: failure_threshold
in: body
type: integer
description: "Number of failures within 24 hours that triggers a Jira ticket. Default is 2."
steps:
- name: get-task-failures
type: call
call: "snowflake.query-task-history"
with:
warehouse: "{{warehouse_name}}"
state: "FAILED"
- name: push-metrics
type: call
call: "datadog-data.submit-metrics"
with:
metric: "snowflake.task.failures"
value: "{{get-task-failures.failure_count}}"
tags: "warehouse:{{warehouse_name}}"
- name: create-jira-ticket
type: call
call: "jira-data.create-issue"
with:
project_key: "DATA"
issuetype: "Bug"
summary: "Snowflake task failures in warehouse {{warehouse_name}}"
description: "Failed tasks: {{get-task-failures.task_names}}\nFailure count: {{get-task-failures.failure_count}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://microsoft.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/PROD/schemas/PUBLIC/tasks/{{warehouse}}/executions"
inputParameters:
- name: warehouse
in: path
- name: state
in: query
operations:
- name: query-task-history
method: GET
- type: http
namespace: datadog-data
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: metrics
path: "/series"
operations:
- name: submit-metrics
method: POST
- type: http
namespace: jira-data
baseUri: "https://microsoft.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Posts a message to a specified Microsoft Teams channel using the Microsoft Graph API.
naftiko: "0.5"
info:
label: "Teams Channel Message Sender"
description: "Posts a message to a specified Microsoft Teams channel using the Microsoft Graph API."
tags:
- collaboration
- microsoft-teams
- messaging
capability:
exposes:
- type: mcp
namespace: teams-messaging
port: 8080
tools:
- name: send-channel-message
description: "Post a text message to a Microsoft Teams channel."
inputParameters:
- name: team_id
in: body
type: string
description: "Microsoft Teams team ID."
- name: channel_id
in: body
type: string
description: "Channel ID within the team."
- name: message
in: body
type: string
description: "Message content to post."
consumes:
- type: http
namespace: msteams-msg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: post-message
method: POST
When a user submits a helpdesk request via Teams, classifies the request using Azure OpenAI, creates a ServiceNow ticket in the appropriate category, and sends a confirmation back to the user in Teams.
naftiko: "0.5"
info:
label: "Teams Helpdesk Ticket Router"
description: "When a user submits a helpdesk request via Teams, classifies the request using Azure OpenAI, creates a ServiceNow ticket in the appropriate category, and sends a confirmation back to the user in Teams."
tags:
- support
- microsoft-teams
- ai
- servicenow
- helpdesk
capability:
exposes:
- type: mcp
namespace: helpdesk-router
port: 8080
tools:
- name: route-helpdesk-request
description: "Classify a helpdesk request, create a ServiceNow ticket, and confirm back in Teams."
inputParameters:
- name: user_message
in: body
type: string
description: "User's helpdesk request message."
- name: user_id
in: body
type: string
description: "Teams user ID of the requester."
steps:
- name: classify-request
type: call
call: "azure-openai-classify.create-completion"
with:
deployment_id: "gpt-4o"
prompt: "Classify the following IT support request into one of: Hardware, Software, Network, Account, Other.\n\nRequest: {{user_message}}"
- name: create-ticket
type: call
call: "servicenow-helpdesk.create-incident"
with:
short_description: "{{user_message}}"
category: "{{classify-request.response}}"
- name: confirm-user
type: call
call: "msteams-helpdesk.send-chat-message"
with:
user_id: "{{user_id}}"
text: "Your request has been logged as ticket {{create-ticket.number}} (Category: {{classify-request.response}}). A technician will reach out shortly."
consumes:
- type: http
namespace: azure-openai-classify
baseUri: "https://$secrets.azure_openai_endpoint.openai.azure.com/openai/deployments/{{deployment_id}}"
authentication:
type: apiKey
name: api-key
value: "$secrets.azure_openai_key"
resources:
- name: completions
path: "/chat/completions"
inputParameters:
- name: deployment_id
in: path
operations:
- name: create-completion
method: POST
- type: http
namespace: servicenow-helpdesk
baseUri: "https://microsoft.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-helpdesk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chat-messages
path: "/users/{{user_id}}/chats/messages"
inputParameters:
- name: user_id
in: path
operations:
- name: send-chat-message
method: POST
After a Teams meeting ends, retrieves the transcript via Graph API, summarizes it using Azure OpenAI, and posts the summary to the meeting chat and a SharePoint document library.
naftiko: "0.5"
info:
label: "Teams Meeting Transcript Summarizer"
description: "After a Teams meeting ends, retrieves the transcript via Graph API, summarizes it using Azure OpenAI, and posts the summary to the meeting chat and a SharePoint document library."
tags:
- ai
- collaboration
- microsoft-teams
- generative-ai
- sharepoint
capability:
exposes:
- type: mcp
namespace: meeting-summary
port: 8080
tools:
- name: summarize-meeting
description: "Retrieve a Teams meeting transcript, summarize it with Azure OpenAI, and post the summary to chat and SharePoint."
inputParameters:
- name: meeting_id
in: body
type: string
description: "Teams online meeting ID."
- name: site_id
in: body
type: string
description: "SharePoint site ID for storing the summary."
steps:
- name: get-transcript
type: call
call: "graph-meetings.get-transcript"
with:
meeting_id: "{{meeting_id}}"
- name: generate-summary
type: call
call: "azure-openai-sum.create-completion"
with:
deployment_id: "gpt-4o"
prompt: "Summarize the following meeting transcript into key decisions, action items, and open questions:\n{{get-transcript.content}}"
- name: post-to-chat
type: call
call: "graph-meetings.post-chat-message"
with:
meeting_id: "{{meeting_id}}"
text: "Meeting Summary:\n{{generate-summary.response}}"
- name: save-to-sharepoint
type: call
call: "graph-sp.upload-file"
with:
site_id: "{{site_id}}"
file_name: "meeting-summary-{{meeting_id}}.txt"
content: "{{generate-summary.response}}"
consumes:
- type: http
namespace: graph-meetings
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: transcripts
path: "/me/onlineMeetings/{{meeting_id}}/transcripts"
inputParameters:
- name: meeting_id
in: path
operations:
- name: get-transcript
method: GET
- name: chat-messages
path: "/me/onlineMeetings/{{meeting_id}}/chat/messages"
inputParameters:
- name: meeting_id
in: path
operations:
- name: post-chat-message
method: POST
- type: http
namespace: azure-openai-sum
baseUri: "https://$secrets.azure_openai_endpoint.openai.azure.com/openai/deployments/{{deployment_id}}"
authentication:
type: apiKey
name: api-key
value: "$secrets.azure_openai_key"
resources:
- name: completions
path: "/chat/completions"
inputParameters:
- name: deployment_id
in: path
operations:
- name: create-completion
method: POST
- type: http
namespace: graph-sp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root:/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_name
in: path
operations:
- name: upload-file
method: PUT
Queries managed device details from Microsoft Intune via the Graph API for compliance reporting.
naftiko: "0.5"
info:
label: "Windows Intune Device Query"
description: "Queries managed device details from Microsoft Intune via the Graph API for compliance reporting."
tags:
- endpoint-management
- intune
- security
- microsoft-graph
capability:
exposes:
- type: mcp
namespace: intune-devices
port: 8080
tools:
- name: get-device-details
description: "Retrieve device details from Intune by device ID."
inputParameters:
- name: device_id
in: body
type: string
description: "Intune managed device ID."
consumes:
- type: http
namespace: graph-intune
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: managed-devices
path: "/deviceManagement/managedDevices/{{device_id}}"
inputParameters:
- name: device_id
in: path
operations:
- name: get-device
method: GET
Fetches Windows Update compliance data from Intune, pushes the metrics to a Power BI dataset, and posts a compliance summary to the IT operations Teams channel.
naftiko: "0.5"
info:
label: "Windows Update Compliance Dashboard"
description: "Fetches Windows Update compliance data from Intune, pushes the metrics to a Power BI dataset, and posts a compliance summary to the IT operations Teams channel."
tags:
- endpoint-management
- intune
- windows
- power-bi
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: wu-compliance
port: 8080
tools:
- name: sync-update-compliance
description: "Collect Windows Update compliance data from Intune, push to Power BI, and notify IT ops."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID for update compliance."
steps:
- name: get-update-status
type: call
call: "graph-intune-updates.list-update-states"
with: {}
- name: push-to-powerbi
type: call
call: "powerbi-updates.push-rows"
with:
dataset_id: "{{dataset_id}}"
rows: "{{get-update-status.device_states}}"
- name: notify-it
type: call
call: "msteams-itops.post-channel-message"
with:
channel_id: "ITOperations"
text: "Windows Update compliance sync complete. Up to date: {{get-update-status.compliant_count}}. Pending: {{get-update-status.pending_count}}. Failed: {{get-update-status.failed_count}}."
consumes:
- type: http
namespace: graph-intune-updates
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: update-states
path: "/deviceManagement/softwareUpdateStatusSummary"
operations:
- name: list-update-states
method: GET
- type: http
namespace: powerbi-updates
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{dataset_id}}/tables/UpdateCompliance/rows"
inputParameters:
- name: dataset_id
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-itops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Exports current headcount data from Workday by department and cost center, then pushes the dataset to Power BI for executive workforce analytics dashboards.
naftiko: "0.5"
info:
label: "Workday Headcount Reporting to Power BI"
description: "Exports current headcount data from Workday by department and cost center, then pushes the dataset to Power BI for executive workforce analytics dashboards."
tags:
- hr
- finance
- workday
- power-bi
- reporting
- headcount
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: publish-headcount-to-powerbi
description: "Fetch current headcount data from Workday grouped by department and cost center, and push it to a Power BI streaming dataset for executive workforce analytics."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID to push headcount rows into."
- name: as_of_date
in: body
type: string
description: "The effective date for the headcount snapshot in ISO 8601 format."
steps:
- name: export-headcount
type: call
call: "workday-hc.export-workers"
with:
as_of_date: "{{as_of_date}}"
- name: push-to-powerbi
type: call
call: "powerbi-hc.push-rows"
with:
dataset_id: "{{dataset_id}}"
rows: "{{export-headcount.rows}}"
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: worker-exports
path: "/microsoft/workers/export"
inputParameters:
- name: as_of_date
in: query
operations:
- name: export-workers
method: GET
- type: http
namespace: powerbi-hc
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{dataset_id}}/rows"
inputParameters:
- name: dataset_id
in: path
operations:
- name: push-rows
method: POST
At payroll period close, exports payroll data from Workday, validates totals against Dynamics 365 financial accounts, and posts a reconciliation summary to the Finance Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Workday Payroll Period Close Snapshot"
description: "At payroll period close, exports payroll data from Workday, validates totals against Dynamics 365 financial accounts, and posts a reconciliation summary to the Finance Microsoft Teams channel."
tags:
- hr
- finance
- payroll
- workday
- dynamics-365
- microsoft-teams
- period-close
capability:
exposes:
- type: mcp
namespace: payroll-close
port: 8080
tools:
- name: close-payroll-period
description: "Given a Workday payroll period ID, export payroll totals, validate against Dynamics 365 GL accounts, and post the reconciliation result to the Finance Teams channel."
inputParameters:
- name: payroll_period_id
in: body
type: string
description: "Workday payroll period identifier to close and reconcile."
- name: gl_account_id
in: body
type: string
description: "Dynamics 365 General Ledger account ID to validate payroll totals against."
steps:
- name: export-payroll
type: call
call: "workday-payroll.export-payroll-results"
with:
period_id: "{{payroll_period_id}}"
- name: validate-gl
type: call
call: "dynamics365-gl.get-account-balance"
with:
account_id: "{{gl_account_id}}"
period: "{{payroll_period_id}}"
- name: post-reconciliation
type: call
call: "msteams-payroll.post-channel-message"
with:
channel_id: "Finance"
text: "Payroll close: Period {{payroll_period_id}} | Payroll total: ${{export-payroll.gross_total}} | GL balance: ${{validate-gl.balance}} | Variance: ${{validate-gl.variance}}"
consumes:
- type: http
namespace: workday-payroll
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: payroll-results
path: "/microsoft/payrollResults/{{period_id}}"
inputParameters:
- name: period_id
in: path
operations:
- name: export-payroll-results
method: GET
- type: http
namespace: dynamics365-gl
baseUri: "https://microsoft.crm.dynamics.com/api/data/v9.2"
authentication:
type: bearer
token: "$secrets.dynamics365_token"
resources:
- name: accounts
path: "/accounts/{{account_id}}"
inputParameters:
- name: account_id
in: path
- name: period
in: query
operations:
- name: get-account-balance
method: GET
- type: http
namespace: msteams-payroll
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When an employee role change is submitted in Workday, updates their Azure AD group memberships, adjusts SharePoint site permissions, and notifies the employee via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Role Change Provisioning"
description: "When an employee role change is submitted in Workday, updates their Azure AD group memberships, adjusts SharePoint site permissions, and notifies the employee via Microsoft Teams."
tags:
- hr
- identity
- workday
- microsoft-graph
- sharepoint
- microsoft-teams
- provisioning
capability:
exposes:
- type: mcp
namespace: hr-provisioning
port: 8080
tools:
- name: sync-role-change
description: "Given a Workday employee ID and new job profile, update Azure AD group memberships for the new role, adjust SharePoint permissions, and notify the employee via Teams direct message."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID whose role changed."
- name: new_role
in: body
type: string
description: "New job profile or role title, used to determine Azure AD groups and SharePoint sites."
- name: effective_date
in: body
type: string
description: "Effective date of the role change in ISO 8601 format."
steps:
- name: get-worker
type: call
call: "workday-role.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: update-group-membership
type: call
call: "msgraph-role.add-group-member"
with:
group_id: "{{new_role}}"
user_id: "{{get-worker.azure_object_id}}"
- name: notify-employee
type: call
call: "msteams-role.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Your role has been updated to {{new_role}} effective {{effective_date}}. Access changes have been applied."
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: "/microsoft/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-role
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: group-members
path: "/groups/{{group_id}}/members/$ref"
inputParameters:
- name: group_id
in: path
operations:
- name: add-group-member
method: POST
- type: http
namespace: msteams-role
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-mail
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves achievement data for an Xbox Live user via the Xbox Services API for player analytics.
naftiko: "0.5"
info:
label: "Xbox Live Achievement Reader"
description: "Retrieves achievement data for an Xbox Live user via the Xbox Services API for player analytics."
tags:
- gaming
- xbox
- analytics
capability:
exposes:
- type: mcp
namespace: xbox-achievements
port: 8080
tools:
- name: get-achievements
description: "Retrieve Xbox Live achievements for a specified user."
inputParameters:
- name: xuid
in: body
type: string
description: "Xbox User ID (XUID)."
consumes:
- type: http
namespace: xbox-api
baseUri: "https://xbl.io/api/v2"
authentication:
type: apiKey
name: X-Authorization
value: "$secrets.xbox_api_key"
resources:
- name: achievements
path: "/achievements/player/{{xuid}}"
inputParameters:
- name: xuid
in: path
operations:
- name: list-achievements
method: GET