Cisco Capabilities

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

Sort
Expand

Loads review data.

naftiko: "0.5"
info:
  label: "Access Review to Snowflake"
  description: "Loads review data."
  tags:
    - security
    - compliance
    - okta
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access
      port: 8080
      tools:
        - name: access-review-to-snowflake
          description: "Loads review data."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "okta.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Access Review to Snowflake"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://okta.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

When a P1 incident is resolved in ServiceNow, uses the Anthropic API to generate a root cause analysis summary from the incident timeline and posts it to the Webex incident channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Incident Root Cause Summarizer"
  description: "When a P1 incident is resolved in ServiceNow, uses the Anthropic API to generate a root cause analysis summary from the incident timeline and posts it to the Webex incident channel."
  tags:
    - ai
    - servicenow
    - webex
    - anthropic
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: incident-ai
      port: 8080
      tools:
        - name: generate-rca-summary
          description: "Given a resolved ServiceNow P1 incident number, retrieve incident notes and timeline, then use Claude to draft a structured root cause analysis summary and post it to the incident Webex space."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident-details
              with:
                incident_number: "{{incident_number}}"
            - name: generate-rca
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Write a structured root cause analysis for this incident. Summary: {{get-incident.short_description}}. Notes: {{get-incident.work_notes}}. Duration: {{get-incident.resolution_time}}. Format as: Incident Summary, Root Cause, Timeline, Impact, Remediation Steps, Prevention."
            - name: post-rca
              type: call
              call: webex.post-rca
              with:
                room_id: "incident-post-mortem"
                markdown: "**RCA Complete: {{incident_number}}** | {{get-incident.short_description}}\n\n{{generate-rca.content}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident-details
          path: "/table/incident/{{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-incident-details
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: rca-messages
          path: "/messages"
          operations:
            - name: post-rca
              method: POST

Retrieves EC2 instance state.

naftiko: "0.5"
info:
  label: "AWS EC2 Instance Status"
  description: "Retrieves EC2 instance state."
  tags:
    - cloud
    - infrastructure
    - aws
capability:
  exposes:
    - type: mcp
      namespace: cloud-infra
      port: 8080
      tools:
        - name: get-ec2
          description: "Given instance ID, return state."
          inputParameters:
            - name: instance_id
              in: body
              type: string
              description: "Instance Id"
          call: aws.describe-instance
          with:
            instance_id: "{{instance_id}}"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://ec2.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sigv4_token"
        placement: header
      resources:
        - name: instances
          path: "/"
          operations:
            - name: describe-instance
              method: GET

Creates FinOps ticket.

naftiko: "0.5"
info:
  label: "Azure Cost Anomaly to Jira"
  description: "Creates FinOps ticket."
  tags:
    - cloud
    - finops
    - azure
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-cost-anomaly-to-jira
          description: "Creates FinOps ticket."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "azure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure Cost Anomaly to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Azure Cost Anomaly to Jira triggered"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://azure.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Azure cost for resource group.

naftiko: "0.5"
info:
  label: "Azure Cost Lookup"
  description: "Queries Azure cost for resource group."
  tags:
    - cloud
    - finops
    - azure
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: get-cost
          description: "Given subscription, return cost."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Subscription Id"
          call: azure-cost.get-cost
          with:
            subscription_id: "{{subscription_id}}"
  consumes:
    - type: http
      namespace: azure-cost
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-cost
              method: POST

Creates bug for failures.

naftiko: "0.5"
info:
  label: "Azure DevOps to Jira"
  description: "Creates bug for failures."
  tags:
    - devops
    - ci-cd
    - azure-devops
    - jira
capability:
  exposes:
    - type: mcp
      namespace: azure
      port: 8080
      tools:
        - name: azure-devops-failure-to-jira
          description: "Creates bug for failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "azure-devops.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Azure DevOps to Jira"
  consumes:
    - type: http
      namespace: azure-devops
      baseUri: "https://azure-devops.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Reminds unenrolled employees.

naftiko: "0.5"
info:
  label: "Benefits Enrollment Reminder"
  description: "Reminds unenrolled employees."
  tags:
    - hr
    - workday
    - servicenow
    - slack
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: benefits
      port: 8080
      tools:
        - name: benefits-enrollment-reminder
          description: "Reminds unenrolled employees."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Benefits Enrollment Reminder"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Benefits Enrollment Reminder triggered"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Applies on approval.

naftiko: "0.5"
info:
  label: "Change to Terraform Apply"
  description: "Applies on approval."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: change
      port: 8080
      tools:
        - name: change-to-terraform-apply
          description: "Applies on approval."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Change to Terraform Apply"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering team via Webex.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Response"
  description: "When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and alerts the engineering team via Webex."
  tags:
    - devops
    - github
    - jira
    - datadog
    - webex
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure event, create a Jira bug for the owning squad, mark the failed deployment in Datadog, and post an alert to the engineering Webex space."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository name (e.g., cisco-org/networking-platform)."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the GitHub Actions workflow that failed."
            - name: branch
              in: body
              type: string
              description: "The Git branch on which the failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "The Git commit SHA that triggered the failed pipeline."
            - name: run_url
              in: body
              type: string
              description: "The GitHub Actions run URL for the failed workflow."
          steps:
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Commit: {{commit_sha}}\nWorkflow: {{workflow_name}}\nRun: {{run_url}}"
            - name: mark-datadog
              type: call
              call: datadog.create-event
              with:
                title: "Pipeline failure: {{repo}} on {{branch}}"
                text: "Commit {{commit_sha}} failed workflow {{workflow_name}}"
                tags: "repo:{{repo}},branch:{{branch}}"
            - name: alert-webex
              type: call
              call: webex.post-message
              with:
                room_id: "engineering-alerts"
                markdown: "**Pipeline Failure** | Repo: {{repo}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Jira: {{create-jira-bug.key}} | [Run]({{run_url}})"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: post-message
              method: POST

Runs a network device compliance audit via Cisco DNA Center and creates ServiceNow tasks for non-compliant devices.

naftiko: "0.5"
info:
  label: "Cisco DNA Center Compliance Audit"
  description: "Runs a network device compliance audit via Cisco DNA Center and creates ServiceNow tasks for non-compliant devices."
  tags:
    - networking
    - compliance
    - cisco
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: network-compliance
      port: 8080
      tools:
        - name: run-compliance-audit
          description: "Given a site ID, run compliance check and create ServiceNow tasks for violations."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "DNA Center site ID."
          steps:
            - name: get-compliance
              type: call
              call: "dnac.get-compliance"
              with:
                site_id: "{{site_id}}"
            - name: create-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Network compliance: {{get-compliance.non_compliant_count}} devices non-compliant"
                assignment_group: "Network_Engineering"
  consumes:
    - type: http
      namespace: dnac
      baseUri: "https://dnac.cisco.com/dna/intent/api/v1"
      authentication:
        type: basic
        username: "$secrets.dnac_user"
        password: "$secrets.dnac_password"
      resources:
        - name: compliance
          path: "/compliance"
          operations:
            - name: get-compliance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Retrieves Meraki network device health status and creates a ServiceNow incident if connectivity drops below threshold.

naftiko: "0.5"
info:
  label: "Cisco Meraki Device Health Check"
  description: "Retrieves Meraki network device health status and creates a ServiceNow incident if connectivity drops below threshold."
  tags:
    - networking
    - itsm
    - cisco
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: network-health
      port: 8080
      tools:
        - name: check-meraki-health
          description: "Given a Meraki network ID, check device connectivity and create incident if degraded."
          inputParameters:
            - name: network_id
              in: body
              type: string
              description: "Meraki network ID."
          steps:
            - name: get-devices
              type: call
              call: "meraki.get-device-statuses"
              with:
                network_id: "{{network_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Meraki device health: {{get-devices.offline_count}} offline in {{network_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#network-ops"
                text: "Meraki health alert: {{get-devices.offline_count}} devices offline"
  consumes:
    - type: http
      namespace: meraki
      baseUri: "https://api.meraki.com/api/v1"
      authentication:
        type: apikey
        key: "X-Cisco-Meraki-API-Key"
        value: "$secrets.meraki_api_key"
        placement: header
      resources:
        - name: devices
          path: "/networks/{{network_id}}/devices/statuses"
          operations:
            - name: get-device-statuses
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When ThousandEyes detects a network path degradation, creates a PagerDuty incident and posts to the NOC Slack channel.

naftiko: "0.5"
info:
  label: "Cisco ThousandEyes Alert to PagerDuty"
  description: "When ThousandEyes detects a network path degradation, creates a PagerDuty incident and posts to the NOC Slack channel."
  tags:
    - networking
    - incident-response
    - cisco
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: noc-ops
      port: 8080
      tools:
        - name: handle-thousandeyes-alert
          description: "Given a ThousandEyes alert ID, retrieve alert details and create PagerDuty incident."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "ThousandEyes alert ID."
          steps:
            - name: get-alert
              type: call
              call: "thousandeyes.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "ThousandEyes: {{get-alert.ruleName}} — {{get-alert.testName}}"
                urgency: "high"
            - name: notify-noc
              type: call
              call: "slack.post-message"
              with:
                channel: "#noc"
                text: "ThousandEyes alert: {{get-alert.ruleName}} — PagerDuty incident created"
  consumes:
    - type: http
      namespace: thousandeyes
      baseUri: "https://api.thousandeyes.com/v7"
      authentication:
        type: bearer
        token: "$secrets.thousandeyes_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a Webex meeting recording transcript and publishes meeting notes as a Confluence page.

naftiko: "0.5"
info:
  label: "Cisco Webex Meeting Summary to Confluence"
  description: "Retrieves a Webex meeting recording transcript and publishes meeting notes as a Confluence page."
  tags:
    - communication
    - documentation
    - cisco
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: meeting-notes
      port: 8080
      tools:
        - name: publish-meeting-notes
          description: "Given a Webex meeting ID, retrieve transcript and create Confluence page."
          inputParameters:
            - name: meeting_id
              in: body
              type: string
              description: "Webex meeting ID."
          steps:
            - name: get-transcript
              type: call
              call: "webex.get-meeting-transcript"
              with:
                meeting_id: "{{meeting_id}}"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Meeting Notes: {{get-transcript.subject}}"
                body: "## Summary\n{{get-transcript.summary}}"
  consumes:
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: meetings
          path: "/meetings/{{meeting_id}}/transcripts"
          operations:
            - name: get-meeting-transcript
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://cisco-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Blocks and alerts.

naftiko: "0.5"
info:
  label: "Cloudflare Block to PagerDuty"
  description: "Blocks and alerts."
  tags:
    - security
    - networking
    - cloudflare
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: cloudflare
      port: 8080
      tools:
        - name: cloudflare-block-to-pagerduty
          description: "Blocks and alerts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "cloudflare.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Cloudflare Block to PagerDuty"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://cloudflare.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Lists DNS records for zone.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Records"
  description: "Lists DNS records for zone."
  tags:
    - networking
    - dns
    - cloudflare
capability:
  exposes:
    - type: mcp
      namespace: dns
      port: 8080
      tools:
        - name: list-records
          description: "Given zone ID, return records."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "Zone Id"
          call: cloudflare.list-records
          with:
            zone_id: "{{zone_id}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: dns-records
          path: "/zones/{{zone_id}}/dns_records"
          operations:
            - name: list-records
              method: GET

Creates incident for alarms.

naftiko: "0.5"
info:
  label: "CloudWatch to ServiceNow"
  description: "Creates incident for alarms."
  tags:
    - cloud
    - itsm
    - aws
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cloudwatch
      port: 8080
      tools:
        - name: cloudwatch-alarm-to-incident
          description: "Creates incident for alarms."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "aws.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "CloudWatch to ServiceNow"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "CloudWatch to ServiceNow triggered"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://aws.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Compares Terraform and CMDB.

naftiko: "0.5"
info:
  label: "CMDB Drift Detection"
  description: "Compares Terraform and CMDB."
  tags:
    - itsm
    - infrastructure
    - servicenow
    - terraform
    - governance
capability:
  exposes:
    - type: mcp
      namespace: cmdb
      port: 8080
      tools:
        - name: cmdb-drift-detection
          description: "Compares Terraform and CMDB."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "CMDB Drift Detection"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Refreshes dashboard.

naftiko: "0.5"
info:
  label: "Compensation to Power BI"
  description: "Refreshes dashboard."
  tags:
    - hr
    - analytics
    - workday
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: comp
      port: 8080
      tools:
        - name: comp-review-to-power-bi
          description: "Refreshes dashboard."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Compensation to Power BI triggered"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates compliance task.

naftiko: "0.5"
info:
  label: "Concur Expense Violation"
  description: "Creates compliance task."
  tags:
    - finance
    - compliance
    - sap-concur
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: concur
      port: 8080
      tools:
        - name: concur-expense-violation
          description: "Creates compliance task."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "sap-concur.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Concur Expense Violation"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Concur Expense Violation triggered"
  consumes:
    - type: http
      namespace: sap-concur
      baseUri: "https://sap-concur.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_concur_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Pulls submitted expense reports from SAP Concur and flags policy violations, creating Jira audit tasks for the finance compliance team.

naftiko: "0.5"
info:
  label: "Concur Travel Expense Policy Audit"
  description: "Pulls submitted expense reports from SAP Concur and flags policy violations, creating Jira audit tasks for the finance compliance team."
  tags:
    - finance
    - sap-concur
    - jira
    - expense-management
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit-expense-reports
          description: "Retrieve submitted expense reports from SAP Concur for a given period and create Jira compliance tasks for any reports that exceed policy thresholds or contain flagged categories."
          inputParameters:
            - name: expense_period
              in: body
              type: string
              description: "The expense reporting period to audit (e.g., '2026-03')."
            - name: policy_threshold
              in: body
              type: number
              description: "Single-transaction threshold in USD that triggers a policy flag."
          steps:
            - name: get-reports
              type: call
              call: concur.get-expense-reports
              with:
                period: "{{expense_period}}"
                exceeds_amount: "{{policy_threshold}}"
            - name: create-audit-task
              type: call
              call: jira.create-audit-issue
              with:
                project_key: "FIN"
                issuetype: "Task"
                summary: "Expense audit flag: Period {{expense_period}} - {{get-reports.report_name}}"
                description: "Report ID: {{get-reports.report_id}}\nSubmitter: {{get-reports.submitted_by}}\nAmount: {{get-reports.total}}\nPolicy Threshold: {{policy_threshold}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: period
              in: query
            - name: exceeds_amount
              in: query
          operations:
            - name: get-expense-reports
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: audit-issues
          path: "/issue"
          operations:
            - name: create-audit-issue
              method: POST

Creates a structured Confluence knowledge base article from a ServiceNow resolved incident or problem record, maintaining institutional knowledge of recurring issues.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Article Publisher"
  description: "Creates a structured Confluence knowledge base article from a ServiceNow resolved incident or problem record, maintaining institutional knowledge of recurring issues."
  tags:
    - itsm
    - servicenow
    - confluence
    - knowledge-management
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge-mgmt
      port: 8080
      tools:
        - name: publish-kb-article
          description: "Given a resolved ServiceNow incident number, retrieve the full resolution details and create a structured Confluence knowledge base article in the IT Operations space."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The resolved ServiceNow incident number to document."
            - name: confluence_space_key
              in: body
              type: string
              description: "The Confluence space key for the IT knowledge base (e.g., ITKB)."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: create-article
              type: call
              call: confluence.create-page
              with:
                space_key: "{{confluence_space_key}}"
                title: "KB: {{get-incident.short_description}}"
                body: "**Incident:** {{incident_number}}\n**Category:** {{get-incident.category}}\n**Resolution:** {{get-incident.close_notes}}\n**Cause:** {{get-incident.cause}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_number}}"
          inputParameters:
            - name: incident_number
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://cisco.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves Confluence page by title.

naftiko: "0.5"
info:
  label: "Confluence Page Search"
  description: "Retrieves Confluence page by title."
  tags:
    - knowledge
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: get-page
          description: "Given title, return page."
          inputParameters:
            - name: title
              in: body
              type: string
              description: "Title"
          call: confluence.get-page
          with:
            title: "{{title}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://cisco-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: get-page
              method: GET

Enrolls expiring contracts.

naftiko: "0.5"
info:
  label: "Contract to HubSpot Nurture"
  description: "Enrolls expiring contracts."
  tags:
    - crm
    - marketing
    - salesforce
    - hubspot
    - slack
capability:
  exposes:
    - type: mcp
      namespace: contract
      port: 8080
      tools:
        - name: contract-to-hubspot-nurture
          description: "Enrolls expiring contracts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Contract to HubSpot Nurture triggered"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates Jira for failures.

naftiko: "0.5"
info:
  label: "Databricks Failure to Jira"
  description: "Creates Jira for failures."
  tags:
    - data
    - devops
    - azure-databricks
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: databricks
      port: 8080
      tools:
        - name: databricks-failure-to-jira
          description: "Creates Jira for failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Databricks Failure to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Databricks Failure to Jira triggered"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates PagerDuty incident and notifies Slack on critical.

naftiko: "0.5"
info:
  label: "Datadog Alert to PagerDuty and Slack"
  description: "Creates PagerDuty incident and notifies Slack on critical."
  tags:
    - observability
    - incident-response
    - datadog
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: datadog
      port: 8080
      tools:
        - name: datadog-alert-to-pagerduty-slack
          description: "Creates PagerDuty incident and notifies Slack on critical."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Datadog Alert to PagerDuty and Slack"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Datadog Alert to PagerDuty and Slack triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Datadog fires a critical alert, creates a ServiceNow P1 incident, pages the on-call team, and opens a Jira investigation ticket with full alert context.

naftiko: "0.5"
info:
  label: "Datadog Incident Triage and Escalation"
  description: "When Datadog fires a critical alert, creates a ServiceNow P1 incident, pages the on-call team, and opens a Jira investigation ticket with full alert context."
  tags:
    - observability
    - datadog
    - servicenow
    - jira
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog monitor ID and alert payload, create a ServiceNow P1 incident, open a linked Jira investigation issue, and notify the on-call team via Webex."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: monitor_name
              in: body
              type: string
              description: "The human-readable name of the Datadog monitor."
            - name: host
              in: body
              type: string
              description: "The affected host or service name."
            - name: severity
              in: body
              type: string
              description: "Alert severity: CRITICAL, WARNING, or INFO."
          steps:
            - name: create-snow-incident
              type: call
              call: servicenow.create-p1-incident
              with:
                short_description: "[{{severity}}] Datadog Alert: {{monitor_name}} on {{host}}"
                category: "monitoring"
                priority: "1"
                assigned_group: "NOC"
            - name: create-jira-investigation
              type: call
              call: jira.create-issue
              with:
                project_key: "OPS"
                issuetype: "Incident"
                summary: "Investigation: {{monitor_name}} - {{host}}"
                description: "Datadog Monitor: {{monitor_id}}\nSeverity: {{severity}}\nServiceNow: {{create-snow-incident.number}}"
            - name: alert-oncall
              type: call
              call: webex.post-oncall-alert
              with:
                room_id: "oncall-engineering"
                markdown: "**P1 ALERT** | Monitor: {{monitor_name}} | Host: {{host}} | SNOW: {{create-snow-incident.number}} | Jira: {{create-jira-investigation.key}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.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-p1-incident
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: alert-messages
          path: "/messages"
          operations:
            - name: post-oncall-alert
              method: POST

Retrieves Datadog monitor status.

naftiko: "0.5"
info:
  label: "Datadog Monitor Lookup"
  description: "Retrieves Datadog monitor status."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor
          description: "Given monitor ID, return status."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor Id"
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          operations:
            - name: get-monitor
              method: GET

Pulls weekly SLO compliance data from Datadog for all production services and posts a performance digest to the SRE team's Webex space.

naftiko: "0.5"
info:
  label: "Datadog SLO Breach Weekly Digest"
  description: "Pulls weekly SLO compliance data from Datadog for all production services and posts a performance digest to the SRE team's Webex space."
  tags:
    - observability
    - datadog
    - webex
    - slo
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: digest-slo-compliance
          description: "Retrieve SLO compliance status from Datadog for all tracked services and post a weekly digest to the SRE Webex space, highlighting any breaches or at-risk services."
          inputParameters:
            - name: slo_tag
              in: body
              type: string
              description: "The Datadog tag to filter SLOs by (e.g., team:sre, env:prod)."
            - name: reporting_week
              in: body
              type: string
              description: "The reporting week label (e.g., 'Week of 2026-03-17')."
          steps:
            - name: get-slo-data
              type: call
              call: datadog.get-slo-list
              with:
                tags: "{{slo_tag}}"
            - name: post-digest
              type: call
              call: webex.post-slo-digest
              with:
                room_id: "sre-team"
                markdown: "**SLO Weekly Digest** | {{reporting_week}} | Total SLOs: {{get-slo-data.count}} | Compliant: {{get-slo-data.compliant_count}} | At Risk: {{get-slo-data.at_risk_count}} | Breached: {{get-slo-data.breached_count}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: get-slo-list
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: sre-messages
          path: "/messages"
          operations:
            - name: post-slo-digest
              method: POST

Creates task for vulnerabilities.

naftiko: "0.5"
info:
  label: "Dependabot to Jira Security"
  description: "Creates task for vulnerabilities."
  tags:
    - security
    - devops
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dependabot
      port: 8080
      tools:
        - name: dependabot-to-jira-security
          description: "Creates task for vulnerabilities."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Dependabot to Jira Security"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Dependabot to Jira Security triggered"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves Dynatrace problem details.

naftiko: "0.5"
info:
  label: "Dynatrace Problem Lookup"
  description: "Retrieves Dynatrace problem details."
  tags:
    - observability
    - dynatrace
    - apm
capability:
  exposes:
    - type: mcp
      namespace: apm
      port: 8080
      tools:
        - name: get-problem
          description: "Given problem ID, return details."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "Problem Id"
          call: dynatrace.get-problem
          with:
            problem_id: "{{problem_id}}"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://cisco.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Api-Token $secrets.dynatrace_token"
        placement: header
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          operations:
            - name: get-problem
              method: GET

Creates incident for problems.

naftiko: "0.5"
info:
  label: "Dynatrace to ServiceNow"
  description: "Creates incident for problems."
  tags:
    - observability
    - itsm
    - dynatrace
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dynatrace
      port: 8080
      tools:
        - name: dynatrace-to-servicenow
          description: "Creates incident for problems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Dynatrace to ServiceNow"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Dynatrace to ServiceNow triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When an employee departure is confirmed in Workday, revokes GitHub access, closes all assigned ServiceNow tickets, and notifies the IT security team via Webex.

naftiko: "0.5"
info:
  label: "Employee Offboarding Deprovisioning"
  description: "When an employee departure is confirmed in Workday, revokes GitHub access, closes all assigned ServiceNow tickets, and notifies the IT security team via Webex."
  tags:
    - hr
    - workday
    - github
    - servicenow
    - webex
    - offboarding
    - security
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-employee-offboarding
          description: "Given a Workday employee ID and last working date, orchestrate the full offboarding sequence: revoke GitHub organization access, close open ServiceNow tickets, and alert the security team via Webex."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: github_username
              in: body
              type: string
              description: "The departing employee's GitHub username."
            - name: last_day
              in: body
              type: string
              description: "The employee's last working day in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: remove-github-access
              type: call
              call: github.remove-org-member
              with:
                org: "cisco"
                username: "{{github_username}}"
            - name: close-tickets
              type: call
              call: servicenow.close-user-tickets
              with:
                user_email: "{{get-worker.work_email}}"
            - name: notify-security
              type: call
              call: webex.post-offboard-alert
              with:
                room_id: "it-security"
                markdown: "**Offboarding Completed** | {{get-worker.full_name}} | Last Day: {{last_day}} | GitHub: revoked | ServiceNow: tickets closed"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-members
          path: "/orgs/{{org}}/members/{{username}}"
          inputParameters:
            - name: org
              in: path
            - name: username
              in: path
          operations:
            - name: remove-org-member
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: user-tickets
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: security-messages
          path: "/messages"
          operations:
            - name: post-offboard-alert
              method: POST

When a new hire is created in Workday, opens a ServiceNow provisioning ticket, provisions a GitHub organization seat, and sends a Webex welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow provisioning ticket, provisions a GitHub organization seat, and sends a Webex welcome message."
  tags:
    - hr
    - workday
    - servicenow
    - github
    - webex
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-employee-onboarding
          description: "Given a Workday employee ID and start date, orchestrate onboarding across ServiceNow (IT ticket), GitHub (org seat), and Webex (welcome message)."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The new hire's start date in YYYY-MM-DD format."
            - name: github_username
              in: body
              type: string
              description: "The new hire's GitHub username for organization provisioning."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-it-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "IT onboarding for {{get-employee.full_name}} starting {{start_date}}"
                category: "hr_onboarding"
                assigned_group: "IT_Provisioning"
            - name: add-github-member
              type: call
              call: github.add-org-member
              with:
                org: "cisco"
                username: "{{github_username}}"
                role: "member"
            - name: send-welcome
              type: call
              call: webex.send-welcome
              with:
                to_person_email: "{{get-employee.work_email}}"
                markdown: "Welcome to Cisco, **{{get-employee.first_name}}**! Your IT ticket is {{create-it-ticket.number}} and you have been added to the Cisco GitHub org."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.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: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-members
          path: "/orgs/{{org}}/memberships/{{username}}"
          inputParameters:
            - name: org
              in: path
            - name: username
              in: path
          operations:
            - name: add-org-member
              method: PUT
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: direct-messages
          path: "/messages"
          operations:
            - name: send-welcome
              method: POST

Suspends on risk.

naftiko: "0.5"
info:
  label: "Entra Risk to Okta Suspend"
  description: "Suspends on risk."
  tags:
    - security
    - identity
    - azure
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: entra
      port: 8080
      tools:
        - name: entra-risk-to-okta-suspend
          description: "Suspends on risk."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Entra Risk to Okta Suspend"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Updates on completion.

naftiko: "0.5"
info:
  label: "Epic to Salesforce"
  description: "Updates on completion."
  tags:
    - devops
    - crm
    - jira
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: epic
      port: 8080
      tools:
        - name: epic-to-salesforce
          description: "Updates on completion."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Epic to Salesforce"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Epic to Salesforce triggered"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Posts failure to Slack.

naftiko: "0.5"
info:
  label: "GitHub Actions Failure"
  description: "Posts failure to Slack."
  tags:
    - devops
    - ci-cd
    - github
    - slack
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: github-actions-failure-notify
          description: "Posts failure to Slack."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "GitHub Actions Failure triggered"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Updates ServiceNow change on PR merge.

naftiko: "0.5"
info:
  label: "GitHub PR to ServiceNow Change"
  description: "Updates ServiceNow change on PR merge."
  tags:
    - devops
    - itsm
    - github
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: github
      port: 8080
      tools:
        - name: github-pr-to-servicenow-change
          description: "Updates ServiceNow change on PR merge."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "github.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "GitHub PR to ServiceNow Change"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "GitHub PR to ServiceNow Change triggered"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://github.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a pull request is opened in a Cisco GitHub repository, identifies required reviewers and sends them a direct Webex message with PR context.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Code Review Notifier"
  description: "When a pull request is opened in a Cisco GitHub repository, identifies required reviewers and sends them a direct Webex message with PR context."
  tags:
    - devops
    - github
    - webex
    - code-review
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: code-review
      port: 8080
      tools:
        - name: notify-pr-reviewers
          description: "Given a GitHub pull request URL and repository, retrieve PR details and send a targeted Webex notification to the assigned reviewers prompting timely code review."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in org/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number."
          steps:
            - name: get-pr
              type: call
              call: github.get-pull-request
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: notify-reviewers
              type: call
              call: webex.send-pr-notification
              with:
                room_id: "code-reviews"
                markdown: "**PR Review Needed** | [{{get-pr.title}}]({{get-pr.html_url}}) | Repo: {{repo}} | Author: {{get-pr.author}} | Files changed: {{get-pr.changed_files}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: pr-messages
          path: "/messages"
          operations:
            - name: send-pr-notification
              method: POST

Retrieves GitHub repository metadata.

naftiko: "0.5"
info:
  label: "GitHub Repository Lookup"
  description: "Retrieves GitHub repository metadata."
  tags:
    - devops
    - github
    - code-management
capability:
  exposes:
    - type: mcp
      namespace: code-mgmt
      port: 8080
      tools:
        - name: get-repo
          description: "Given owner/repo, return metadata."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo"
          call: github.get-repo
          with:
            repo: "{{repo}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo}}"
          operations:
            - name: get-repo
              method: GET

Queries GitHub Advanced Security for critical CVE findings across Cisco repositories and opens Jira security tickets for any unresolved critical vulnerabilities.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Scanner"
  description: "Queries GitHub Advanced Security for critical CVE findings across Cisco repositories and opens Jira security tickets for any unresolved critical vulnerabilities."
  tags:
    - security
    - github
    - jira
    - vulnerability-management
    - devops
capability:
  exposes:
    - type: mcp
      namespace: security-scanning
      port: 8080
      tools:
        - name: scan-and-triage-vulnerabilities
          description: "Query GitHub Advanced Security code scanning alerts for a repository and automatically create Jira security tickets for any critical or high severity findings not yet remediated."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository to scan (format: org/repo)."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to triage: critical, high, medium, or low."
          steps:
            - name: get-alerts
              type: call
              call: github.get-code-scanning-alerts
              with:
                repo: "{{repo}}"
                severity: "{{severity_filter}}"
            - name: create-security-ticket
              type: call
              call: jira-security.create-issue
              with:
                project_key: "SEC"
                issuetype: "Security"
                summary: "Vulnerability in {{repo}}: {{get-alerts.rule_name}}"
                description: "CVE: {{get-alerts.cve_id}}\nSeverity: {{get-alerts.severity}}\nFile: {{get-alerts.location_path}}\nGitHub Alert: {{get-alerts.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/repos/{{repo}}/code-scanning/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: get-code-scanning-alerts
              method: GET
    - type: http
      namespace: jira-security
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: security-issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Creates incident with runbook.

naftiko: "0.5"
info:
  label: "Grafana to ServiceNow"
  description: "Creates incident with runbook."
  tags:
    - observability
    - itsm
    - grafana
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: grafana-alert-to-incident
          description: "Creates incident with runbook."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Grafana to ServiceNow"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Grafana to ServiceNow"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://cisco-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Searches HubSpot for contact by email.

naftiko: "0.5"
info:
  label: "HubSpot Contact Lookup"
  description: "Searches HubSpot for contact by email."
  tags:
    - crm
    - marketing
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: crm-marketing
      port: 8080
      tools:
        - name: search-contact
          description: "Given email, find contact."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email"
          call: hubspot.search-contacts
          with:
            email: "{{email}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/search"
          operations:
            - name: search-contacts
              method: POST

Syncs leads to Salesforce.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce"
  description: "Syncs leads to Salesforce."
  tags:
    - crm
    - marketing
    - hubspot
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hubspot
      port: 8080
      tools:
        - name: hubspot-lead-to-salesforce
          description: "Syncs leads to Salesforce."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "hubspot.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "HubSpot Lead to Salesforce triggered"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://hubspot.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Syncs HubSpot marketing campaign contact lists to Salesforce campaign members, ensuring revenue attribution is accurate for closed-loop marketing reporting.

naftiko: "0.5"
info:
  label: "HubSpot Marketing Campaign Sync to Salesforce"
  description: "Syncs HubSpot marketing campaign contact lists to Salesforce campaign members, ensuring revenue attribution is accurate for closed-loop marketing reporting."
  tags:
    - marketing
    - hubspot
    - salesforce
    - campaign-management
    - crm
capability:
  exposes:
    - type: mcp
      namespace: marketing-sync
      port: 8080
      tools:
        - name: sync-campaign-contacts
          description: "Given a HubSpot campaign ID and corresponding Salesforce campaign ID, retrieve all campaign contacts from HubSpot and create or update matching Salesforce campaign members."
          inputParameters:
            - name: hubspot_campaign_id
              in: body
              type: string
              description: "The HubSpot marketing campaign ID."
            - name: salesforce_campaign_id
              in: body
              type: string
              description: "The Salesforce campaign record ID to sync members into."
          steps:
            - name: get-hubspot-contacts
              type: call
              call: hubspot.get-campaign-contacts
              with:
                campaign_id: "{{hubspot_campaign_id}}"
            - name: upsert-sf-members
              type: call
              call: salesforce.upsert-campaign-member
              with:
                campaign_id: "{{salesforce_campaign_id}}"
                contact_email: "{{get-hubspot-contacts.email}}"
                status: "Sent"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/marketing/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaign-contacts
          path: "/emails/{{campaign_id}}/statistics/list-level"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-contacts
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://cisco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaign-members
          path: "/sobjects/CampaignMember"
          operations:
            - name: upsert-campaign-member
              method: POST

Queries Jira for all unestimated and stale backlog issues older than 30 days and posts a grooming agenda to the product team's Webex space.

naftiko: "0.5"
info:
  label: "Jira Backlog Grooming Report"
  description: "Queries Jira for all unestimated and stale backlog issues older than 30 days and posts a grooming agenda to the product team's Webex space."
  tags:
    - devops
    - jira
    - webex
    - backlog-grooming
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: backlog-ops
      port: 8080
      tools:
        - name: publish-grooming-agenda
          description: "Query Jira for stale, unestimated backlog issues on a given board and post a grooming agenda to the product team Webex space. Use before weekly grooming sessions."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID to audit the backlog for."
            - name: stale_days
              in: body
              type: integer
              description: "Number of days without update to consider an issue stale."
          steps:
            - name: get-stale-issues
              type: call
              call: jira.search-issues
              with:
                board_id: "{{board_id}}"
                stale_days: "{{stale_days}}"
            - name: post-agenda
              type: call
              call: webex.post-grooming-agenda
              with:
                room_id: "product-team"
                markdown: "**Backlog Grooming Agenda** | Board: {{board_id}} | Stale issues (>{{stale_days}}d): {{get-stale-issues.count}} | Unestimated: {{get-stale-issues.unestimated_count}} | Top issues: {{get-stale-issues.summary}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issue-search
          path: "/search"
          inputParameters:
            - name: board_id
              in: query
            - name: stale_days
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: grooming-messages
          path: "/messages"
          operations:
            - name: post-grooming-agenda
              method: POST

Creates ServiceNow problem for recurring bugs.

naftiko: "0.5"
info:
  label: "Jira Bug to ServiceNow Problem"
  description: "Creates ServiceNow problem for recurring bugs."
  tags:
    - devops
    - itsm
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: jira-bug-to-servicenow-problem
          description: "Creates ServiceNow problem for recurring bugs."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Jira Bug to ServiceNow Problem"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Retrieves Jira issue status and assignee.

naftiko: "0.5"
info:
  label: "Jira Issue Status Lookup"
  description: "Retrieves Jira issue status and assignee."
  tags:
    - devops
    - jira
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: project-mgmt
      port: 8080
      tools:
        - name: get-issue
          description: "Given issue key, return status."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Issue Key"
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          operations:
            - name: get-issue
              method: GET

Publishes release notes.

naftiko: "0.5"
info:
  label: "Jira Release to Confluence"
  description: "Publishes release notes."
  tags:
    - devops
    - documentation
    - jira
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: jira
      port: 8080
      tools:
        - name: jira-release-to-confluence
          description: "Publishes release notes."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "jira.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Jira Release to Confluence"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Jira Release to Confluence triggered"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://jira.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates a new Jira sprint for a given board, populates it with backlog issues meeting priority criteria, and notifies the product team via Webex.

naftiko: "0.5"
info:
  label: "Jira Sprint Planning Kickoff"
  description: "Creates a new Jira sprint for a given board, populates it with backlog issues meeting priority criteria, and notifies the product team via Webex."
  tags:
    - devops
    - jira
    - webex
    - sprint-planning
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: sprint-planning
      port: 8080
      tools:
        - name: kickoff-sprint
          description: "Given a Jira board ID and sprint name, create a new sprint, move the top prioritized backlog issues into it, and notify the product team via Webex that planning is ready."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID to create the sprint on."
            - name: sprint_name
              in: body
              type: string
              description: "The name for the new sprint (e.g., 'Sprint 42 - Networking Platform')."
            - name: start_date
              in: body
              type: string
              description: "Sprint start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Sprint end date in YYYY-MM-DD format."
          steps:
            - name: create-sprint
              type: call
              call: jira.create-sprint
              with:
                board_id: "{{board_id}}"
                name: "{{sprint_name}}"
                startDate: "{{start_date}}"
                endDate: "{{end_date}}"
            - name: notify-team
              type: call
              call: webex.post-sprint-kickoff
              with:
                room_id: "product-team"
                markdown: "**Sprint Created** | {{sprint_name}} | Board: {{board_id}} | Start: {{start_date}} | End: {{end_date}} | Sprint ID: {{create-sprint.id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/sprint"
          operations:
            - name: create-sprint
              method: POST
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: team-messages
          path: "/messages"
          operations:
            - name: post-sprint-kickoff
              method: POST

Creates ticket for latency.

naftiko: "0.5"
info:
  label: "Latency Spike to Jira"
  description: "Creates ticket for latency."
  tags:
    - observability
    - devops
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: latency
      port: 8080
      tools:
        - name: latency-spike-to-jira
          description: "Creates ticket for latency."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Latency Spike to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Latency Spike to Jira triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves LinkedIn Sponsored Content campaign analytics for Cisco's employer branding initiatives and posts a weekly performance digest to the talent brand Webex space.

naftiko: "0.5"
info:
  label: "LinkedIn Employer Brand Campaign Tracker"
  description: "Retrieves LinkedIn Sponsored Content campaign analytics for Cisco's employer branding initiatives and posts a weekly performance digest to the talent brand Webex space."
  tags:
    - marketing
    - linkedin
    - webex
    - employer-brand
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: employer-brand
      port: 8080
      tools:
        - name: digest-linkedin-brand-performance
          description: "Retrieve impressions, clicks, and follower growth from LinkedIn Campaign Manager for Cisco employer brand campaigns and post a weekly digest to the talent acquisition Webex space."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The LinkedIn Campaign Manager campaign ID."
            - name: reporting_week
              in: body
              type: string
              description: "The reporting week label (e.g., 'Week of 2026-03-17')."
          steps:
            - name: get-campaign-stats
              type: call
              call: linkedin.get-campaign-analytics
              with:
                campaign_id: "{{campaign_id}}"
            - name: post-digest
              type: call
              call: webex.post-brand-digest
              with:
                room_id: "talent-brand"
                markdown: "**LinkedIn Brand Report** | {{reporting_week}} | Impressions: {{get-campaign-stats.impressions}} | Clicks: {{get-campaign-stats.clicks}} | CTR: {{get-campaign-stats.ctr}}% | Followers gained: {{get-campaign-stats.follower_growth}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: campaign-analytics
          path: "/adAnalyticsV2"
          inputParameters:
            - name: campaign_id
              in: query
          operations:
            - name: get-campaign-analytics
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: brand-messages
          path: "/messages"
          operations:
            - name: post-brand-digest
              method: POST

Creates Slack channel and pages.

naftiko: "0.5"
info:
  label: "Major Incident Bridge"
  description: "Creates Slack channel and pages."
  tags:
    - itsm
    - incident-response
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: major
      port: 8080
      tools:
        - name: major-incident-bridge
          description: "Creates Slack channel and pages."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "servicenow.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Major Incident Bridge"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Major Incident Bridge triggered"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://servicenow.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves app health from New Relic.

naftiko: "0.5"
info:
  label: "New Relic App Health"
  description: "Retrieves app health from New Relic."
  tags:
    - observability
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: app-health
      port: 8080
      tools:
        - name: get-health
          description: "Given app name, return health."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "App Name"
          call: newrelic.get-app
          with:
            name: "{{app_name}}"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: applications
          path: "/applications.json"
          operations:
            - name: get-app
              method: GET

Creates Jira bug for errors.

naftiko: "0.5"
info:
  label: "New Relic Error to Jira"
  description: "Creates Jira bug for errors."
  tags:
    - observability
    - devops
    - new-relic
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: new
      port: 8080
      tools:
        - name: new-relic-error-to-jira
          description: "Creates Jira bug for errors."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "observability.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "New Relic Error to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "New Relic Error to Jira triggered"
  consumes:
    - type: http
      namespace: observability
      baseUri: "https://observability.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.observability_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Resets MFA and closes ticket.

naftiko: "0.5"
info:
  label: "Okta MFA Reset with ServiceNow"
  description: "Resets MFA and closes ticket."
  tags:
    - security
    - identity
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: okta-mfa-reset-servicenow
          description: "Resets MFA and closes ticket."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Okta MFA Reset with ServiceNow"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Investigates and creates incident.

naftiko: "0.5"
info:
  label: "Okta Risky Login"
  description: "Investigates and creates incident."
  tags:
    - security
    - identity
    - okta
    - splunk
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: okta
      port: 8080
      tools:
        - name: okta-risky-login-investigation
          description: "Investigates and creates incident."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "identity.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Okta Risky Login"
  consumes:
    - type: http
      namespace: identity
      baseUri: "https://identity.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.identity_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Lists Okta groups for a user.

naftiko: "0.5"
info:
  label: "Okta User Groups Lookup"
  description: "Lists Okta groups for a user."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-groups
          description: "Given email, return groups."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email"
          call: okta.get-user-groups
          with:
            user_id: "{{email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://cisco.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "SSWS $secrets.okta_api_token"
        placement: header
      resources:
        - name: groups
          path: "/users/{{user_id}}/groups"
          operations:
            - name: get-user-groups
              method: GET

Loads invoices.

naftiko: "0.5"
info:
  label: "Oracle Invoice to Snowflake"
  description: "Loads invoices."
  tags:
    - finance
    - data
    - oracle
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: oracle
      port: 8080
      tools:
        - name: oracle-invoice-to-snowflake
          description: "Loads invoices."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Retrieves current on-call engineer.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Retrieves current on-call engineer."
  tags:
    - operations
    - pagerduty
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ops
      port: 8080
      tools:
        - name: get-on-call
          description: "Given schedule ID, return on-call."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule Id"
          call: pagerduty.get-on-call
          with:
            schedule_id: "{{schedule_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: schedules
          path: "/schedules/{{schedule_id}}"
          operations:
            - name: get-on-call
              method: GET

Creates postmortem page.

naftiko: "0.5"
info:
  label: "PagerDuty to Confluence Postmortem"
  description: "Creates postmortem page."
  tags:
    - operations
    - documentation
    - pagerduty
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pagerduty
      port: 8080
      tools:
        - name: pagerduty-to-confluence-postmortem
          description: "Creates postmortem page."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "pagerduty.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "PagerDuty to Confluence Postmortem"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "PagerDuty to Confluence Postmortem triggered"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://pagerduty.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Compares ADP vs Workday.

naftiko: "0.5"
info:
  label: "Payroll Audit"
  description: "Compares ADP vs Workday."
  tags:
    - hr
    - finance
    - adp
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: payroll
      port: 8080
      tools:
        - name: payroll-audit
          description: "Compares ADP vs Workday."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "adp.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Payroll Audit"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://adp.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Refreshes and distributes.

naftiko: "0.5"
info:
  label: "Power BI Distribution"
  description: "Refreshes and distributes."
  tags:
    - analytics
    - reporting
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: power
      port: 8080
      tools:
        - name: power-bi-distribution
          description: "Refreshes and distributes."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Power BI Distribution triggered"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Triggers a Power BI dataset refresh for the executive business performance dashboard on a scheduled or on-demand basis, pulling data from Snowflake.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the executive business performance dashboard on a scheduled or on-demand basis, pulling data from Snowflake."
  tags:
    - analytics
    - power-bi
    - snowflake
    - reporting
    - executive
capability:
  exposes:
    - type: mcp
      namespace: exec-analytics
      port: 8080
      tools:
        - name: refresh-exec-dashboard
          description: "Trigger a Power BI dataset refresh for the executive dashboard. Use for scheduled refreshes or when urgent on-demand reporting is required by leadership."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID for the executive performance dashboard."
          call: powerbi.trigger-refresh
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_id
              type: string
              mapping: "$.id"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Checks Power BI dataset refresh.

naftiko: "0.5"
info:
  label: "Power BI Refresh Status"
  description: "Checks Power BI dataset refresh."
  tags:
    - analytics
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: reporting
      port: 8080
      tools:
        - name: get-refresh
          description: "Given dataset ID, return status."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset Id"
          call: powerbi.get-refresh
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/datasets/{{dataset_id}}/refreshes"
          operations:
            - name: get-refresh
              method: GET

Posts runbook to Slack.

naftiko: "0.5"
info:
  label: "Runbook from PagerDuty"
  description: "Posts runbook to Slack."
  tags:
    - operations
    - documentation
    - pagerduty
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: runbook
      port: 8080
      tools:
        - name: runbook-from-pagerduty
          description: "Posts runbook to Slack."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "pagerduty.get-data"
              with:
                id: "{{input_id}}"
            - name: create-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Runbook from PagerDuty"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Runbook from PagerDuty triggered"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://pagerduty.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "Token token=$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates tasks for violations.

naftiko: "0.5"
info:
  label: "S3 Compliance Scan"
  description: "Creates tasks for violations."
  tags:
    - security
    - compliance
    - aws
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: s3
      port: 8080
      tools:
        - name: s3-compliance-scan
          description: "Creates tasks for violations."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "aws.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "S3 Compliance Scan"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "S3 Compliance Scan triggered"
  consumes:
    - type: http
      namespace: aws
      baseUri: "https://aws.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves support case status.

naftiko: "0.5"
info:
  label: "Salesforce Case Lookup"
  description: "Retrieves support case status."
  tags:
    - crm
    - support
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: support
      port: 8080
      tools:
        - name: get-case
          description: "Given case number, return status."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "Case Number"
          call: salesforce.get-case
          with:
            case_number: "{{case_number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cisco.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/query"
          operations:
            - name: get-case
              method: GET

When a new lead arrives in Salesforce, enriches it with company data and routes it to the appropriate regional sales rep, notifying them via Webex.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment and Routing"
  description: "When a new lead arrives in Salesforce, enriches it with company data and routes it to the appropriate regional sales rep, notifying them via Webex."
  tags:
    - sales
    - salesforce
    - webex
    - lead-management
    - crm
capability:
  exposes:
    - type: mcp
      namespace: lead-management
      port: 8080
      tools:
        - name: enrich-and-route-lead
          description: "Given a Salesforce lead ID, retrieve the lead record, update it with enriched account data, assign it to the correct sales rep based on territory, and notify the rep via Webex."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to enrich and route."
          steps:
            - name: get-lead
              type: call
              call: salesforce-lead.get-lead
              with:
                lead_id: "{{lead_id}}"
            - name: update-lead
              type: call
              call: salesforce-update.update-lead
              with:
                lead_id: "{{lead_id}}"
                status: "Assigned"
                owner_id: "$secrets.sales_team_default_owner"
            - name: notify-rep
              type: call
              call: webex.notify-sales-rep
              with:
                room_id: "sales-leads"
                markdown: "New Lead Assigned | **{{get-lead.company}}** | Contact: {{get-lead.first_name}} {{get-lead.last_name}} | Title: {{get-lead.title}} | Lead ID: {{lead_id}}"
  consumes:
    - type: http
      namespace: salesforce-lead
      baseUri: "https://cisco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: salesforce-update
      baseUri: "https://cisco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: lead-updates
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: sales-messages
          path: "/messages"
          operations:
            - name: notify-sales-rep
              method: POST

Retrieves Salesforce opportunity details.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Status"
  description: "Retrieves Salesforce opportunity details."
  tags:
    - crm
    - salesforce
    - sales
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Given ID, return stage and amount."
          inputParameters:
            - name: opp_id
              in: body
              type: string
              description: "Opp Id"
          call: salesforce.get-opportunity
          with:
            id: "{{opp_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cisco.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{id}}"
          operations:
            - name: get-opportunity
              method: GET

When a Salesforce opportunity moves to Closed Won, automatically creates a Jira project for delivery tracking and notifies the delivery team via Webex.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to Jira Project Sync"
  description: "When a Salesforce opportunity moves to Closed Won, automatically creates a Jira project for delivery tracking and notifies the delivery team via Webex."
  tags:
    - sales
    - salesforce
    - jira
    - webex
    - crm
    - project-management
capability:
  exposes:
    - type: mcp
      namespace: sales-delivery
      port: 8080
      tools:
        - name: sync-won-opportunity
          description: "Given a Salesforce opportunity ID that has closed as Won, create a Jira delivery project, link the opportunity, and notify the delivery team in Webex."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID for the closed-won deal."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-project
              type: call
              call: jira.create-project
              with:
                name: "{{get-opportunity.account_name}} - {{get-opportunity.name}}"
                project_type_key: "software"
                lead_account_id: "$secrets.jira_delivery_lead_id"
            - name: notify-delivery
              type: call
              call: webex.post-message
              with:
                room_id: "delivery-team"
                markdown: "New Delivery Project Created | **{{get-opportunity.account_name}}** | Deal: {{get-opportunity.name}} | Value: {{get-opportunity.amount}} | Jira: {{create-project.key}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cisco.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: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: projects
          path: "/project"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: post-message
              method: POST

Queries Salesforce for enterprise customer renewal opportunities closing within 90 days and posts a prioritized renewal alert to the account management Webex space.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Opportunity Alert"
  description: "Queries Salesforce for enterprise customer renewal opportunities closing within 90 days and posts a prioritized renewal alert to the account management Webex space."
  tags:
    - sales
    - salesforce
    - webex
    - renewals
    - account-management
capability:
  exposes:
    - type: mcp
      namespace: renewal-management
      port: 8080
      tools:
        - name: alert-renewal-opportunities
          description: "Query Salesforce for all renewal opportunities closing within 90 days and post a sorted summary to the account management Webex space for proactive outreach planning."
          inputParameters:
            - name: close_within_days
              in: body
              type: integer
              description: "Number of days ahead to filter renewal close dates (e.g., 90)."
            - name: min_arr
              in: body
              type: number
              description: "Minimum annual recurring revenue in USD to include in the alert."
          steps:
            - name: get-renewals
              type: call
              call: salesforce.get-renewal-opportunities
              with:
                close_within_days: "{{close_within_days}}"
                min_arr: "{{min_arr}}"
            - name: post-alert
              type: call
              call: webex.post-renewal-alert
              with:
                room_id: "account-management"
                markdown: "**Renewal Alert** | Closing within {{close_within_days}} days | Count: {{get-renewals.count}} | Total ARR at risk: {{get-renewals.total_arr}} | Top account: {{get-renewals.top_account}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://cisco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: renewal-opportunities
          path: "/query"
          inputParameters:
            - name: close_within_days
              in: query
            - name: min_arr
              in: query
          operations:
            - name: get-renewal-opportunities
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: renewal-messages
          path: "/messages"
          operations:
            - name: post-renewal-alert
              method: POST

Notifies at-risk renewals.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Risk"
  description: "Notifies at-risk renewals."
  tags:
    - crm
    - sales
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: salesforce-renewal-risk
          description: "Notifies at-risk renewals."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Salesforce Renewal Risk triggered"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates Jira project on Closed-Won.

naftiko: "0.5"
info:
  label: "Salesforce Won to Jira Project"
  description: "Creates Jira project on Closed-Won."
  tags:
    - crm
    - devops
    - salesforce
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: salesforce
      port: 8080
      tools:
        - name: salesforce-won-to-jira-project
          description: "Creates Jira project on Closed-Won."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "salesforce.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Salesforce Won to Jira Project"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Salesforce Won to Jira Project triggered"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://salesforce.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Updates with delivery status.

naftiko: "0.5"
info:
  label: "SAP Delivery to Salesforce"
  description: "Updates with delivery status."
  tags:
    - erp
    - crm
    - sap
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-delivery-to-salesforce
          description: "Updates with delivery status."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Looks up a SAP S/4HANA purchase order by PO number, returning status, vendor, total value, and currency for procurement and finance queries.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP S/4HANA purchase order by PO number, returning status, vendor, total value, and currency for procurement and finance queries."
  tags:
    - finance
    - sap
    - procurement
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP purchase order number, retrieve the PO header status, vendor name, total amount, and currency from SAP S/4HANA. Use for procurement tracking and AP reconciliation."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (e.g., 4500001234)."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cisco-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
              outputRawFormat: xml

Retrieves SAP PO status.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Retrieves SAP PO status."
  tags:
    - finance
    - sap
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-po
          description: "Given PO number, return status."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "Po Number"
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://cisco-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pos
          path: "/A_PurchaseOrder('{{po_number}}')"
          operations:
            - name: get-po
              method: GET

Alerts low stock.

naftiko: "0.5"
info:
  label: "SAP Stock Alert"
  description: "Alerts low stock."
  tags:
    - erp
    - supply-chain
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sap
      port: 8080
      tools:
        - name: sap-stock-alert-to-slack
          description: "Alerts low stock."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "erp.get-data"
              with:
                id: "{{input_id}}"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "SAP Stock Alert triggered"
  consumes:
    - type: http
      namespace: erp
      baseUri: "https://erp.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.erp_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves all pending change requests from ServiceNow awaiting CAB approval and posts a summary to the change management Webex space.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Tracker"
  description: "Retrieves all pending change requests from ServiceNow awaiting CAB approval and posts a summary to the change management Webex space."
  tags:
    - itsm
    - servicenow
    - webex
    - change-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: digest-pending-changes
          description: "Retrieve all ServiceNow change requests currently in the scheduled or pending CAB approval state and post a digest to the change management Webex space."
          inputParameters:
            - name: change_window
              in: body
              type: string
              description: "The change window date in YYYY-MM-DD format to filter relevant changes."
          steps:
            - name: get-pending-changes
              type: call
              call: servicenow.get-pending-changes
              with:
                planned_date: "{{change_window}}"
            - name: post-digest
              type: call
              call: webex.post-change-digest
              with:
                room_id: "change-management"
                markdown: "**Change Request Digest** | Window: {{change_window}} | Pending: {{get-pending-changes.count}} changes | Risk breakdown: {{get-pending-changes.risk_summary}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          inputParameters:
            - name: planned_date
              in: query
          operations:
            - name: get-pending-changes
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: change-messages
          path: "/messages"
          operations:
            - name: post-change-digest
              method: POST

Retrieves ServiceNow incident details.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status"
  description: "Retrieves ServiceNow incident details."
  tags:
    - itsm
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given number, return status."
          inputParameters:
            - name: number
              in: body
              type: string
              description: "Number"
          call: servicenow.get-incident
          with:
            number: "{{number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Posts message to Slack channel.

naftiko: "0.5"
info:
  label: "Slack Message Poster"
  description: "Posts message to Slack channel."
  tags:
    - communication
    - slack
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: post-message
          description: "Given channel and text, post."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "Channel"
          call: slack.post-message
          with:
            channel: "{{channel}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Alerts on credit overage.

naftiko: "0.5"
info:
  label: "Snowflake Cost Alert"
  description: "Alerts on credit overage."
  tags:
    - data
    - finops
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: snowflake-cost-to-finops
          description: "Alerts on credit overage."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Snowflake Cost Alert"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Snowflake Cost Alert triggered"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Runs data quality checks on Snowflake tables for enterprise data products, and opens a Jira data quality ticket when anomalies or null rate thresholds are breached.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Monitor"
  description: "Runs data quality checks on Snowflake tables for enterprise data products, and opens a Jira data quality ticket when anomalies or null rate thresholds are breached."
  tags:
    - data
    - snowflake
    - jira
    - data-quality
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table name and quality thresholds, execute a null rate and row count check and automatically open a Jira data quality incident if thresholds are breached."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "The fully qualified Snowflake table name (e.g., PROD.SALES.OPPORTUNITIES)."
            - name: null_threshold_pct
              in: body
              type: number
              description: "Maximum acceptable null rate percentage for key columns."
          steps:
            - name: check-quality
              type: call
              call: snowflake.run-quality-check
              with:
                table_name: "{{table_name}}"
                null_threshold: "{{null_threshold_pct}}"
            - name: create-dq-ticket
              type: call
              call: jira.create-dq-issue
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Data quality breach: {{table_name}}"
                description: "Table: {{table_name}}\nNull Rate: {{check-quality.null_rate_pct}}%\nRow Count: {{check-quality.row_count}}\nThreshold: {{null_threshold_pct}}%"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://cisco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: quality-checks
          path: "/statements"
          operations:
            - name: run-quality-check
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://cisco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: dq-issues
          path: "/issue"
          operations:
            - name: create-dq-issue
              method: POST

Creates Jira task for data anomalies.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality to Jira"
  description: "Creates Jira task for data anomalies."
  tags:
    - data
    - quality
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: snowflake
      port: 8080
      tools:
        - name: snowflake-quality-to-jira
          description: "Creates Jira task for data anomalies."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                summary: "Snowflake Data Quality to Jira"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Snowflake Data Quality to Jira triggered"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://cisco-jira.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes read-only SQL against Snowflake.

naftiko: "0.5"
info:
  label: "Snowflake Query Runner"
  description: "Executes read-only SQL against Snowflake."
  tags:
    - data
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-query
          description: "Given SQL, execute query."
          inputParameters:
            - name: sql
              in: body
              type: string
              description: "Sql"
          call: snowflake.execute-query
          with:
            statement: "{{sql}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://cisco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Creates incident for down.

naftiko: "0.5"
info:
  label: "SolarWinds to PagerDuty"
  description: "Creates incident for down."
  tags:
    - networking
    - incident-response
    - solarwinds
    - pagerduty
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: solarwinds
      port: 8080
      tools:
        - name: solarwinds-to-pagerduty
          description: "Creates incident for down."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "solarwinds.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "SolarWinds to PagerDuty"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.solarwinds_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Creates security incident from Splunk.

naftiko: "0.5"
info:
  label: "Splunk Alert to Security Incident"
  description: "Creates security incident from Splunk."
  tags:
    - security
    - siem
    - splunk
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: splunk
      port: 8080
      tools:
        - name: splunk-alert-to-security-incident
          description: "Creates security incident from Splunk."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "splunk.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Splunk Alert to Security Incident"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Splunk Alert to Security Incident triggered"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes Splunk SPL query.

naftiko: "0.5"
info:
  label: "Splunk Search Runner"
  description: "Executes Splunk SPL query."
  tags:
    - security
    - observability
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: log-analysis
      port: 8080
      tools:
        - name: run-search
          description: "Given SPL query, execute."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query"
          call: splunk.create-search
          with:
            search: "{{query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.cisco.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Creates incident for failures.

naftiko: "0.5"
info:
  label: "Tableau to ServiceNow"
  description: "Creates incident for failures."
  tags:
    - analytics
    - itsm
    - tableau
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: tableau
      port: 8080
      tools:
        - name: tableau-failure-to-incident
          description: "Creates incident for failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "analytics.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Tableau to ServiceNow"
            - name: notify-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#alerts"
                text: "Tableau to ServiceNow triggered"
  consumes:
    - type: http
      namespace: analytics
      baseUri: "https://analytics.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates page from transcript.

naftiko: "0.5"
info:
  label: "Teams to Confluence"
  description: "Creates page from transcript."
  tags:
    - communication
    - documentation
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: teams
      port: 8080
      tools:
        - name: teams-to-confluence
          description: "Creates page from transcript."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "microsoft-teams.get-data"
              with:
                id: "{{input_id}}"
            - name: create-page
              type: call
              call: "confluence.create-page"
              with:
                title: "Teams to Confluence"
  consumes:
    - type: http
      namespace: microsoft-teams
      baseUri: "https://microsoft-teams.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.microsoft_teams_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://cisco-wiki.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Triggers a Terraform Cloud workspace run for infrastructure changes and tracks the apply status, opening a ServiceNow change record if the run requires approval.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Deployment"
  description: "Triggers a Terraform Cloud workspace run for infrastructure changes and tracks the apply status, opening a ServiceNow change record if the run requires approval."
  tags:
    - cloud
    - terraform
    - servicenow
    - infrastructure
    - devops
capability:
  exposes:
    - type: mcp
      namespace: infra-deployment
      port: 8080
      tools:
        - name: trigger-terraform-deployment
          description: "Given a Terraform Cloud workspace ID and message, trigger an infrastructure plan run. If the run requires manual approval, create a ServiceNow change request to gate the apply."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID to trigger a run for."
            - name: change_message
              in: body
              type: string
              description: "Description of the infrastructure change being deployed."
          steps:
            - name: trigger-run
              type: call
              call: terraform.create-run
              with:
                workspace_id: "{{workspace_id}}"
                message: "{{change_message}}"
            - name: create-snow-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Terraform deployment: {{workspace_id}}"
                description: "{{change_message}}\nTerraform Run ID: {{trigger-run.run_id}}"
                category: "infrastructure"
  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: servicenow
      baseUri: "https://cisco.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

Creates change for Terraform plan.

naftiko: "0.5"
info:
  label: "Terraform Plan to Change"
  description: "Creates change for Terraform plan."
  tags:
    - infrastructure
    - itsm
    - terraform
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: terraform
      port: 8080
      tools:
        - name: terraform-plan-to-change
          description: "Creates change for Terraform plan."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "infrastructure.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Terraform Plan to Change"
  consumes:
    - type: http
      namespace: infrastructure
      baseUri: "https://infrastructure.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.infrastructure_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Retrieves Terraform workspace state.

naftiko: "0.5"
info:
  label: "Terraform Workspace Status"
  description: "Retrieves Terraform workspace state."
  tags:
    - infrastructure
    - terraform
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: infra
      port: 8080
      tools:
        - name: get-workspace
          description: "Given workspace, return status."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Workspace"
          call: terraform.get-workspace
          with:
            workspace: "{{workspace}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/cisco/workspaces/{{workspace}}"
          operations:
            - name: get-workspace
              method: GET

Identifies employees with incomplete benefits enrollment in Workday and sends targeted reminder messages via Webex during the open enrollment window.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Identifies employees with incomplete benefits enrollment in Workday and sends targeted reminder messages via Webex during the open enrollment window."
  tags:
    - hr
    - workday
    - webex
    - benefits
    - enrollment
capability:
  exposes:
    - type: mcp
      namespace: benefits-ops
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Retrieve employees with incomplete benefits enrollment from Workday and send reminder Webex messages to each employee and their HR business partner before the enrollment deadline."
          inputParameters:
            - name: enrollment_period
              in: body
              type: string
              description: "The open enrollment period identifier (e.g., '2026-OPEN')."
            - name: deadline
              in: body
              type: string
              description: "The enrollment deadline in YYYY-MM-DD format."
          steps:
            - name: get-incomplete-enrollees
              type: call
              call: workday.get-incomplete-enrollment
              with:
                enrollment_period: "{{enrollment_period}}"
            - name: send-reminders
              type: call
              call: webex.send-enrollment-reminder
              with:
                room_id: "hr-announcements"
                markdown: "**Benefits Enrollment Reminder** | Period: {{enrollment_period}} | Deadline: {{deadline}} | {{get-incomplete-enrollees.count}} employees have not completed enrollment. Please log in to Workday to complete your selections."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefit-elections
          path: "/benefitElections"
          inputParameters:
            - name: enrollment_period
              in: query
          operations:
            - name: get-incomplete-enrollment
              method: GET
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: hr-messages
          path: "/messages"
          operations:
            - name: send-enrollment-reminder
              method: POST

Retrieves employee profile from Workday HCM.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile from Workday HCM."
  tags:
    - hr
    - workday
    - employee-data
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Given worker ID, return profile."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Worker Id"
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/cisco/workers/{{worker_id}}"
          operations:
            - name: get-worker
              method: GET

Loads headcount snapshot.

naftiko: "0.5"
info:
  label: "Workday Headcount to Snowflake"
  description: "Loads headcount snapshot."
  tags:
    - hr
    - data
    - workday
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-headcount-to-snowflake
          description: "Loads headcount snapshot."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "data.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: data
      baseUri: "https://data.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.data_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Provisions Okta for new hires.

naftiko: "0.5"
info:
  label: "Workday New Hire to Okta"
  description: "Provisions Okta for new hires."
  tags:
    - hr
    - security
    - workday
    - okta
    - onboarding
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-new-hire-to-okta
          description: "Provisions Okta for new hires."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET

Retrieves current headcount by department and cost center from Workday for monthly payroll reconciliation and finance reporting.

naftiko: "0.5"
info:
  label: "Workday Payroll Headcount Snapshot"
  description: "Retrieves current headcount by department and cost center from Workday for monthly payroll reconciliation and finance reporting."
  tags:
    - hr
    - finance
    - workday
    - payroll
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns all active employees grouped by department and cost center from Workday. Use for monthly payroll reconciliation, finance reporting, and headcount planning."
          call: workday.get-headcount
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.workerId"
                - name: full_name
                  type: string
                  mapping: "$.fullName"
                - name: department
                  type: string
                  mapping: "$.department"
                - name: cost_center
                  type: string
                  mapping: "$.costCenter"
                - name: employment_type
                  type: string
                  mapping: "$.employmentType"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: get-headcount
              method: GET

When an employee role change is approved in Workday, updates their GitHub repository access and ServiceNow roles, and notifies their new manager via Webex.

naftiko: "0.5"
info:
  label: "Workday Role Change Provisioning"
  description: "When an employee role change is approved in Workday, updates their GitHub repository access and ServiceNow roles, and notifies their new manager via Webex."
  tags:
    - hr
    - workday
    - github
    - servicenow
    - webex
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: role-provisioning
      port: 8080
      tools:
        - name: provision-role-change
          description: "Given a Workday employee ID and new role, retrieve the updated role details, adjust GitHub team membership and ServiceNow roles accordingly, and notify the new manager via Webex."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role is changing."
            - name: new_role
              in: body
              type: string
              description: "The new job role title being assigned."
            - name: github_team
              in: body
              type: string
              description: "The GitHub team slug to add the employee to based on the new role."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: update-github-team
              type: call
              call: github.add-team-member
              with:
                org: "cisco"
                team_slug: "{{github_team}}"
                username: "{{get-worker.github_username}}"
            - name: update-snow-roles
              type: call
              call: servicenow.update-user-roles
              with:
                user_id: "{{get-worker.servicenow_user_id}}"
                new_role: "{{new_role}}"
            - name: notify-manager
              type: call
              call: webex.notify-manager
              with:
                to_person_email: "{{get-worker.manager_email}}"
                markdown: "Role Change Completed | Employee: **{{get-worker.full_name}}** | New Role: {{new_role}} | GitHub Team: {{github_team}} | ServiceNow roles updated."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: team-memberships
          path: "/orgs/{{org}}/teams/{{team_slug}}/memberships/{{username}}"
          inputParameters:
            - name: org
              in: path
            - name: team_slug
              in: path
            - name: username
              in: path
          operations:
            - name: add-team-member
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: user-roles
          path: "/table/sys_user_role"
          operations:
            - name: update-user-roles
              method: POST
    - type: http
      namespace: webex
      baseUri: "https://webexapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.webex_token"
      resources:
        - name: manager-messages
          path: "/messages"
          operations:
            - name: notify-manager
              method: POST

Syncs groups on role change.

naftiko: "0.5"
info:
  label: "Workday Role to Okta Groups"
  description: "Syncs groups on role change."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-role-to-okta-groups
          description: "Syncs groups on role change."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Workday Role to Okta Groups"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST

Deactivates Okta user on Workday termination and creates ServiceNow task.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "Deactivates Okta user on Workday termination and creates ServiceNow task."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: workday
      port: 8080
      tools:
        - name: workday-termination-to-okta-deprovisioning
          description: "Deactivates Okta user on Workday termination and creates ServiceNow task."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "Input identifier."
          steps:
            - name: get-data
              type: call
              call: "workday.get-data"
              with:
                id: "{{input_id}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                short_description: "Workday Termination to Okta Deprovisioning"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://workday.cisco.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: data
          path: "/data"
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://cisco.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/table/incident"
          operations:
            - name: create-record
              method: POST