John Deere Capabilities

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

Sort
Expand

Compares Workday headcount data against ADP payroll records to identify discrepancies and alerts the payroll team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Discrepancy Alert"
  description: "Compares Workday headcount data against ADP payroll records to identify discrepancies and alerts the payroll team via Microsoft Teams."
  tags:
    - hr
    - payroll
    - adp
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-payroll
      port: 8080
      tools:
        - name: check-payroll-discrepancies
          description: "Compare Workday headcount against ADP payroll records and alert the payroll team about any discrepancies."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period identifier, e.g. 2026-03-15."
          steps:
            - name: get-workday-headcount
              type: call
              call: workday.get-active-workers
              with:
                as_of_date: "{{pay_period}}"
            - name: get-adp-payroll
              type: call
              call: adp.get-payroll-register
              with:
                pay_period: "{{pay_period}}"
            - name: notify-payroll
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_payroll_channel_id"
                text: "Payroll Discrepancy Check: Workday active: {{get-workday-headcount.count}} | ADP payroll: {{get-adp-payroll.count}} | Period: {{pay_period}}"
  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?activeAsOf={{as_of_date}}"
          inputParameters:
            - name: as_of_date
              in: path
          operations:
            - name: get-active-workers
              method: GET
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/payroll/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/payroll-register?payPeriod={{pay_period}}"
          inputParameters:
            - name: pay_period
              in: path
          operations:
            - name: get-payroll-register
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new ServiceNow incident is created, sends the incident description to Anthropic Claude for intelligent classification and priority recommendation, then updates the incident with AI-suggested category and priority.

naftiko: "0.5"
info:
  label: "Anthropic-Powered Service Desk Triage"
  description: "When a new ServiceNow incident is created, sends the incident description to Anthropic Claude for intelligent classification and priority recommendation, then updates the incident with AI-suggested category and priority."
  tags:
    - ai
    - itsm
    - servicenow
    - anthropic
    - automation
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: ai-triage
      port: 8080
      tools:
        - name: triage-incident-with-ai
          description: "Given a ServiceNow incident ID and description, send the description to Anthropic Claude for classification, then update the incident with the recommended category and priority."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "The ServiceNow incident sys_id to triage."
            - name: incident_description
              in: body
              type: string
              description: "The full incident description text to classify."
          steps:
            - name: classify-incident
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Classify this IT incident and recommend a category and priority (1-4): {{incident_description}}"
            - name: update-incident
              type: call
              call: "servicenow.update-incident"
              with:
                incident_id: "{{incident_id}}"
                ai_classification: "{{classify-incident.content}}"
  consumes:
    - 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: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: update-incident
              method: PATCH

Retrieves the Azure Active Directory group memberships for a user, returning group names and IDs for access review and compliance.

naftiko: "0.5"
info:
  label: "Azure AD User Group Membership Check"
  description: "Retrieves the Azure Active Directory group memberships for a user, returning group names and IDs for access review and compliance."
  tags:
    - security
    - identity
    - azure-active-directory
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: get-user-groups
          description: "Look up Azure AD group memberships for a user by UPN. Returns group names and IDs. Use for access reviews and compliance audits."
          inputParameters:
            - name: user_upn
              in: body
              type: string
              description: "The user principal name (email)."
          call: azuread.get-member-of
          with:
            user_upn: "{{user_upn}}"
          outputParameters:
            - name: groups
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user-groups
          path: "/users/{{user_upn}}/memberOf"
          inputParameters:
            - name: user_upn
              in: path
          operations:
            - name: get-member-of
              method: GET

When an Azure Data Factory pipeline fails, retrieves the error details, creates a ServiceNow incident, and triggers a pipeline rerun.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Failure Remediation"
  description: "When an Azure Data Factory pipeline fails, retrieves the error details, creates a ServiceNow incident, and triggers a pipeline rerun."
  tags:
    - data-engineering
    - azure-data-factory
    - servicenow
    - azure
    - automation
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: remediate-pipeline-failure
          description: "Given a failed ADF pipeline run ID, retrieve error details, open a ServiceNow incident, and trigger a rerun of the pipeline."
          inputParameters:
            - name: pipeline_run_id
              in: body
              type: string
              description: "The Azure Data Factory pipeline run ID."
            - name: factory_name
              in: body
              type: string
              description: "The ADF factory name."
          steps:
            - name: get-run-details
              type: call
              call: adf.get-pipeline-run
              with:
                factory_name: "{{factory_name}}"
                run_id: "{{pipeline_run_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "ADF pipeline failure: {{get-run-details.pipeline_name}}"
                description: "Error: {{get-run-details.message}} | Run ID: {{pipeline_run_id}}"
                category: "data_engineering"
            - name: rerun-pipeline
              type: call
              call: adf.rerun-pipeline
              with:
                factory_name: "{{factory_name}}"
                pipeline_name: "{{get-run-details.pipeline_name}}"
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/$secrets.azure_subscription_id/resourceGroups/$secrets.azure_rg/providers/Microsoft.DataFactory/factories"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: pipeline-runs
          path: "/{{factory_name}}/pipelineruns/{{run_id}}"
          inputParameters:
            - name: factory_name
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-pipeline-run
              method: GET
        - name: pipelines
          path: "/{{factory_name}}/pipelines/{{pipeline_name}}/createRun"
          inputParameters:
            - name: factory_name
              in: path
            - name: pipeline_name
              in: path
          operations:
            - name: rerun-pipeline
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.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

Polls Azure Data Factory for failed pipeline runs in the last 24 hours, creates ServiceNow incidents for each failure, and posts a digest to the data engineering Teams channel.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Monitor"
  description: "Polls Azure Data Factory for failed pipeline runs in the last 24 hours, creates ServiceNow incidents for each failure, and posts a digest to the data engineering Teams channel."
  tags:
    - data
    - azure-data-factory
    - servicenow
    - microsoft-teams
    - monitoring
    - data-pipelines
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-adf-pipeline-failures
          description: "Retrieve failed Azure Data Factory pipeline runs from the past 24 hours, open ServiceNow incidents for each failure, and post a summary to the data engineering Teams channel."
          inputParameters:
            - name: factory_name
              in: body
              type: string
              description: "The Azure Data Factory instance name."
            - name: resource_group
              in: body
              type: string
              description: "The Azure resource group containing the Data Factory."
            - name: subscription_id
              in: body
              type: string
              description: "The Azure subscription ID."
          steps:
            - name: get-failed-runs
              type: call
              call: "adf.list-pipeline-runs"
              with:
                factory_name: "{{factory_name}}"
                resource_group: "{{resource_group}}"
                subscription_id: "{{subscription_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "ADF pipeline failures detected in {{factory_name}}"
                category: "data_engineering"
                urgency: "2"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "ADF Pipeline Digest: {{factory_name}} has failures in the last 24h. Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipeline-runs
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.DataFactory/factories/{{factory_name}}/queryPipelineRuns"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
            - name: factory_name
              in: path
          operations:
            - name: list-pipeline-runs
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an Azure Databricks job fails, retrieves the run details and error output, creates a Jira ticket for the data engineering team, and posts to Teams.

naftiko: "0.5"
info:
  label: "Azure Databricks Job Failure Notification"
  description: "When an Azure Databricks job fails, retrieves the run details and error output, creates a Jira ticket for the data engineering team, and posts to Teams."
  tags:
    - data-engineering
    - azure-databricks
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-databricks-failure
          description: "Given a Databricks job run ID, retrieve failure details, create a Jira ticket, and notify the data engineering team in Teams."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The Databricks job run ID."
          steps:
            - name: get-run
              type: call
              call: databricks.get-run
              with:
                run_id: "{{run_id}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                summary: "Databricks job failure: {{get-run.run_name}}"
                description: "Error: {{get-run.state_message}} | Cluster: {{get-run.cluster_id}}"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_data_channel_id"
                text: "Databricks Failure: {{get-run.run_name}} | Error: {{get-run.state_message}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://adb-johndeere.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/get?run_id={{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://johndeere.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Submits a machine learning model training job to Azure Databricks, monitors completion, and posts training metrics to the data science Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Azure Databricks ML Model Training Job"
  description: "Submits a machine learning model training job to Azure Databricks, monitors completion, and posts training metrics to the data science Microsoft Teams channel."
  tags:
    - ai
    - machine-learning
    - azure-databricks
    - microsoft-teams
    - mlops
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: run-model-training-job
          description: "Given a Databricks notebook path and job parameters, submit a training run on the Azure Databricks cluster and post the run metrics to the data science Teams channel on completion."
          inputParameters:
            - name: workspace_url
              in: body
              type: string
              description: "The Azure Databricks workspace URL."
            - name: notebook_path
              in: body
              type: string
              description: "The path to the Databricks notebook to run."
            - name: cluster_id
              in: body
              type: string
              description: "The Databricks cluster ID to run the job on."
            - name: experiment_name
              in: body
              type: string
              description: "The MLflow experiment name for tracking the run."
          steps:
            - name: submit-run
              type: call
              call: "databricks.submit-notebook-run"
              with:
                notebook_path: "{{notebook_path}}"
                cluster_id: "{{cluster_id}}"
            - name: post-results
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_datascience_channel_id"
                text: "ML Training Job submitted: {{experiment_name}} | Notebook: {{notebook_path}} | Run ID: {{submit-run.run_id}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://adb-prod.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/submit"
          operations:
            - name: submit-notebook-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Before an Azure DevOps release progresses to production, validates that a ServiceNow change request is approved and notifies the release manager via Teams.

naftiko: "0.5"
info:
  label: "Azure DevOps Release Gate with ServiceNow"
  description: "Before an Azure DevOps release progresses to production, validates that a ServiceNow change request is approved and notifies the release manager via Teams."
  tags:
    - devops
    - azure-devops
    - servicenow
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: devops-release
      port: 8080
      tools:
        - name: validate-release-gate
          description: "Given an Azure DevOps release ID, check ServiceNow change request approval and notify the release manager."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "The Azure DevOps release ID."
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          steps:
            - name: check-change
              type: call
              call: servicenow.get-change-request
              with:
                change_number: "{{change_number}}"
            - name: notify-release-manager
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_release_channel_id"
                text: "Release {{release_id}} gate check: Change {{change_number}} status is {{check-change.approval_status}}. Proceed: {{check-change.is_approved}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: get-change-request
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Monitors AKS for pods with excessive restarts, retrieves pod logs, creates a ServiceNow incident, and alerts the platform team in Teams.

naftiko: "0.5"
info:
  label: "Azure Kubernetes Pod Restart Alert"
  description: "Monitors AKS for pods with excessive restarts, retrieves pod logs, creates a ServiceNow incident, and alerts the platform team in Teams."
  tags:
    - devops
    - azure-kubernetes-service
    - servicenow
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: platform-ops
      port: 8080
      tools:
        - name: alert-pod-restarts
          description: "Given an AKS cluster name and namespace, check for pods with high restart counts, create a ServiceNow incident, and notify the platform team."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The AKS cluster name."
            - name: namespace
              in: body
              type: string
              description: "The Kubernetes namespace to check."
          steps:
            - name: get-pod-status
              type: call
              call: aks.get-pods
              with:
                cluster_name: "{{cluster_name}}"
                namespace: "{{namespace}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "AKS pod restart alert: {{cluster_name}}/{{namespace}}"
                description: "Pods with excessive restarts detected in {{namespace}} on {{cluster_name}}"
                category: "platform"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_platform_channel_id"
                text: "AKS Alert: Pod restarts in {{cluster_name}}/{{namespace}} | Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: aks
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: pods
          path: "/subscriptions/$secrets.azure_subscription_id/resourceGroups/$secrets.azure_rg/providers/Microsoft.ContainerService/managedClusters/{{cluster_name}}/pods?namespace={{namespace}}"
          inputParameters:
            - name: cluster_name
              in: path
            - name: namespace
              in: path
          operations:
            - name: get-pods
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Triggers a rolling deployment update on an AKS cluster, monitors rollout status via Datadog, and notifies the platform engineering team in Microsoft Teams on success or failure.

naftiko: "0.5"
info:
  label: "Azure Kubernetes Service Deployment Rollout"
  description: "Triggers a rolling deployment update on an AKS cluster, monitors rollout status via Datadog, and notifies the platform engineering team in Microsoft Teams on success or failure."
  tags:
    - devops
    - cloud
    - kubernetes
    - azure
    - datadog
    - microsoft-teams
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: platform-engineering
      port: 8080
      tools:
        - name: deploy-aks-workload
          description: "Given an AKS cluster name and deployment manifest, trigger a rolling update, poll Datadog for error rate spikes during rollout, and report completion status to the platform Teams channel."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The Azure Kubernetes Service cluster name."
            - name: namespace
              in: body
              type: string
              description: "The Kubernetes namespace for the deployment."
            - name: deployment_name
              in: body
              type: string
              description: "The name of the Kubernetes deployment to update."
            - name: image_tag
              in: body
              type: string
              description: "The new container image tag to deploy."
          steps:
            - name: trigger-deployment
              type: call
              call: "aks.update-deployment"
              with:
                cluster_name: "{{cluster_name}}"
                namespace: "{{namespace}}"
                deployment_name: "{{deployment_name}}"
                image_tag: "{{image_tag}}"
            - name: check-error-rate
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:trace.error.rate{service:{{deployment_name}}}"
            - name: notify-platform-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_platform_channel_id"
                text: "Deployment complete: {{deployment_name}} → {{image_tag}} on {{cluster_name}}/{{namespace}} | Error rate: {{check-error-rate.value}}"
  consumes:
    - type: http
      namespace: aks
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: deployments
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.ContainerService/managedClusters/{{cluster_name}}/agentPools"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
            - name: cluster_name
              in: path
          operations:
            - name: update-deployment
              method: PUT
    - 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: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Executes a Kusto query against an Azure Log Analytics workspace and returns the result set for operational analysis.

naftiko: "0.5"
info:
  label: "Azure Log Analytics Query Runner"
  description: "Executes a Kusto query against an Azure Log Analytics workspace and returns the result set for operational analysis."
  tags:
    - observability
    - azure
    - azure-log-analytics
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: run-log-query
          description: "Run a Kusto query against Azure Log Analytics. Returns the result set. Use for ad-hoc operational analysis and troubleshooting."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Log Analytics workspace ID."
            - name: query
              in: body
              type: string
              description: "The Kusto query to execute."
          call: loganalytics.run-query
          with:
            workspace_id: "{{workspace_id}}"
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.tables[0].rows"
  consumes:
    - type: http
      namespace: loganalytics
      baseUri: "https://api.loganalytics.io/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: query
          path: "/workspaces/{{workspace_id}}/query"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: run-query
              method: POST

Checks the health and inference latency of a deployed Azure ML endpoint and creates a ServiceNow incident if degradation is detected.

naftiko: "0.5"
info:
  label: "Azure Machine Learning Model Deployment Monitor"
  description: "Checks the health and inference latency of a deployed Azure ML endpoint and creates a ServiceNow incident if degradation is detected."
  tags:
    - data-science
    - azure-machine-learning
    - servicenow
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: monitor-ml-endpoint
          description: "Given an Azure ML endpoint name, check health and latency. Create a ServiceNow incident if degradation is found."
          inputParameters:
            - name: endpoint_name
              in: body
              type: string
              description: "The Azure ML online endpoint name."
          steps:
            - name: get-endpoint
              type: call
              call: azureml.get-endpoint-status
              with:
                endpoint_name: "{{endpoint_name}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "ML endpoint degradation: {{endpoint_name}}"
                description: "State: {{get-endpoint.provisioning_state}} | Traffic: {{get-endpoint.traffic}}"
                category: "ml_ops"
  consumes:
    - type: http
      namespace: azureml
      baseUri: "https://management.azure.com/subscriptions/$secrets.azure_subscription_id/resourceGroups/$secrets.azure_rg/providers/Microsoft.MachineLearningServices/workspaces/$secrets.azureml_workspace"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: endpoints
          path: "/onlineEndpoints/{{endpoint_name}}"
          inputParameters:
            - name: endpoint_name
              in: path
          operations:
            - name: get-endpoint-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves current month-to-date spend for an Azure resource group, broken down by service category, for FinOps reporting.

naftiko: "0.5"
info:
  label: "Azure Resource Group Cost Summary"
  description: "Retrieves current month-to-date spend for an Azure resource group, broken down by service category, for FinOps reporting."
  tags:
    - cloud
    - finops
    - azure
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: get-resource-group-cost
          description: "Get month-to-date Azure spend for a resource group. Returns total cost and breakdown by service. Use for FinOps reviews and budget tracking."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name."
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription ID."
          call: azure.get-cost-summary
          with:
            subscription_id: "{{subscription_id}}"
            resource_group: "{{resource_group}}"
          outputParameters:
            - name: total_cost
              type: number
              mapping: "$.properties.rows[0].cost"
            - name: currency
              type: string
              mapping: "$.properties.rows[0].currency"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: cost-management
          path: "/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group
              in: path
          operations:
            - name: get-cost-summary
              method: POST

Retrieves classification labels for files in a Box folder and reports unclassified or miscategorized files for data governance compliance.

naftiko: "0.5"
info:
  label: "Box File Classification Compliance Check"
  description: "Retrieves classification labels for files in a Box folder and reports unclassified or miscategorized files for data governance compliance."
  tags:
    - governance
    - box
    - compliance
    - data-management
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: check-file-classification
          description: "Given a Box folder ID, retrieve file classifications and report unclassified items. Use for data governance audits."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "The Box folder ID to audit."
          call: box.get-folder-items
          with:
            folder_id: "{{folder_id}}"
          outputParameters:
            - name: items
              type: array
              mapping: "$.entries"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items?fields=name,metadata.enterprise.classification"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET

On a GitHub Actions pipeline failure on a protected branch, creates a Datadog event marker, opens a ServiceNow incident, and posts an alert to Microsoft Teams engineering channel.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Observability Chain"
  description: "On a GitHub Actions pipeline failure on a protected branch, creates a Datadog event marker, opens a ServiceNow incident, and posts an alert to Microsoft Teams engineering channel."
  tags:
    - devops
    - cicd
    - github-actions
    - datadog
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure event, create a Datadog event marker, open a ServiceNow incident, and alert the engineering Teams channel with full context."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository name in owner/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: branch
              in: body
              type: string
              description: "The branch on which the pipeline failed."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions run ID for the failed run."
            - name: commit_sha
              in: body
              type: string
              description: "The commit SHA that triggered the failing pipeline."
          steps:
            - name: create-dd-event
              type: call
              call: "datadog.create-event"
              with:
                title: "Pipeline failure: {{workflow_name}} on {{branch}}"
                text: "Repo: {{repository}} | Run: {{run_id}} | Commit: {{commit_sha}}"
                alert_type: "error"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[CI Failure] {{repository}} / {{branch}} — {{workflow_name}}"
                category: "software"
                urgency: "2"
            - name: post-alert
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Pipeline Failure: {{repository}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Incident: {{create-incident.number}}"
  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: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When AWS or Azure spend exceeds a budget threshold, retrieves cost details, creates a ServiceNow task for FinOps review, and notifies the cloud infrastructure team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Responder"
  description: "When AWS or Azure spend exceeds a budget threshold, retrieves cost details, creates a ServiceNow task for FinOps review, and notifies the cloud infrastructure team via Microsoft Teams."
  tags:
    - cloud
    - finops
    - aws
    - azure
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: respond-to-cost-anomaly
          description: "Given an AWS or Azure cost anomaly alert, retrieve spend details, open a ServiceNow FinOps review task, and notify the cloud team channel in Teams."
          inputParameters:
            - name: cloud_provider
              in: body
              type: string
              description: "Cloud provider identifier: aws or azure."
            - name: account_id
              in: body
              type: string
              description: "The cloud account or subscription ID with the anomaly."
            - name: anomaly_amount
              in: body
              type: number
              description: "The overage amount in USD triggering the alert."
            - name: service_name
              in: body
              type: string
              description: "The cloud service name responsible for the anomaly."
          steps:
            - name: create-finops-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Cloud cost anomaly: {{cloud_provider}} {{service_name}} — ${{anomaly_amount}} overage"
                category: "finops"
                assigned_group: "Cloud_FinOps"
            - name: notify-cloud-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_cloud_channel_id"
                text: "Cost Alert: {{cloud_provider}} account {{account_id}} | Service: {{service_name}} | Overage: ${{anomaly_amount}} | Task: {{create-finops-task.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Cloudflare WAF events for a zone, analyzes attack patterns, and creates a Jira security ticket for the security operations team.

naftiko: "0.5"
info:
  label: "Cloudflare WAF Event Investigation"
  description: "Retrieves Cloudflare WAF events for a zone, analyzes attack patterns, and creates a Jira security ticket for the security operations team."
  tags:
    - security
    - cloudflare
    - jira
    - waf
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: investigate-waf-events
          description: "Given a Cloudflare zone ID and time range, retrieve WAF events and create a Jira security investigation ticket."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone ID."
            - name: since
              in: body
              type: string
              description: "Start time in ISO 8601 format."
          steps:
            - name: get-events
              type: call
              call: cloudflare.get-waf-events
              with:
                zone_id: "{{zone_id}}"
                since: "{{since}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "WAF investigation: {{get-events.total_events}} events on zone {{zone_id}}"
                description: "Top rule: {{get-events.top_rule}} | Top source: {{get-events.top_source_ip}} | Events since: {{since}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: waf-events
          path: "/zones/{{zone_id}}/security/events?since={{since}}"
          inputParameters:
            - name: zone_id
              in: path
            - name: since
              in: path
          operations:
            - name: get-waf-events
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://johndeere.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Searches Confluence for pages matching a query and returns page title, space key, last updated date, and author.

naftiko: "0.5"
info:
  label: "Confluence Page Lookup"
  description: "Searches Confluence for pages matching a query and returns page title, space key, last updated date, and author."
  tags:
    - collaboration
    - confluence
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: collab-wiki
      port: 8080
      tools:
        - name: search-confluence
          description: "Search Confluence for pages by keyword. Returns page title, space key, last updated date, and author. Use for knowledge discovery."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query string."
          call: confluence.search-pages
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://johndeere.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: search
          path: "/search?cql=text~'{{query}}'"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: search-pages
              method: GET

When Datadog detects a metric anomaly or threshold breach in production, automatically opens a ServiceNow priority incident and pages the on-call engineer via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Datadog Anomaly Alert to ServiceNow Incident"
  description: "When Datadog detects a metric anomaly or threshold breach in production, automatically opens a ServiceNow priority incident and pages the on-call engineer via Microsoft Teams."
  tags:
    - observability
    - incident-response
    - datadog
    - servicenow
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog monitor alert with host and metric context, create a ServiceNow P1 incident and page the on-call engineer via Microsoft Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that fired."
            - name: monitor_name
              in: body
              type: string
              description: "Human-readable name of the Datadog monitor."
            - name: affected_service
              in: body
              type: string
              description: "The name of the service or host affected by the alert."
            - name: alert_status
              in: body
              type: string
              description: "The alert status: Alert, Warn, or No Data."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Datadog alert: {{monitor_name}} on {{affected_service}}"
                category: "infrastructure"
                urgency: "1"
            - name: page-oncall
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_oncall_channel_id"
                text: "ALERT: {{monitor_name}} | Service: {{affected_service}} | Status: {{alert_status}} | Incident: {{create-incident.number}}"
  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}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Datadog detects a log anomaly, retrieves the anomaly details and creates a ServiceNow incident with log context for investigation.

naftiko: "0.5"
info:
  label: "Datadog Log Anomaly to ServiceNow"
  description: "When Datadog detects a log anomaly, retrieves the anomaly details and creates a ServiceNow incident with log context for investigation."
  tags:
    - observability
    - datadog
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: escalate-log-anomaly
          description: "Given a Datadog log anomaly alert ID, retrieve details and create a ServiceNow incident for investigation."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog alert event ID."
          steps:
            - name: get-alert
              type: call
              call: datadog.get-event
              with:
                event_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Log anomaly: {{get-alert.title}}"
                description: "Source: {{get-alert.source}} | Tags: {{get-alert.tags}} | Message: {{get-alert.text}}"
                category: "observability"
  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: events
          path: "/events/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries Datadog for the current health status of a monitored service, returning active alerts, host count, and P95 latency.

naftiko: "0.5"
info:
  label: "Datadog Service Health Check"
  description: "Queries Datadog for the current health status of a monitored service, returning active alerts, host count, and P95 latency."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-health
          description: "Check the health of a service in Datadog. Returns active alerts count, host count, and P95 latency. Use for operations monitoring and incident triage."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name to check."
          call: datadog.get-service-summary
          with:
            service_name: "{{service_name}}"
          outputParameters:
            - name: alert_count
              type: number
              mapping: "$.alertCount"
            - name: host_count
              type: number
              mapping: "$.hostCount"
            - name: p95_latency
              type: number
              mapping: "$.p95Latency"
  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: services
          path: "/service_dependencies/{{service_name}}"
          inputParameters:
            - name: service_name
              in: path
          operations:
            - name: get-service-summary
              method: GET

When a DocuSign envelope is completed, retrieves the signed document details and creates a corresponding contract record in SAP.

naftiko: "0.5"
info:
  label: "DocuSign Contract Completion to SAP Record"
  description: "When a DocuSign envelope is completed, retrieves the signed document details and creates a corresponding contract record in SAP."
  tags:
    - legal
    - docusign
    - sap
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: legal-contracts
      port: 8080
      tools:
        - name: sync-signed-contract
          description: "Given a completed DocuSign envelope ID, retrieve signing details and create a contract record in SAP."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "The DocuSign envelope ID."
          steps:
            - name: get-envelope
              type: call
              call: docusign.get-envelope
              with:
                envelope_id: "{{envelope_id}}"
            - name: create-contract
              type: call
              call: sap.create-contract
              with:
                vendor: "{{get-envelope.signer_company}}"
                start_date: "{{get-envelope.completed_date}}"
                description: "{{get-envelope.email_subject}}"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes/{{envelope_id}}"
          inputParameters:
            - name: envelope_id
              in: path
          operations:
            - name: get-envelope
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_PURCHASECONTRACT_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: contracts
          path: "/A_PurchaseContract"
          operations:
            - name: create-contract
              method: POST

Retrieves CPU, memory, and disk utilization metrics for a Dynatrace-monitored host for capacity planning and performance review.

naftiko: "0.5"
info:
  label: "Dynatrace Host Metric Snapshot"
  description: "Retrieves CPU, memory, and disk utilization metrics for a Dynatrace-monitored host for capacity planning and performance review."
  tags:
    - observability
    - dynatrace
    - infrastructure
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-host-metrics
          description: "Retrieve CPU, memory, and disk metrics for a Dynatrace-monitored host. Use for capacity planning and infrastructure reviews."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "The Dynatrace host entity ID."
          call: dynatrace.get-host-metrics
          with:
            host_id: "{{host_id}}"
          outputParameters:
            - name: cpu_usage
              type: number
              mapping: "$.totalResults[0].data[0].values[0]"
            - name: memory_usage
              type: number
              mapping: "$.totalResults[1].data[0].values[0]"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://johndeere.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query?metricSelector=builtin:host.cpu.usage,builtin:host.mem.usage&entitySelector=entityId({{host_id}})"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host-metrics
              method: GET

When Dynatrace opens a problem for a production service, creates a ServiceNow priority incident, links the Dynatrace problem ID, and sends an alert to the SRE Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Dynatrace Problem Escalation to ServiceNow"
  description: "When Dynatrace opens a problem for a production service, creates a ServiceNow priority incident, links the Dynatrace problem ID, and sends an alert to the SRE Microsoft Teams channel."
  tags:
    - observability
    - incident-response
    - dynatrace
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sre-ops
      port: 8080
      tools:
        - name: escalate-dynatrace-problem
          description: "Given a Dynatrace problem ID and impacted entity, create a P1 ServiceNow incident and alert the SRE channel in Microsoft Teams with problem context."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "The Dynatrace problem ID."
            - name: impacted_entity
              in: body
              type: string
              description: "The name of the service or host impacted by the Dynatrace problem."
            - name: problem_title
              in: body
              type: string
              description: "The Dynatrace problem title or summary."
          steps:
            - name: get-problem
              type: call
              call: "dynatrace.get-problem"
              with:
                problem_id: "{{problem_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Dynatrace: {{problem_title}} — {{impacted_entity}}"
                category: "infrastructure"
                urgency: "1"
            - name: alert-sre
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_sre_channel_id"
                text: "Dynatrace Problem: {{problem_title}} | Entity: {{impacted_entity}} | ID: {{problem_id}} | Incident: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://johndeere.live.dynatrace.com/api/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.dynatrace_token"
        placement: header
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee termination is recorded in Workday, revokes Salesforce and Azure Active Directory access, closes open ServiceNow tickets, and notifies the manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Workflow"
  description: "When an employee termination is recorded in Workday, revokes Salesforce and Azure Active Directory access, closes open ServiceNow tickets, and notifies the manager via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, revoke system access in Salesforce and Azure AD, close open ServiceNow tickets, and notify the manager via Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "The last working day in YYYY-MM-DD format."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: deactivate-sf-user
              type: call
              call: "salesforce.deactivate-user"
              with:
                user_email: "{{get-employee.work_email}}"
            - name: close-snow-tickets
              type: call
              call: "servicenow.close-tickets-by-user"
              with:
                user_email: "{{get-employee.work_email}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Offboarding complete for {{get-employee.full_name}} (termination: {{termination_date}}). All system access has been revoked."
  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: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: users
          path: "/sobjects/User/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-tickets-by-user
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message to the new employee.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message to the new employee."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department or business unit the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to John Deere, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the health status of an F5 BIG-IP virtual server, returning pool member availability, connection count, and throughput.

naftiko: "0.5"
info:
  label: "F5 Virtual Server Health Check"
  description: "Retrieves the health status of an F5 BIG-IP virtual server, returning pool member availability, connection count, and throughput."
  tags:
    - network
    - f5-networks
    - load-balancer
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: get-virtual-server-health
          description: "Check F5 virtual server health. Returns pool member availability, connections, and throughput. Use for network operations."
          inputParameters:
            - name: virtual_server_name
              in: body
              type: string
              description: "The F5 virtual server name."
          call: f5.get-virtual-server
          with:
            name: "{{virtual_server_name}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.availabilityState"
            - name: connections
              type: number
              mapping: "$.clientside.curConns"
  consumes:
    - type: http
      namespace: f5
      baseUri: "https://johndeere-f5.com/mgmt/tm/ltm"
      authentication:
        type: basic
        username: "$secrets.f5_user"
        password: "$secrets.f5_password"
      resources:
        - name: virtual-servers
          path: "/virtual/{{name}}/stats"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: get-virtual-server
              method: GET

When a GitHub Actions production deployment is pending, retrieves the workflow details, checks change management approval in ServiceNow, and approves or denies the deployment.

naftiko: "0.5"
info:
  label: "GitHub Actions Deployment Approval Gate"
  description: "When a GitHub Actions production deployment is pending, retrieves the workflow details, checks change management approval in ServiceNow, and approves or denies the deployment."
  tags:
    - devops
    - github
    - github-actions
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: devops-release
      port: 8080
      tools:
        - name: check-deployment-gate
          description: "Given a GitHub Actions workflow run ID, check if the associated ServiceNow change request is approved and either approve or deny the deployment."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
          steps:
            - name: get-run
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: check-change
              type: call
              call: servicenow.get-change-request
              with:
                change_number: "{{get-run.change_request_number}}"
            - name: approve-deploy
              type: call
              call: github.approve-deployment
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
                approved: "{{check-change.approval_status}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
        - name: deployments
          path: "/repos/{{repo}}/actions/runs/{{run_id}}/pending_deployments"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: approve-deployment
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: get-change-request
              method: GET

On a GitHub pull request creation, triggers a SonarQube code analysis scan and posts the quality gate result as a PR comment and a Microsoft Teams notification.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Code Quality Gate"
  description: "On a GitHub pull request creation, triggers a SonarQube code analysis scan and posts the quality gate result as a PR comment and a Microsoft Teams notification."
  tags:
    - devops
    - code-quality
    - github
    - microsoft-teams
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: code-quality
      port: 8080
      tools:
        - name: run-code-quality-gate
          description: "Given a GitHub repository and pull request number, trigger SonarQube analysis and post the quality gate result back to the GitHub PR and the engineering Teams channel."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: pull_request_number
              in: body
              type: integer
              description: "The GitHub pull request number to analyze."
            - name: branch
              in: body
              type: string
              description: "The source branch of the pull request."
          steps:
            - name: get-pr
              type: call
              call: "github.get-pull-request"
              with:
                repository: "{{repository}}"
                pull_number: "{{pull_request_number}}"
            - name: post-pr-comment
              type: call
              call: "github-comments.create-comment"
              with:
                repository: "{{repository}}"
                issue_number: "{{pull_request_number}}"
                body: "Code quality scan triggered for branch {{branch}}. Results will be posted when analysis completes."
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Code quality scan triggered: {{repository}} PR #{{pull_request_number}} ({{branch}})"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repository}}/pulls/{{pull_number}}"
          inputParameters:
            - name: repository
              in: path
            - name: pull_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
    - type: http
      namespace: github-comments
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issue-comments
          path: "/repos/{{repository}}/issues/{{issue_number}}/comments"
          inputParameters:
            - name: repository
              in: path
            - name: issue_number
              in: path
          operations:
            - name: create-comment
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new engineer joins a team in Workday, provisions GitHub repository access in the appropriate organization and notifies the team lead via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Repository Access Provisioning"
  description: "When a new engineer joins a team in Workday, provisions GitHub repository access in the appropriate organization and notifies the team lead via Microsoft Teams."
  tags:
    - hr
    - devops
    - workday
    - github
    - microsoft-teams
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: dev-access
      port: 8080
      tools:
        - name: provision-github-access
          description: "Given a Workday worker ID and GitHub team slug, add the new employee to the appropriate GitHub organization team and notify the team lead via Microsoft Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the new engineer."
            - name: github_team_slug
              in: body
              type: string
              description: "The GitHub team slug to add the engineer to (e.g., platform-engineering)."
            - name: github_org
              in: body
              type: string
              description: "The GitHub organization name."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: add-to-team
              type: call
              call: "github.add-team-member"
              with:
                org: "{{github_org}}"
                team_slug: "{{github_team_slug}}"
                username: "{{get-worker.github_username}}"
            - name: notify-team-lead
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "GitHub access provisioned: {{get-worker.full_name}} added to {{github_org}}/{{github_team_slug}}"
  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-members
          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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks whether a GitHub repository has branch protection rules enabled on main and returns required reviewers, status checks, and enforcement settings.

naftiko: "0.5"
info:
  label: "GitHub Repository Branch Protection Check"
  description: "Checks whether a GitHub repository has branch protection rules enabled on main and returns required reviewers, status checks, and enforcement settings."
  tags:
    - devops
    - github
    - security
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: devops-security
      port: 8080
      tools:
        - name: check-branch-protection
          description: "Check if a GitHub repository has branch protection enabled on main. Returns required reviewers, status checks, and enforcement settings. Use for security compliance audits."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "The GitHub repository name in org/repo format."
          call: github.get-branch-protection
          with:
            repo: "{{repo_name}}"
          outputParameters:
            - name: required_reviewers
              type: number
              mapping: "$.required_pull_request_reviews.required_approving_review_count"
            - name: enforce_admins
              type: boolean
              mapping: "$.enforce_admins.enabled"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo}}/branches/main/protection"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-branch-protection
              method: GET

When GitHub detects a secret scanning alert, retrieves the alert details and creates a Jira security ticket for remediation tracking.

naftiko: "0.5"
info:
  label: "GitHub Secret Scanning Alert to Jira"
  description: "When GitHub detects a secret scanning alert, retrieves the alert details and creates a Jira security ticket for remediation tracking."
  tags:
    - security
    - github
    - jira
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: escalate-secret-alert
          description: "Given a GitHub secret scanning alert number and repository, create a Jira security ticket for remediation."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
            - name: alert_number
              in: body
              type: number
              description: "The GitHub secret scanning alert number."
          steps:
            - name: get-alert
              type: call
              call: github.get-secret-alert
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                summary: "Secret exposed: {{get-alert.secret_type}} in {{repo}}"
                description: "Alert: {{alert_number}} | Type: {{get-alert.secret_type}} | State: {{get-alert.state}} | Created: {{get-alert.created_at}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: secret-alerts
          path: "/repos/{{repo}}/secret-scanning/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-secret-alert
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://johndeere.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When GitHub Advanced Security detects a critical or high severity vulnerability, creates a ServiceNow security incident and assigns to the security engineering team, then notifies via Microsoft Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "When GitHub Advanced Security detects a critical or high severity vulnerability, creates a ServiceNow security incident and assigns to the security engineering team, then notifies via Microsoft Teams."
  tags:
    - devops
    - security
    - github
    - servicenow
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-security-alert
          description: "Given a GitHub security alert for a repository, create a ServiceNow security incident and notify the security team channel in Microsoft Teams."
          inputParameters:
            - name: repository
              in: body
              type: string
              description: "The GitHub repository in owner/repo format where the vulnerability was found."
            - name: alert_number
              in: body
              type: integer
              description: "The GitHub code scanning alert number."
            - name: severity
              in: body
              type: string
              description: "The severity level: critical, high, medium, or low."
            - name: rule_description
              in: body
              type: string
              description: "The description of the security rule that was violated."
          steps:
            - name: get-alert
              type: call
              call: "github.get-code-scanning-alert"
              with:
                repository: "{{repository}}"
                alert_number: "{{alert_number}}"
            - name: create-sec-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[Security] {{severity}} vulnerability in {{repository}}: {{rule_description}}"
                category: "security"
                urgency: "1"
            - name: notify-security-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Security Alert: {{severity}} in {{repository}} | {{rule_description}} | Incident: {{create-sec-incident.number}} | Alert: {{get-alert.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/{{repository}}/code-scanning/alerts/{{alert_number}}"
          inputParameters:
            - name: repository
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-code-scanning-alert
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls a website traffic summary from Google Analytics including sessions, bounce rate, and top landing pages for marketing review.

naftiko: "0.5"
info:
  label: "Google Analytics Traffic Report"
  description: "Pulls a website traffic summary from Google Analytics including sessions, bounce rate, and top landing pages for marketing review."
  tags:
    - marketing
    - google-analytics
    - analytics
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: get-traffic-report
          description: "Get a Google Analytics traffic summary. Returns sessions, bounce rate, and top pages. Use for marketing performance reviews."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The GA4 property ID."
            - name: date_range
              in: body
              type: string
              description: "Date range, e.g. last7days, last30days."
          call: ga.run-report
          with:
            property_id: "{{property_id}}"
            date_range: "{{date_range}}"
          outputParameters:
            - name: sessions
              type: number
              mapping: "$.rows[0].metricValues[0].value"
            - name: bounce_rate
              type: number
              mapping: "$.rows[0].metricValues[1].value"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST

When a HubSpot marketing lead reaches MQL status, creates a corresponding lead in Salesforce and notifies the sales team via Teams.

naftiko: "0.5"
info:
  label: "HubSpot Lead to Salesforce Sync"
  description: "When a HubSpot marketing lead reaches MQL status, creates a corresponding lead in Salesforce and notifies the sales team via Teams."
  tags:
    - marketing
    - hubspot
    - salesforce
    - microsoft-teams
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: marketing-sales
      port: 8080
      tools:
        - name: sync-mql-to-salesforce
          description: "Given a HubSpot contact ID for an MQL, create a Salesforce lead and notify the sales team in Teams."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "The HubSpot contact ID."
          steps:
            - name: get-contact
              type: call
              call: hubspot.get-contact
              with:
                contact_id: "{{contact_id}}"
            - name: create-lead
              type: call
              call: salesforce.create-lead
              with:
                first_name: "{{get-contact.firstname}}"
                last_name: "{{get-contact.lastname}}"
                email: "{{get-contact.email}}"
                company: "{{get-contact.company}}"
            - name: notify-sales
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_sales_channel_id"
                text: "New MQL from HubSpot: {{get-contact.firstname}} {{get-contact.lastname}} at {{get-contact.company}} | SF Lead: {{create-lead.id}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Publishes a new job opening from Workday recruiting to the John Deere LinkedIn company page, then syncs the LinkedIn post URL back to the Workday requisition record.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Publisher"
  description: "Publishes a new job opening from Workday recruiting to the John Deere LinkedIn company page, then syncs the LinkedIn post URL back to the Workday requisition record."
  tags:
    - hr
    - recruiting
    - linkedin
    - workday
    - social
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: publish-job-to-linkedin
          description: "Given a Workday job requisition ID, retrieve the job details and publish the opening to the John Deere LinkedIn company page. Write the LinkedIn post URL back to the Workday requisition."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID to publish."
          steps:
            - name: get-requisition
              type: call
              call: "workday.get-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: "linkedin.create-job-posting"
              with:
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
                company_id: "$secrets.linkedin_company_id"
            - name: update-requisition
              type: call
              call: "workday.update-job-requisition"
              with:
                requisition_id: "{{requisition_id}}"
                linkedin_post_url: "{{post-to-linkedin.post_url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
            - name: update-job-requisition
              method: PATCH
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST

Assigns a LinkedIn Learning course to an employee based on their Workday role, retrieves the assignment confirmation, and notifies the employee via Teams.

naftiko: "0.5"
info:
  label: "LinkedIn Learning Course Assignment"
  description: "Assigns a LinkedIn Learning course to an employee based on their Workday role, retrieves the assignment confirmation, and notifies the employee via Teams."
  tags:
    - hr
    - learning
    - linkedin
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-learning
      port: 8080
      tools:
        - name: assign-learning-course
          description: "Given a Workday worker ID and LinkedIn Learning course URN, assign the course and notify the employee in Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: course_urn
              in: body
              type: string
              description: "The LinkedIn Learning course URN."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: assign-course
              type: call
              call: linkedin.assign-course
              with:
                learner_email: "{{get-worker.work_email}}"
                course_urn: "{{course_urn}}"
            - name: notify-employee
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "You have been assigned a new LinkedIn Learning course. Please complete it by {{assign-course.due_date}}."
  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: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: learning-assignments
          path: "/learningAssignments"
          operations:
            - name: assign-course
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Checks a user Microsoft Outlook calendar for scheduling conflicts in a given time range, returning conflicting meeting subjects and times.

naftiko: "0.5"
info:
  label: "Microsoft Outlook Calendar Conflict Check"
  description: "Checks a user Microsoft Outlook calendar for scheduling conflicts in a given time range, returning conflicting meeting subjects and times."
  tags:
    - collaboration
    - microsoft-outlook
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: collab-scheduling
      port: 8080
      tools:
        - name: check-calendar-conflicts
          description: "Check a user Outlook calendar for conflicts in a time range. Returns conflicting meetings. Use for scheduling assistance."
          inputParameters:
            - name: user_upn
              in: body
              type: string
              description: "The user principal name (email)."
            - name: start_time
              in: body
              type: string
              description: "Start time in ISO 8601 format."
            - name: end_time
              in: body
              type: string
              description: "End time in ISO 8601 format."
          call: outlook.get-calendar-view
          with:
            user_upn: "{{user_upn}}"
            start: "{{start_time}}"
            end: "{{end_time}}"
          outputParameters:
            - name: events
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: calendar-view
          path: "/users/{{user_upn}}/calendarView?startDateTime={{start}}&endDateTime={{end}}"
          inputParameters:
            - name: user_upn
              in: path
            - name: start
              in: path
            - name: end
              in: path
          operations:
            - name: get-calendar-view
              method: GET

Posts a formatted notification message to a specified Microsoft Teams channel for alerting and communication workflows.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notification Sender"
  description: "Posts a formatted notification message to a specified Microsoft Teams channel for alerting and communication workflows."
  tags:
    - collaboration
    - microsoft-teams
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: collab-notify
      port: 8080
      tools:
        - name: send-teams-notification
          description: "Post a notification message to a Microsoft Teams channel. Use for alerting, status updates, and cross-team communication."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The Teams channel ID."
            - name: message
              in: body
              type: string
              description: "The message text to post."
          call: msteams.post-message
          with:
            channel_id: "{{channel_id}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the top 10 slowest transactions and error rates from New Relic for a specified application and posts a daily performance digest to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "New Relic Application Performance Digest"
  description: "Retrieves the top 10 slowest transactions and error rates from New Relic for a specified application and posts a daily performance digest to the engineering Microsoft Teams channel."
  tags:
    - observability
    - new-relic
    - microsoft-teams
    - reporting
    - performance
capability:
  exposes:
    - type: mcp
      namespace: apm-reporting
      port: 8080
      tools:
        - name: digest-app-performance
          description: "Given a New Relic application ID, retrieve the slowest transactions and error rate over the past 24 hours and post a performance digest to the engineering Teams channel."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "The New Relic application ID to report on."
            - name: app_name
              in: body
              type: string
              description: "Human-readable application name for the Teams message."
          steps:
            - name: get-transactions
              type: call
              call: "newrelic.get-slow-transactions"
              with:
                app_id: "{{app_id}}"
            - name: get-error-rate
              type: call
              call: "newrelic-metrics.get-error-rate"
              with:
                app_id: "{{app_id}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_engineering_channel_id"
                text: "Performance Digest: {{app_name}} | Error rate: {{get-error-rate.value}} | Slowest transaction: {{get-transactions.top_transaction}} ({{get-transactions.top_duration_ms}}ms)"
  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: transactions
          path: "/applications/{{app_id}}/transactions.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-slow-transactions
              method: GET
    - type: http
      namespace: newrelic-metrics
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "X-Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/applications/{{app_id}}/metrics/data.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-error-rate
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries New Relic for the current error rate of an application, returning error count, throughput, and response time for the last 30 minutes.

naftiko: "0.5"
info:
  label: "New Relic Error Rate Check"
  description: "Queries New Relic for the current error rate of an application, returning error count, throughput, and response time for the last 30 minutes."
  tags:
    - observability
    - new-relic
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-error-rate
          description: "Check the current error rate for an application in New Relic. Returns error count, throughput, and response time for the last 30 minutes."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "The New Relic application name."
          call: newrelic.get-app-metrics
          with:
            app_name: "{{app_name}}"
          outputParameters:
            - name: error_rate
              type: number
              mapping: "$.application_summary.error_rate"
            - name: throughput
              type: number
              mapping: "$.application_summary.throughput"
  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?filter[name]={{app_name}}"
          inputParameters:
            - name: app_name
              in: path
          operations:
            - name: get-app-metrics
              method: GET

Retrieves a pending supplier invoice from Oracle E-Business Suite, validates the PO match, and posts the approval request to the finance approver via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Invoice Processing"
  description: "Retrieves a pending supplier invoice from Oracle E-Business Suite, validates the PO match, and posts the approval request to the finance approver via Microsoft Teams."
  tags:
    - finance
    - erp
    - oracle
    - microsoft-teams
    - invoice-processing
    - approval
capability:
  exposes:
    - type: mcp
      namespace: ap-finance
      port: 8080
      tools:
        - name: process-oracle-invoice
          description: "Given an Oracle EBS invoice ID, retrieve invoice details, validate against the linked purchase order, and route the invoice approval notification to the finance approver via Teams."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Oracle EBS invoice ID to process."
            - name: approver_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the finance approver."
          steps:
            - name: get-invoice
              type: call
              call: "oracle-ebs.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Invoice approval required: ID {{invoice_id}} | Supplier: {{get-invoice.vendor_name}} | Amount: {{get-invoice.amount}} {{get-invoice.currency}} | Due: {{get-invoice.due_date}}"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://johndeere-ebs.oracle.com/webservices/rest/apex"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: invoices
          path: "/apInvoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the payment status of an invoice from Oracle E-Business Suite, including approval state, payment date, and hold reasons.

naftiko: "0.5"
info:
  label: "Oracle EBS Invoice Status Check"
  description: "Retrieves the payment status of an invoice from Oracle E-Business Suite, including approval state, payment date, and hold reasons."
  tags:
    - finance
    - oracle
    - erp
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: get-invoice-status
          description: "Look up an Oracle EBS invoice by number. Returns approval state, payment date, and any hold reasons. Use for accounts payable inquiries."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The Oracle EBS invoice number."
          call: oracle-ebs.get-invoice
          with:
            invoice_number: "{{invoice_number}}"
          outputParameters:
            - name: approval_status
              type: string
              mapping: "$.approvalStatus"
            - name: payment_date
              type: string
              mapping: "$.paymentDate"
            - name: hold_reason
              type: string
              mapping: "$.holdReason"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://johndeere-ebs.oracle.com/webservices/rest/ap"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_number}}"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET

Retrieves a specific firewall security rule from Palo Alto Networks Panorama, returning source zones, destination zones, and action.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall Rule Lookup"
  description: "Retrieves a specific firewall security rule from Palo Alto Networks Panorama, returning source zones, destination zones, and action."
  tags:
    - security
    - palo-alto-networks
    - firewall
    - network
capability:
  exposes:
    - type: mcp
      namespace: security-network
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Look up a Palo Alto Networks firewall rule by name. Returns source zones, destination zones, applications, and action. Use for security policy reviews."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "The firewall rule name."
          call: paloalto.get-security-rule
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: source_zone
              type: array
              mapping: "$.result.entry.from.member"
            - name: destination_zone
              type: array
              mapping: "$.result.entry.to.member"
            - name: action
              type: string
              mapping: "$.result.entry.action"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://johndeere-panorama.paloaltonetworks.com/restapi/v10.2"
      authentication:
        type: apikey
        key: "X-PAN-KEY"
        value: "$secrets.paloalto_api_key"
        placement: header
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?name={{rule_name}}"
          inputParameters:
            - name: rule_name
              in: path
          operations:
            - name: get-security-rule
              method: GET

Retrieves the current security policy ruleset from Palo Alto Networks, checks for overly permissive rules, and creates a ServiceNow security task for remediation review.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Security Policy Audit"
  description: "Retrieves the current security policy ruleset from Palo Alto Networks, checks for overly permissive rules, and creates a ServiceNow security task for remediation review."
  tags:
    - security
    - identity
    - palo-alto-networks
    - servicenow
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: network-security
      port: 8080
      tools:
        - name: audit-firewall-policies
          description: "Given a Palo Alto Networks device hostname, retrieve security policy rules, flag any permit-all or overly broad rules, and create a ServiceNow remediation task."
          inputParameters:
            - name: device_hostname
              in: body
              type: string
              description: "The Palo Alto Networks firewall hostname or IP."
            - name: vsys
              in: body
              type: string
              description: "The virtual system name to audit (e.g., vsys1)."
          steps:
            - name: get-security-rules
              type: call
              call: "paloalto.get-security-rules"
              with:
                vsys: "{{vsys}}"
            - name: create-audit-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Firewall policy audit: {{device_hostname}} / {{vsys}}"
                category: "security"
                assigned_group: "Network_Security"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://{{device_hostname}}/restapi/v10.1"
      authentication:
        type: apikey
        key: "X-PAN-KEY"
        value: "$secrets.paloalto_api_key"
        placement: header
      resources:
        - name: security-rules
          path: "/Objects/SecurityRules"
          operations:
            - name: get-security-rules
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Returns current headcount by department and cost center from ADP, filtered by business unit for workforce planning.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Returns current headcount by department and cost center from ADP, filtered by business unit for workforce planning."
  tags:
    - hr
    - payroll
    - headcount
    - adp
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns a list of active employees grouped by department and cost center from ADP. Use for headcount planning, budget forecasting, and labor cost analysis."
          call: "adp.headcount-export"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.rows"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.employee_id"
                - name: full_name
                  type: string
                  mapping: "$.full_name"
                - name: department
                  type: string
                  mapping: "$.department"
                - name: cost_center
                  type: string
                  mapping: "$.cost_center"
                - name: employment_type
                  type: string
                  mapping: "$.employment_type"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: workers
          path: "/hr/v2/workers/export"
          operations:
            - name: headcount-export
              method: GET
              outputRawFormat: csv

Checks the latest refresh status of a Power BI dataset and returns completion time, status, and any error messages.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the latest refresh status of a Power BI dataset and returns completion time, status, and any error messages."
  tags:
    - analytics
    - power-bi
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: analytics-ops
      port: 8080
      tools:
        - name: get-dataset-refresh-status
          description: "Check the latest Power BI dataset refresh status. Returns completion time, status, and error messages. Use for BI operations monitoring."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
          call: powerbi.get-refresh-history
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: end_time
              type: string
              mapping: "$.value[0].endTime"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Generates a secure Power BI embed token for a specified report and workspace, enabling downstream applications to embed live analytics dashboards.

naftiko: "0.5"
info:
  label: "Power BI Report Embed Link Generator"
  description: "Generates a secure Power BI embed token for a specified report and workspace, enabling downstream applications to embed live analytics dashboards."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: get-powerbi-embed-token
          description: "Given a Power BI workspace ID and report ID, return a short-lived embed token for embedding the report in a portal or application."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID containing the report."
            - name: report_id
              in: body
              type: string
              description: "The Power BI report ID to embed."
          call: "powerbi.generate-embed-token"
          with:
            workspace_id: "{{workspace_id}}"
            report_id: "{{report_id}}"
          outputParameters:
            - name: embed_token
              type: string
              mapping: "$.token"
            - name: embed_url
              type: string
              mapping: "$.embedUrl"
            - name: expiration
              type: string
              mapping: "$.expiration"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: embed-token
          path: "/groups/{{workspace_id}}/reports/{{report_id}}/GenerateToken"
          inputParameters:
            - name: workspace_id
              in: path
            - name: report_id
              in: path
          operations:
            - name: generate-embed-token
              method: POST

Pulls precision agriculture telemetry data from the John Deere Operations Center API and loads it into Snowflake for agronomic analytics and yield forecasting.

naftiko: "0.5"
info:
  label: "Precision Ag Field Data Sync to Snowflake"
  description: "Pulls precision agriculture telemetry data from the John Deere Operations Center API and loads it into Snowflake for agronomic analytics and yield forecasting."
  tags:
    - precision-agriculture
    - data-engineering
    - snowflake
    - iot
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: ag-data
      port: 8080
      tools:
        - name: sync-field-data
          description: "Given a field ID and date range, pull precision ag telemetry from Operations Center and load into Snowflake for analytics."
          inputParameters:
            - name: field_id
              in: body
              type: string
              description: "The Operations Center field ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-telemetry
              type: call
              call: ops-center.get-field-data
              with:
                field_id: "{{field_id}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: load-to-snowflake
              type: call
              call: snowflake.insert-rows
              with:
                table: "PRECISION_AG.FIELD_TELEMETRY"
                data: "{{get-telemetry.records}}"
  consumes:
    - type: http
      namespace: ops-center
      baseUri: "https://partnerapi.deere.com/platform"
      authentication:
        type: oauth2
        tokenUrl: "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/token"
        clientId: "$secrets.deere_client_id"
        clientSecret: "$secrets.deere_client_secret"
      resources:
        - name: field-data
          path: "/fields/{{field_id}}/measurements?start={{start}}&end={{end}}"
          inputParameters:
            - name: field_id
              in: path
            - name: start
              in: path
            - name: end
              in: path
          operations:
            - name: get-field-data
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://johndeere.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-rows
              method: POST

Monitors telemetry data from John Deere field equipment streamed via Azure, detects anomalies using Azure Machine Learning, and creates a ServiceNow field service ticket.

naftiko: "0.5"
info:
  label: "Precision Agriculture Telemetry Anomaly Alert"
  description: "Monitors telemetry data from John Deere field equipment streamed via Azure, detects anomalies using Azure Machine Learning, and creates a ServiceNow field service ticket."
  tags:
    - manufacturing
    - iot
    - azure
    - azure-machine-learning
    - servicenow
    - precision-agriculture
capability:
  exposes:
    - type: mcp
      namespace: iot-ops
      port: 8080
      tools:
        - name: handle-equipment-anomaly
          description: "Given a telemetry anomaly event from field equipment (serial number, sensor type, anomaly score), create a ServiceNow field service ticket and notify the service operations team."
          inputParameters:
            - name: equipment_serial
              in: body
              type: string
              description: "The serial number of the John Deere equipment reporting the anomaly."
            - name: sensor_type
              in: body
              type: string
              description: "The type of sensor that detected the anomaly (e.g., engine_temp, fuel_pressure)."
            - name: anomaly_score
              in: body
              type: number
              description: "The anomaly detection score from Azure Machine Learning (0-1 scale)."
          steps:
            - name: create-field-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Equipment anomaly: {{equipment_serial}} / {{sensor_type}}"
                category: "field_service"
                urgency: "2"
            - name: notify-service-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_service_ops_channel_id"
                text: "Equipment Alert: {{equipment_serial}} | Sensor: {{sensor_type}} | Anomaly Score: {{anomaly_score}} | Ticket: {{create-field-ticket.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Returns a structured summary of a Salesforce account including open opportunities, recent activities, and contact list for use in customer meeting preparation.

naftiko: "0.5"
info:
  label: "Salesforce Account Snapshot"
  description: "Returns a structured summary of a Salesforce account including open opportunities, recent activities, and contact list for use in customer meeting preparation."
  tags:
    - sales
    - crm
    - salesforce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: get-account-snapshot
          description: "Given a Salesforce account ID, return open opportunities, recent activities, and primary contacts. Use before customer meetings or for account review."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID to summarize."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: account_name
              type: string
              mapping: "$.Name"
            - name: annual_revenue
              type: number
              mapping: "$.AnnualRevenue"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Retrieves a Salesforce campaign performance summary including number of leads, converted opportunities, total value, and ROI percentage.

naftiko: "0.5"
info:
  label: "Salesforce Campaign ROI Report"
  description: "Retrieves a Salesforce campaign performance summary including number of leads, converted opportunities, total value, and ROI percentage."
  tags:
    - marketing
    - salesforce
    - analytics
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: get-campaign-roi
          description: "Look up a Salesforce campaign by ID. Returns leads generated, converted opportunities, total value, and ROI. Use for marketing performance reviews."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Salesforce campaign ID."
          call: salesforce.get-campaign
          with:
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: leads
              type: number
              mapping: "$.NumberOfLeads"
            - name: converted_leads
              type: number
              mapping: "$.NumberOfConvertedLeads"
            - name: total_value
              type: number
              mapping: "$.AmountAllOpportunities"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET

Retrieves a Salesforce support case by case number and returns status, priority, account name, and last activity date.

naftiko: "0.5"
info:
  label: "Salesforce Case Lookup"
  description: "Retrieves a Salesforce support case by case number and returns status, priority, account name, and last activity date."
  tags:
    - customer-service
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm-support
      port: 8080
      tools:
        - name: get-case
          description: "Look up a Salesforce case by case number. Returns status, priority, account name, and last activity date. Use for customer support inquiries."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The Salesforce case number."
          call: salesforce.get-case
          with:
            case_number: "{{case_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status"
            - name: priority
              type: string
              mapping: "$.Priority"
            - name: account_name
              type: string
              mapping: "$.Account.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_number}}"
          inputParameters:
            - name: case_number
              in: path
          operations:
            - name: get-case
              method: GET

Retrieves a Salesforce contact record by email address, returning full name, title, account name, and phone number.

naftiko: "0.5"
info:
  label: "Salesforce Contact Lookup"
  description: "Retrieves a Salesforce contact record by email address, returning full name, title, account name, and phone number."
  tags:
    - sales
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm-contacts
      port: 8080
      tools:
        - name: get-contact-by-email
          description: "Look up a Salesforce contact by email address. Returns full name, title, account name, and phone number. Use for sales prep and customer identification."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The contact email address."
          call: salesforce.query-contact
          with:
            email: "{{email}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.records[0].Name"
            - name: title
              type: string
              mapping: "$.records[0].Title"
            - name: account_name
              type: string
              mapping: "$.records[0].Account.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query?q=SELECT+Name,Title,Phone,Account.Name+FROM+Contact+WHERE+Email='{{email}}'"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: query-contact
              method: GET

When a Salesforce opportunity is won, creates a new customer master record in SAP S/4HANA and updates the Salesforce account with the SAP customer number.

naftiko: "0.5"
info:
  label: "Salesforce Deal Registration to SAP Customer Creation"
  description: "When a Salesforce opportunity is won, creates a new customer master record in SAP S/4HANA and updates the Salesforce account with the SAP customer number."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap
    - sync
capability:
  exposes:
    - type: mcp
      namespace: sales-erp-sync
      port: 8080
      tools:
        - name: create-sap-customer-from-deal
          description: "Given a Salesforce opportunity ID for a won deal, create a SAP customer master record and update Salesforce with the SAP customer number."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-customer
              type: call
              call: sap.create-business-partner
              with:
                company_name: "{{get-opportunity.account_name}}"
                country: "{{get-opportunity.billing_country}}"
                industry: "{{get-opportunity.industry}}"
            - name: update-account
              type: call
              call: salesforce.update-account
              with:
                account_id: "{{get-opportunity.account_id}}"
                sap_customer_number: "{{create-customer.business_partner_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.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
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: business-partners
          path: "/A_BusinessPartner"
          operations:
            - name: create-business-partner
              method: POST

Generates a dealer performance scorecard from Salesforce data including revenue, customer satisfaction score, and parts order fill rate, then posts to the dealer management Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Dealer Performance Scorecard"
  description: "Generates a dealer performance scorecard from Salesforce data including revenue, customer satisfaction score, and parts order fill rate, then posts to the dealer management Teams channel."
  tags:
    - sales
    - salesforce
    - dealer-management
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: dealer-ops
      port: 8080
      tools:
        - name: generate-dealer-scorecard
          description: "Given a Salesforce dealer account ID, generate a performance scorecard and post it to the dealer management Teams channel."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce dealer account ID."
          steps:
            - name: get-dealer-data
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-dealer-metrics
              type: call
              call: salesforce.query-dealer-kpis
              with:
                account_id: "{{account_id}}"
            - name: post-scorecard
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_dealer_channel_id"
                text: "Dealer Scorecard: {{get-dealer-data.name}} | Revenue: ${{get-dealer-metrics.revenue}} | CSAT: {{get-dealer-metrics.csat}} | Fill Rate: {{get-dealer-metrics.fill_rate}}%"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
        - name: kpis
          path: "/query?q=SELECT+SUM(Amount)+revenue,AVG(CSAT__c)+csat+FROM+Opportunity+WHERE+AccountId='{{account_id}}'"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: query-dealer-kpis
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

When a new lead is created in Salesforce, enriches the record with firmographic and contact data from ZoomInfo, then updates the Salesforce lead with the enriched fields.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment with ZoomInfo"
  description: "When a new lead is created in Salesforce, enriches the record with firmographic and contact data from ZoomInfo, then updates the Salesforce lead with the enriched fields."
  tags:
    - sales
    - crm
    - salesforce
    - zoominfo
    - enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-salesforce-lead
          description: "Given a Salesforce lead ID, look up the contact in ZoomInfo by email and company name, then write enriched firmographic data back to the Salesforce lead record."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to enrich."
          steps:
            - name: get-lead
              type: call
              call: "salesforce.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: lookup-zoominfo
              type: call
              call: "zoominfo.search-contact"
              with:
                email: "{{get-lead.email}}"
                company_name: "{{get-lead.company}}"
            - name: update-lead
              type: call
              call: "salesforce-update.update-lead"
              with:
                lead_id: "{{lead_id}}"
                annual_revenue: "{{lookup-zoominfo.annual_revenue}}"
                employee_count: "{{lookup-zoominfo.employee_count}}"
                industry: "{{lookup-zoominfo.industry}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.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: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contacts
          path: "/contact"
          operations:
            - name: search-contact
              method: POST
    - type: http
      namespace: salesforce-update
      baseUri: "https://johndeere.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: update-lead
              method: PATCH

When a Salesforce opportunity reaches Commit stage, creates a corresponding SAP S/4HANA sales quote and updates the Salesforce opportunity with the SAP document number.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Quote Sync"
  description: "When a Salesforce opportunity reaches Commit stage, creates a corresponding SAP S/4HANA sales quote and updates the Salesforce opportunity with the SAP document number."
  tags:
    - sales
    - crm
    - erp
    - salesforce
    - sap
    - sync
capability:
  exposes:
    - type: mcp
      namespace: sales-erp-sync
      port: 8080
      tools:
        - name: sync-opportunity-to-sap
          description: "Given a Salesforce opportunity ID at Commit stage, create a SAP sales quote and write the SAP document number back to Salesforce. Use when a deal is confirmed and needs to flow into order management."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID to sync into SAP."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce-read.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sap-quote
              type: call
              call: "sap-sd.create-sales-quote"
              with:
                customer_id: "{{get-opportunity.account_external_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency_code}}"
                close_date: "{{get-opportunity.close_date}}"
            - name: update-opportunity
              type: call
              call: "salesforce-write.update-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
                sap_quote_number: "{{create-sap-quote.document_number}}"
  consumes:
    - type: http
      namespace: salesforce-read
      baseUri: "https://johndeere.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: sap-sd
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/SD_SLS_QUOTATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: quotations
          path: "/A_SalesQuotation"
          operations:
            - name: create-sales-quote
              method: POST
    - type: http
      namespace: salesforce-write
      baseUri: "https://johndeere.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: update-opportunity
              method: PATCH

Extracts quarterly sales pipeline data from Salesforce, transforms it, and pushes to a Power BI dataset for executive reporting.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Pipeline Report to Power BI"
  description: "Extracts quarterly sales pipeline data from Salesforce, transforms it, and pushes to a Power BI dataset for executive reporting."
  tags:
    - sales
    - salesforce
    - power-bi
    - analytics
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-analytics
      port: 8080
      tools:
        - name: sync-pipeline-to-powerbi
          description: "Extract quarterly pipeline data from Salesforce and push to Power BI for executive dashboard reporting."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter in YYYY-Q format, e.g. 2026-Q1."
          steps:
            - name: get-pipeline
              type: call
              call: salesforce.query-pipeline
              with:
                quarter: "{{fiscal_quarter}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                dataset_id: "$secrets.powerbi_pipeline_dataset_id"
                table_name: "PipelineData"
                rows: "{{get-pipeline.records}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query?q=SELECT+Name,Amount,StageName,CloseDate+FROM+Opportunity+WHERE+FiscalQuarter='{{quarter}}'"
          inputParameters:
            - name: quarter
              in: path
          operations:
            - name: query-pipeline
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: push-datasets
          path: "/datasets/{{dataset_id}}/tables/{{table_name}}/rows"
          inputParameters:
            - name: dataset_id
              in: path
            - name: table_name
              in: path
          operations:
            - name: push-rows
              method: POST

When a Salesforce Service Cloud case exceeds its SLA threshold, creates a ServiceNow escalation incident and sends a priority alert to the customer success Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Service Case Escalation"
  description: "When a Salesforce Service Cloud case exceeds its SLA threshold, creates a ServiceNow escalation incident and sends a priority alert to the customer success Microsoft Teams channel."
  tags:
    - customer-support
    - salesforce
    - servicenow
    - microsoft-teams
    - sla
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: customer-support-ops
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given a Salesforce case ID that has breached SLA, create a ServiceNow escalation incident and notify the customer success Teams channel with case context."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce Service Cloud case ID that breached SLA."
            - name: hours_overdue
              in: body
              type: number
              description: "Number of hours the case is past its SLA deadline."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-escalation
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "SLA breach escalation: Salesforce case {{case_id}}"
                category: "customer_support"
                urgency: "1"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_customer_success_channel_id"
                text: "SLA Breach: Case {{case_id}} | Customer: {{get-case.account_name}} | Subject: {{get-case.subject}} | {{hours_overdue}}h overdue | Incident: {{create-escalation.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks SAP Ariba for contracts expiring within 90 days, creates a ServiceNow task for procurement review, and notifies the procurement channel in Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Renewal Alert"
  description: "Checks SAP Ariba for contracts expiring within 90 days, creates a ServiceNow task for procurement review, and notifies the procurement channel in Teams."
  tags:
    - procurement
    - sap-ariba
    - servicenow
    - microsoft-teams
    - contract-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-contracts
      port: 8080
      tools:
        - name: alert-expiring-contracts
          description: "Query SAP Ariba for contracts expiring soon, create ServiceNow review tasks, and alert the procurement team in Teams."
          inputParameters:
            - name: days_until_expiry
              in: body
              type: number
              description: "Number of days to look ahead for expiring contracts."
          steps:
            - name: get-expiring
              type: call
              call: ariba.get-expiring-contracts
              with:
                days: "{{days_until_expiry}}"
            - name: create-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Contract renewal review: {{get-expiring.contract_count}} contracts expiring within {{days_until_expiry}} days"
                category: "procurement"
                assigned_group: "Procurement_Contracts"
            - name: notify-procurement
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "Contract Alert: {{get-expiring.contract_count}} SAP Ariba contracts expiring within {{days_until_expiry}} days | Task: {{create-task.number}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/procurement-reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts?expiringWithinDays={{days}}"
          inputParameters:
            - name: days
              in: path
          operations:
            - name: get-expiring-contracts
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the status of a SAP Ariba sourcing event, returning bid count, event stage, and deadline for procurement sourcing reviews.

naftiko: "0.5"
info:
  label: "SAP Ariba Sourcing Event Status"
  description: "Retrieves the status of a SAP Ariba sourcing event, returning bid count, event stage, and deadline for procurement sourcing reviews."
  tags:
    - procurement
    - sap-ariba
    - sourcing
capability:
  exposes:
    - type: mcp
      namespace: procurement-sourcing
      port: 8080
      tools:
        - name: get-sourcing-event
          description: "Look up a SAP Ariba sourcing event by ID. Returns bid count, event stage, and deadline. Use for sourcing status checks."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The Ariba sourcing event ID."
          call: ariba.get-sourcing-event
          with:
            event_id: "{{event_id}}"
          outputParameters:
            - name: stage
              type: string
              mapping: "$.status"
            - name: bid_count
              type: number
              mapping: "$.bidCount"
            - name: deadline
              type: string
              mapping: "$.closingDate"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing-reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: events
          path: "/sourcingEvents/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-sourcing-event
              method: GET

When a new supplier is approved in SAP Ariba, creates the supplier master record in SAP S/4HANA and notifies the procurement team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "When a new supplier is approved in SAP Ariba, creates the supplier master record in SAP S/4HANA and notifies the procurement team in Microsoft Teams."
  tags:
    - procurement
    - sap-ariba
    - sap
    - microsoft-teams
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given a SAP Ariba supplier ID, retrieve the approved supplier profile and create the vendor master record in SAP S/4HANA, then notify procurement via Teams."
          inputParameters:
            - name: ariba_supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID for the newly approved supplier."
          steps:
            - name: get-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{ariba_supplier_id}}"
            - name: create-vendor
              type: call
              call: "sap.create-vendor"
              with:
                vendor_name: "{{get-supplier.name}}"
                tax_id: "{{get-supplier.tax_id}}"
                country: "{{get-supplier.country}}"
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_procurement_channel_id"
                text: "New supplier onboarded: {{get-supplier.name}} (Ariba ID: {{ariba_supplier_id}}, SAP Vendor: {{create-vendor.vendor_id}})"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-profile/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an expense report is submitted in SAP Concur, retrieves the report details, validates against Workday cost center data, and routes approval notifications via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "When an expense report is submitted in SAP Concur, retrieves the report details, validates against Workday cost center data, and routes approval notifications via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - workday
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: process-expense-report
          description: "Given a SAP Concur expense report ID, validate cost center against Workday, then route approval notification to the approver via Microsoft Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID to process."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: validate-cost-center
              type: call
              call: "workday.get-cost-center"
              with:
                cost_center_id: "{{get-report.cost_center_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-report.approver_email}}"
                text: "Expense report {{report_id}} from {{get-report.submitter_name}} ({{get-report.total_amount}} {{get-report.currency}}) is pending your approval in SAP Concur."
  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/reportdetails/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: cost-centers
          path: "/costCenters/{{cost_center_id}}"
          inputParameters:
            - name: cost_center_id
              in: path
          operations:
            - name: get-cost-center
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a SAP Concur travel request and checks it against corporate travel policy, flagging out-of-policy bookings and notifying the traveler via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Booking Compliance Check"
  description: "Retrieves a SAP Concur travel request and checks it against corporate travel policy, flagging out-of-policy bookings and notifying the traveler via Teams."
  tags:
    - travel
    - sap-concur
    - compliance
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: travel-compliance
      port: 8080
      tools:
        - name: check-travel-compliance
          description: "Given a Concur travel request ID, check policy compliance and notify the traveler of any out-of-policy flags."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The SAP Concur travel request ID."
          steps:
            - name: get-request
              type: call
              call: concur.get-travel-request
              with:
                request_id: "{{request_id}}"
            - name: notify-traveler
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-request.traveler_email}}"
                text: "Travel Request {{request_id}}: {{get-request.trip_name}} | Policy Status: {{get-request.policy_status}} | Total: ${{get-request.total_amount}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: travel-requests
          path: "/travelrequest/requests/{{request_id}}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-travel-request
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the budget vs actual spend for a SAP cost center, returning planned budget, actual spend, committed amount, and variance.

naftiko: "0.5"
info:
  label: "SAP Cost Center Budget Check"
  description: "Retrieves the budget vs actual spend for a SAP cost center, returning planned budget, actual spend, committed amount, and variance."
  tags:
    - finance
    - sap
    - erp
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: finance-budget
      port: 8080
      tools:
        - name: get-budget-status
          description: "Look up budget vs actual for a SAP cost center. Returns planned budget, actual spend, and variance. Use for budget reviews."
          inputParameters:
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center code."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year in YYYY format."
          call: sap.get-cost-center-budget
          with:
            cost_center: "{{cost_center}}"
            fiscal_year: "{{fiscal_year}}"
          outputParameters:
            - name: planned_budget
              type: number
              mapping: "$.d.PlannedAmount"
            - name: actual_spend
              type: number
              mapping: "$.d.ActualAmount"
            - name: variance
              type: number
              mapping: "$.d.VarianceAmount"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_PLAN_ACTUAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenterBudget(CostCenter='{{cost_center}}',FiscalYear='{{fiscal_year}}')"
          inputParameters:
            - name: cost_center
              in: path
            - name: fiscal_year
              in: path
          operations:
            - name: get-cost-center-budget
              method: GET

Retrieves the status of an outbound delivery from SAP S/4HANA including shipping point, goods issue date, and tracking information.

naftiko: "0.5"
info:
  label: "SAP Delivery Note Status"
  description: "Retrieves the status of an outbound delivery from SAP S/4HANA including shipping point, goods issue date, and tracking information."
  tags:
    - logistics
    - sap
    - erp
    - shipping
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-delivery-status
          description: "Look up a SAP outbound delivery by number. Returns shipping point, goods issue date, and tracking info. Use for logistics tracking."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "The SAP delivery document number."
          call: sap.get-delivery
          with:
            delivery_number: "{{delivery_number}}"
          outputParameters:
            - name: shipping_point
              type: string
              mapping: "$.d.ShippingPoint"
            - name: goods_issue_date
              type: string
              mapping: "$.d.GoodsMovementDate"
            - name: status
              type: string
              mapping: "$.d.OverallSDProcessStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET

Checks whether a SAP financial posting period is open or closed for a given company code and fiscal year, returning the period status.

naftiko: "0.5"
info:
  label: "SAP Financial Posting Period Check"
  description: "Checks whether a SAP financial posting period is open or closed for a given company code and fiscal year, returning the period status."
  tags:
    - finance
    - sap
    - erp
    - accounting
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: check-posting-period
          description: "Check if a SAP posting period is open or closed. Returns period status for a company code. Use for period-end close activities."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "The SAP company code."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year in YYYY format."
            - name: period
              in: body
              type: string
              description: "The posting period number."
          call: sap.get-posting-period
          with:
            company_code: "{{company_code}}"
            fiscal_year: "{{fiscal_year}}"
            period: "{{period}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.PeriodStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: periods
          path: "/A_FinancialPeriodClose(CompanyCode='{{company_code}}',FiscalYear='{{fiscal_year}}',Period='{{period}}')"
          inputParameters:
            - name: company_code
              in: path
            - name: fiscal_year
              in: path
            - name: period
              in: path
          operations:
            - name: get-posting-period
              method: GET

Posts a goods receipt against a SAP purchase order, confirming delivery of materials to a plant and updating inventory records.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Posting"
  description: "Posts a goods receipt against a SAP purchase order, confirming delivery of materials to a plant and updating inventory records."
  tags:
    - supply-chain
    - sap
    - erp
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: post-goods-receipt
          description: "Post a goods receipt in SAP against a purchase order number. Updates inventory and triggers downstream invoice matching. Use for warehouse receiving workflows."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: plant
              in: body
              type: string
              description: "The receiving plant code."
            - name: quantity
              in: body
              type: number
              description: "Quantity received."
          call: sap.post-goods-receipt
          with:
            po_number: "{{po_number}}"
            plant: "{{plant}}"
            quantity: "{{quantity}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader"
          operations:
            - name: post-goods-receipt
              method: POST

Queries SAP S/4HANA for current stock levels of a material across plants, returning available quantity, unit of measure, and plant location.

naftiko: "0.5"
info:
  label: "SAP Inventory Stock Level Check"
  description: "Queries SAP S/4HANA for current stock levels of a material across plants, returning available quantity, unit of measure, and plant location."
  tags:
    - supply-chain
    - sap
    - erp
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-stock-level
          description: "Check current stock levels for a material in SAP. Returns available quantity, unit of measure, and plant location. Use for inventory planning and supply chain checks."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: sap.get-material-stock
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: available_quantity
              type: number
              mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
            - name: unit
              type: string
              mapping: "$.d.MaterialBaseUnit"
            - name: plant
              type: string
              mapping: "$.d.Plant"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-stock
          path: "/A_MatlStkInAcctMod(Material='{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material-stock
              method: GET

Given an SAP invoice number, retrieves invoice details from SAP, matches against payment records, and posts a reconciliation status update to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Invoice to Payment Reconciliation"
  description: "Given an SAP invoice number, retrieves invoice details from SAP, matches against payment records, and posts a reconciliation status update to the finance Teams channel."
  tags:
    - finance
    - sap
    - erp
    - accounts-payable
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-reconciliation
      port: 8080
      tools:
        - name: reconcile-invoice-payment
          description: "Given an SAP invoice number, retrieve invoice details, check payment status, and notify the finance channel in Teams with reconciliation results."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-payment
              type: call
              call: sap.get-payment-status
              with:
                invoice_number: "{{invoice_number}}"
            - name: notify-finance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Invoice {{invoice_number}} | Amount: {{get-invoice.amount}} {{get-invoice.currency}} | Payment Status: {{get-payment.status}} | Clearing Doc: {{get-payment.clearing_document}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: payments
          path: "/A_SupplierInvoice('{{invoice_number}}')/to_PaymentStatus"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-payment-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves material master data from SAP S/4HANA including description, material group, unit of measure, and gross weight.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA including description, material group, unit of measure, and gross weight."
  tags:
    - supply-chain
    - sap
    - erp
    - materials
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-material-master
          description: "Look up a material in SAP by material number. Returns description, material group, unit of measure, and gross weight."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialName"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
            - name: base_unit
              type: string
              mapping: "$.d.BaseUnit"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Creates a plant maintenance work order in SAP PM when equipment telemetry triggers a threshold alert, and notifies the maintenance team via Teams.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order Create"
  description: "Creates a plant maintenance work order in SAP PM when equipment telemetry triggers a threshold alert, and notifies the maintenance team via Teams."
  tags:
    - manufacturing
    - sap
    - erp
    - maintenance
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: maintenance-ops
      port: 8080
      tools:
        - name: create-maintenance-order
          description: "Given equipment ID and fault description, create a SAP PM work order and notify the maintenance team."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment number."
            - name: fault_description
              in: body
              type: string
              description: "Description of the equipment fault."
          steps:
            - name: create-order
              type: call
              call: sap.create-maintenance-order
              with:
                equipment: "{{equipment_id}}"
                description: "{{fault_description}}"
                order_type: "PM01"
            - name: notify-team
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_maintenance_channel_id"
                text: "Maintenance Order Created: {{create-order.order_number}} | Equipment: {{equipment_id}} | Fault: {{fault_description}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the status of a SAP production order, including planned quantity, confirmed quantity, and current operation phase.

naftiko: "0.5"
info:
  label: "SAP Production Order Status Check"
  description: "Retrieves the status of a SAP production order, including planned quantity, confirmed quantity, and current operation phase."
  tags:
    - manufacturing
    - sap
    - erp
    - production
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP production order. Returns planned quantity, confirmed quantity, and current operation phase. Use for manufacturing status tracking."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: sap.get-production-order
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: planned_qty
              type: number
              mapping: "$.d.TotalQuantity"
            - name: confirmed_qty
              type: number
              mapping: "$.d.ConfirmedYieldQuantity"
            - name: status
              type: string
              mapping: "$.d.ManufacturingOrderStatus"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDER_2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder_2('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement review."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, and open line items. Use for procurement status checks and spend analysis."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number to look up."
          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://johndeere-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 a quality inspection lot from SAP QM and returns the inspection result, usage decision, and defect count for manufacturing quality review.

naftiko: "0.5"
info:
  label: "SAP Quality Inspection Lot Result"
  description: "Retrieves a quality inspection lot from SAP QM and returns the inspection result, usage decision, and defect count for manufacturing quality review."
  tags:
    - manufacturing
    - sap
    - erp
    - quality
capability:
  exposes:
    - type: mcp
      namespace: quality-mgmt
      port: 8080
      tools:
        - name: get-inspection-result
          description: "Look up a SAP quality inspection lot. Returns inspection result, usage decision, and defect count. Use for quality management reviews."
          inputParameters:
            - name: inspection_lot
              in: body
              type: string
              description: "The SAP inspection lot number."
          call: sap.get-inspection-lot
          with:
            lot_number: "{{inspection_lot}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.d.InspectionResult"
            - name: usage_decision
              type: string
              mapping: "$.d.UsageDecision"
            - name: defect_count
              type: number
              mapping: "$.d.NumberOfDefects"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_INSPECTIONLOT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inspection-lots
          path: "/A_InspectionLot('{{lot_number}}')"
          inputParameters:
            - name: lot_number
              in: path
          operations:
            - name: get-inspection-lot
              method: GET

Retrieves the status of a SAP transport request including release status, target system, and owner for SAP Basis operations tracking.

naftiko: "0.5"
info:
  label: "SAP Transport Request Status"
  description: "Retrieves the status of a SAP transport request including release status, target system, and owner for SAP Basis operations tracking."
  tags:
    - devops
    - sap
    - erp
    - transport-management
capability:
  exposes:
    - type: mcp
      namespace: sap-basis
      port: 8080
      tools:
        - name: get-transport-status
          description: "Look up a SAP transport request. Returns release status, target system, and owner. Use for SAP Basis change tracking."
          inputParameters:
            - name: transport_number
              in: body
              type: string
              description: "The SAP transport request number."
          call: sap.get-transport
          with:
            transport: "{{transport_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.Status"
            - name: target_system
              type: string
              mapping: "$.d.TargetSystem"
            - name: owner
              type: string
              mapping: "$.d.Owner"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/TRANSPORT_REQUEST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: transports
          path: "/TransportRequests('{{transport}}')"
          inputParameters:
            - name: transport
              in: path
          operations:
            - name: get-transport
              method: GET

Retrieves vendor master data from SAP S/4HANA including company name, payment terms, bank details, and tax classification.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP S/4HANA including company name, payment terms, bank details, and tax classification."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-vendor-master
          description: "Look up a vendor in SAP by vendor number. Returns company name, payment terms, bank details, and tax classification. Use for vendor verification and payment inquiries."
          inputParameters:
            - name: vendor_number
              in: body
              type: string
              description: "The SAP vendor number to look up."
          call: sap.get-vendor
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: company_name
              type: string
              mapping: "$.d.CompanyName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: tax_number
              type: string
              mapping: "$.d.TaxNumber1"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_Supplier('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Retrieves a ServiceNow CMDB configuration item by asset tag, returning serial number, assigned user, location, and lifecycle status.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Inventory Lookup"
  description: "Retrieves a ServiceNow CMDB configuration item by asset tag, returning serial number, assigned user, location, and lifecycle status."
  tags:
    - it-ops
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: it-assets
      port: 8080
      tools:
        - name: get-asset
          description: "Look up a ServiceNow CMDB asset by tag. Returns serial number, assigned user, location, and status. Use for IT asset management."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "The asset tag or CI name."
          call: servicenow.get-ci
          with:
            asset_tag: "{{asset_tag}}"
          outputParameters:
            - name: serial_number
              type: string
              mapping: "$.result.serial_number"
            - name: assigned_to
              type: string
              mapping: "$.result.assigned_to.display_value"
            - name: location
              type: string
              mapping: "$.result.location.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: path
          operations:
            - name: get-ci
              method: GET

Creates and routes a ServiceNow change request for infrastructure modifications, attaches approval notifications to the change owner via Microsoft Teams, and tracks approval state.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Workflow"
  description: "Creates and routes a ServiceNow change request for infrastructure modifications, attaches approval notifications to the change owner via Microsoft Teams, and tracks approval state."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: itsm-change
      port: 8080
      tools:
        - name: open-change-request
          description: "Given a change description, affected CI, and risk level, create a ServiceNow change request and notify the change owner and CAB approver via Microsoft Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the proposed infrastructure or configuration change."
            - name: affected_ci
              in: body
              type: string
              description: "The configuration item (system or service) being changed."
            - name: risk_level
              in: body
              type: string
              description: "Risk level: low, medium, or high."
            - name: owner_upn
              in: body
              type: string
              description: "Microsoft Teams UPN of the change owner."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "{{change_description}}"
                cmdb_ci: "{{affected_ci}}"
                risk: "{{risk_level}}"
            - name: notify-owner
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{owner_upn}}"
                text: "Change request {{create-change.number}} opened for {{affected_ci}} (risk: {{risk_level}}). Please review in ServiceNow."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.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-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a ServiceNow incident by number and returns its priority, state, assigned group, and short description for IT operations visibility.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number and returns its priority, state, assigned group, and short description for IT operations visibility."
  tags:
    - it-ops
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns priority, state, assigned group, and short description. Use for IT support status checks."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number, e.g. INC0012345."
          call: servicenow.get-incident
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.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

Searches the ServiceNow knowledge base for articles matching a query and returns article title, number, and snippet for IT self-service.

naftiko: "0.5"
info:
  label: "ServiceNow Knowledge Article Search"
  description: "Searches the ServiceNow knowledge base for articles matching a query and returns article title, number, and snippet for IT self-service."
  tags:
    - it-ops
    - servicenow
    - knowledge-management
capability:
  exposes:
    - type: mcp
      namespace: it-selfservice
      port: 8080
      tools:
        - name: search-knowledge-base
          description: "Search ServiceNow knowledge base by keyword. Returns article title, number, and snippet. Use for IT self-service and agent assist."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search keyword or phrase."
          call: servicenow.search-kb
          with:
            query: "{{query}}"
          outputParameters:
            - name: articles
              type: array
              mapping: "$.result"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: knowledge
          path: "/table/kb_knowledge?sysparm_query=short_descriptionLIKE{{query}}&sysparm_limit=10"
          inputParameters:
            - name: query
              in: path
          operations:
            - name: search-kb
              method: GET

When a P1 incident is created in ServiceNow, pages the on-call engineer via PagerDuty, creates a Teams bridge channel, and posts incident details.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge Launcher"
  description: "When a P1 incident is created in ServiceNow, pages the on-call engineer via PagerDuty, creates a Teams bridge channel, and posts incident details."
  tags:
    - it-ops
    - incident-management
    - servicenow
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: launch-incident-bridge
          description: "Given a ServiceNow P1 incident number, page the on-call via PagerDuty, create a Teams bridge channel, and post incident details."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{get-incident.service_id}}"
                title: "P1: {{get-incident.short_description}}"
            - name: post-bridge
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_incident_channel_id"
                text: "P1 Bridge: {{incident_number}} | {{get-incident.short_description}} | PagerDuty: {{page-oncall.incident_key}} | Assigned: {{get-incident.assigned_to}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://johndeere.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Searches a SharePoint site for documents matching a keyword and returns file name, author, modified date, and download link.

naftiko: "0.5"
info:
  label: "SharePoint Document Lookup"
  description: "Searches a SharePoint site for documents matching a keyword and returns file name, author, modified date, and download link."
  tags:
    - collaboration
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: collab-docs
      port: 8080
      tools:
        - name: search-documents
          description: "Search a SharePoint site for documents by keyword. Returns file name, author, modified date, and download link. Use for document discovery and knowledge management."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: query
              in: body
              type: string
              description: "Search keyword or phrase."
          call: sharepoint.search-files
          with:
            site_id: "{{site_id}}"
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/{{site_id}}/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: site_id
              in: path
            - name: query
              in: path
          operations:
            - name: search-files
              method: GET

Queries SolarWinds for network devices in a warning or critical state, correlates with open ServiceNow incidents, and posts a network health digest to the IT operations Teams channel.

naftiko: "0.5"
info:
  label: "SolarWinds Network Device Health Check"
  description: "Queries SolarWinds for network devices in a warning or critical state, correlates with open ServiceNow incidents, and posts a network health digest to the IT operations Teams channel."
  tags:
    - observability
    - network
    - solarwinds
    - servicenow
    - microsoft-teams
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: digest-network-health
          description: "Retrieve all SolarWinds nodes in warning or critical state, check for existing ServiceNow incidents, and post a network health digest to the IT operations Teams channel."
          inputParameters:
            - name: site_filter
              in: body
              type: string
              description: "Optional site or location filter to scope the health check (e.g., Moline-HQ)."
          steps:
            - name: get-unhealthy-nodes
              type: call
              call: "solarwinds.query-nodes"
              with:
                status_filter: "Warning,Critical"
                site: "{{site_filter}}"
            - name: post-digest
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_netops_channel_id"
                text: "Network Health Digest for {{site_filter}}: {{get-unhealthy-nodes.node_count}} nodes in degraded state. Review SolarWinds dashboard for details."
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://johndeere-solarwinds.internal/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: nodes
          path: "/Query"
          operations:
            - name: query-nodes
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the status of a network node from SolarWinds, including CPU load, memory utilization, and alert state.

naftiko: "0.5"
info:
  label: "SolarWinds Node Status Check"
  description: "Retrieves the status of a network node from SolarWinds, including CPU load, memory utilization, and alert state."
  tags:
    - network
    - solarwinds
    - monitoring
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: get-node-status
          description: "Look up a SolarWinds network node by name. Returns CPU load, memory utilization, and current alert state. Use for network operations monitoring."
          inputParameters:
            - name: node_name
              in: body
              type: string
              description: "The SolarWinds node name or IP."
          call: solarwinds.get-node
          with:
            node_name: "{{node_name}}"
          outputParameters:
            - name: cpu_load
              type: number
              mapping: "$.CPULoad"
            - name: memory_percent
              type: number
              mapping: "$.PercentMemoryUsed"
            - name: status
              type: string
              mapping: "$.Status"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://johndeere-solarwinds.com:17778/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: nodes
          path: "/Query?query=SELECT+Caption,CPULoad,PercentMemoryUsed,Status+FROM+Orion.Nodes+WHERE+Caption='{{node_name}}'"
          inputParameters:
            - name: node_name
              in: path
          operations:
            - name: get-node
              method: GET

Triggers a Tableau workbook refresh on a schedule or on-demand and posts the refresh status to Microsoft Teams, ensuring BI consumers always have up-to-date data.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Refresh Trigger"
  description: "Triggers a Tableau workbook refresh on a schedule or on-demand and posts the refresh status to Microsoft Teams, ensuring BI consumers always have up-to-date data."
  tags:
    - data
    - analytics
    - tableau
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: data-analytics
      port: 8080
      tools:
        - name: refresh-tableau-workbook
          description: "Given a Tableau workbook ID, trigger a datasource refresh and post the completion status to the analytics Teams channel."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID to refresh."
            - name: site_id
              in: body
              type: string
              description: "The Tableau site ID where the workbook lives."
          steps:
            - name: trigger-refresh
              type: call
              call: "tableau.refresh-workbook"
              with:
                site_id: "{{site_id}}"
                workbook_id: "{{workbook_id}}"
            - name: post-status
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_analytics_channel_id"
                text: "Tableau workbook {{workbook_id}} refresh triggered. Job ID: {{trigger-refresh.job_id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://10ax.online.tableau.com/api/3.20"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: site_id
              in: path
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the permissions for a Tableau workbook and compares them against an expected access list, reporting discrepancies to the governance Teams channel.

naftiko: "0.5"
info:
  label: "Tableau Workbook Permissions Audit"
  description: "Retrieves the permissions for a Tableau workbook and compares them against an expected access list, reporting discrepancies to the governance Teams channel."
  tags:
    - analytics
    - tableau
    - governance
    - microsoft-teams
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: analytics-governance
      port: 8080
      tools:
        - name: audit-workbook-permissions
          description: "Given a Tableau workbook ID, retrieve its permissions and report any discrepancies to the governance channel in Teams."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          steps:
            - name: get-permissions
              type: call
              call: tableau.get-workbook-permissions
              with:
                workbook_id: "{{workbook_id}}"
            - name: notify-governance
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_governance_channel_id"
                text: "Tableau Workbook Permissions Audit: {{workbook_id}} | Users with access: {{get-permissions.user_count}} | Groups: {{get-permissions.group_count}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://johndeere-tableau.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbook-permissions
          path: "/sites/$secrets.tableau_site_id/workbooks/{{workbook_id}}/permissions"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: get-workbook-permissions
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves the top long-running queries from Teradata and returns query text, elapsed time, and resource consumption for DBA review.

naftiko: "0.5"
info:
  label: "Teradata Query Performance Monitor"
  description: "Retrieves the top long-running queries from Teradata and returns query text, elapsed time, and resource consumption for DBA review."
  tags:
    - data-engineering
    - teradata
    - database
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: get-long-running-queries
          description: "Get top long-running queries from Teradata. Returns query text, elapsed time, and CPU usage. Use for database performance management."
          inputParameters:
            - name: threshold_seconds
              in: body
              type: number
              description: "Minimum elapsed seconds to filter queries."
          call: teradata.get-active-queries
          with:
            threshold: "{{threshold_seconds}}"
          outputParameters:
            - name: queries
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://johndeere-teradata.com/api/query"
      authentication:
        type: basic
        username: "$secrets.teradata_user"
        password: "$secrets.teradata_password"
      resources:
        - name: active-queries
          path: "/monitor/sessions?elapsedGt={{threshold}}"
          inputParameters:
            - name: threshold
              in: path
          operations:
            - name: get-active-queries
              method: GET

Checks Workday for employees with incomplete benefits enrollment and sends a reminder via Microsoft Teams with the enrollment deadline.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Checks Workday for employees with incomplete benefits enrollment and sends a reminder via Microsoft Teams with the enrollment deadline."
  tags:
    - hr
    - workday
    - benefits
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Query Workday for employees with incomplete benefits enrollment and send Teams reminders with deadline information."
          inputParameters:
            - name: enrollment_event_id
              in: body
              type: string
              description: "The Workday benefits enrollment event ID."
          steps:
            - name: get-incomplete
              type: call
              call: workday.get-incomplete-enrollments
              with:
                event_id: "{{enrollment_event_id}}"
            - name: notify-employees
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Benefits Enrollment Reminder: {{get-incomplete.count}} employees have not completed enrollment for event {{enrollment_event_id}}. Deadline: {{get-incomplete.deadline}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/benefitsEnrollment/{{event_id}}/incomplete"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-incomplete-enrollments
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves a Workday employee compensation summary including base pay, bonus target, total compensation, and pay frequency.

naftiko: "0.5"
info:
  label: "Workday Compensation Summary"
  description: "Retrieves a Workday employee compensation summary including base pay, bonus target, total compensation, and pay frequency."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-compensation
          description: "Look up an employee compensation summary in Workday by worker ID. Returns base pay, bonus target, total compensation, and pay frequency."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-compensation
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: base_pay
              type: number
              mapping: "$.compensation.basePay"
            - name: bonus_target
              type: number
              mapping: "$.compensation.bonusTarget"
            - name: total_comp
              type: number
              mapping: "$.compensation.totalCompensation"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{worker_id}}/compensation"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-compensation
              method: GET

When an employee transfers departments in Workday, updates their Azure AD group memberships and SharePoint site access, then notifies the new manager via Teams.

naftiko: "0.5"
info:
  label: "Workday Employee Transfer Provisioning"
  description: "When an employee transfers departments in Workday, updates their Azure AD group memberships and SharePoint site access, then notifies the new manager via Teams."
  tags:
    - hr
    - workday
    - azure-active-directory
    - sharepoint
    - microsoft-teams
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-provisioning
      port: 8080
      tools:
        - name: provision-transfer
          description: "Given a Workday worker ID and new department, update Azure AD groups, SharePoint access, and notify the new manager."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: new_department
              in: body
              type: string
              description: "The new department name."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: update-groups
              type: call
              call: azuread.update-group-membership
              with:
                user_upn: "{{get-worker.work_email}}"
                new_group: "{{new_department}}_Team"
            - name: grant-sharepoint
              type: call
              call: sharepoint.grant-access
              with:
                site_id: "{{new_department}}_site"
                user_upn: "{{get-worker.work_email}}"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.new_manager_email}}"
                text: "{{get-worker.full_name}} has transferred to {{new_department}}. Azure AD groups and SharePoint access have been 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: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: groups
          path: "/groups/{{new_group}}/members/$ref"
          inputParameters:
            - name: new_group
              in: path
          operations:
            - name: update-group-membership
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: permissions
          path: "/{{site_id}}/permissions"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: grant-access
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Workday job requisition by ID and returns its approval status, hiring manager, compensation range, and target start date.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Approval"
  description: "Retrieves a Workday job requisition by ID and returns its approval status, hiring manager, compensation range, and target start date."
  tags:
    - hr
    - recruiting
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-recruiting
      port: 8080
      tools:
        - name: get-job-requisition
          description: "Look up a Workday job requisition by ID. Returns approval status, hiring manager, compensation range, and target start date. Use for recruiting pipeline visibility."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          call: workday.get-requisition
          with:
            requisition_id: "{{requisition_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.requisitionStatus"
            - name: hiring_manager
              type: string
              mapping: "$.hiringManager.name"
            - name: comp_range
              type: string
              mapping: "$.compensationRange"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET

When an employee completes a Workday Learning course, publishes the credential to their LinkedIn profile and updates the Workday worker record with the LinkedIn credential URL.

naftiko: "0.5"
info:
  label: "Workday Learning Completion Sync to LinkedIn"
  description: "When an employee completes a Workday Learning course, publishes the credential to their LinkedIn profile and updates the Workday worker record with the LinkedIn credential URL."
  tags:
    - hr
    - learning-development
    - workday
    - linkedin
    - certification
capability:
  exposes:
    - type: mcp
      namespace: learning-ops
      port: 8080
      tools:
        - name: sync-learning-completion
          description: "Given a Workday learning completion record (worker ID and course ID), publish the earned credential to the employee's LinkedIn profile and write the LinkedIn URL back to Workday."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the employee who completed the course."
            - name: course_id
              in: body
              type: string
              description: "The Workday learning course ID completed."
          steps:
            - name: get-completion
              type: call
              call: "workday.get-learning-completion"
              with:
                worker_id: "{{worker_id}}"
                course_id: "{{course_id}}"
            - name: post-credential
              type: call
              call: "linkedin.add-certification"
              with:
                course_name: "{{get-completion.course_name}}"
                issuing_org: "John Deere"
                issue_date: "{{get-completion.completion_date}}"
            - name: update-worker
              type: call
              call: "workday.update-worker-profile"
              with:
                worker_id: "{{worker_id}}"
                linkedin_credential_url: "{{post-credential.certification_url}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning-completions
          path: "/workers/{{worker_id}}/learningCourseCompletions"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-learning-completion
              method: GET
        - name: worker-profiles
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: update-worker-profile
              method: PATCH
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: certifications
          path: "/certifications"
          operations:
            - name: add-certification
              method: POST

Retrieves the organizational hierarchy for a Workday worker, returning their manager chain, direct reports, and supervisory organization.

naftiko: "0.5"
info:
  label: "Workday Org Chart Lookup"
  description: "Retrieves the organizational hierarchy for a Workday worker, returning their manager chain, direct reports, and supervisory organization."
  tags:
    - hr
    - workday
    - organization
capability:
  exposes:
    - type: mcp
      namespace: hr-org
      port: 8080
      tools:
        - name: get-org-hierarchy
          description: "Look up the org chart for a worker in Workday. Returns manager chain, direct reports, and supervisory org. Use for org planning."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-org-chart
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: manager
              type: string
              mapping: "$.manager.name"
            - name: direct_reports_count
              type: number
              mapping: "$.directReportsCount"
            - name: supervisory_org
              type: string
              mapping: "$.supervisoryOrganization.name"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: org-chart
          path: "/workers/{{worker_id}}/organizationHierarchy"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-org-chart
              method: GET

Retrieves open position headcount and compensation data from Workday and compares against the SAP budget plan, posting a variance digest to the Finance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Workday Position Budget Variance Report"
  description: "Retrieves open position headcount and compensation data from Workday and compares against the SAP budget plan, posting a variance digest to the Finance Microsoft Teams channel."
  tags:
    - hr
    - finance
    - workday
    - sap
    - reporting
    - budgeting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance-reporting
      port: 8080
      tools:
        - name: report-position-budget-variance
          description: "Pull open position data from Workday and compare against the SAP cost center budget. Post a variance summary to the Finance Teams channel for headcount cost management."
          inputParameters:
            - name: cost_center_id
              in: body
              type: string
              description: "The SAP cost center ID to analyze for budget variance."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period to compare, e.g., 2026-Q1."
          steps:
            - name: get-positions
              type: call
              call: "workday.get-open-positions"
              with:
                cost_center_id: "{{cost_center_id}}"
            - name: get-budget
              type: call
              call: "sap.get-cost-center-budget"
              with:
                cost_center_id: "{{cost_center_id}}"
                fiscal_period: "{{fiscal_period}}"
            - name: post-variance
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.teams_finance_channel_id"
                text: "Budget Variance: Cost Center {{cost_center_id}} | Open positions: {{get-positions.open_count}} | SAP Budget: {{get-budget.total_budget}} | Period: {{fiscal_period}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: positions
          path: "/positions"
          operations:
            - name: get-open-positions
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://johndeere-s4.sap.com/sap/opu/odata/sap/YY1_COSTCENTERBUDGET_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: budgets
          path: "/CostCenterBudget"
          operations:
            - name: get-cost-center-budget
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an employee is terminated in Workday, deactivates their Okta account and notifies the security team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When an employee is terminated in Workday, deactivates their Okta account and notifies the security team via Microsoft Teams."
  tags:
    - hr
    - security
    - workday
    - okta
    - microsoft-teams
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-security
      port: 8080
      tools:
        - name: deprovision-terminated-employee
          description: "Given a Workday worker ID for a terminated employee, deactivate their Okta account and notify the security team in Teams."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the terminated employee."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                login: "{{get-worker.work_email}}"
            - name: notify-security
              type: call
              call: msteams.post-message
              with:
                channel_id: "$secrets.teams_security_channel_id"
                text: "Okta account deactivated for {{get-worker.full_name}} ({{get-worker.work_email}}) — termination processed from Workday."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://johndeere.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-message
              method: POST

Retrieves an employee time off balance from Workday, returning available PTO days, sick leave, and floating holidays.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Lookup"
  description: "Retrieves an employee time off balance from Workday, returning available PTO days, sick leave, and floating holidays."
  tags:
    - hr
    - workday
    - time-management
capability:
  exposes:
    - type: mcp
      namespace: hr-time
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Look up an employee time off balance in Workday. Returns available PTO, sick leave, and floating holidays. Use for employee self-service."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: workday.get-time-off-balance
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: pto_balance
              type: number
              mapping: "$.timeOffBalance.pto"
            - name: sick_leave
              type: number
              mapping: "$.timeOffBalance.sickLeave"
            - name: floating_holiday
              type: number
              mapping: "$.timeOffBalance.floatingHoliday"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/workers/{{worker_id}}/timeOffBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-time-off-balance
              method: GET

When a high-priority Zendesk support ticket is created, creates a corresponding Salesforce case and links the two records for unified customer service tracking.

naftiko: "0.5"
info:
  label: "Zendesk Ticket to Salesforce Case"
  description: "When a high-priority Zendesk support ticket is created, creates a corresponding Salesforce case and links the two records for unified customer service tracking."
  tags:
    - customer-service
    - zendesk
    - salesforce
    - sync
capability:
  exposes:
    - type: mcp
      namespace: support-sync
      port: 8080
      tools:
        - name: sync-zendesk-to-salesforce
          description: "Given a Zendesk ticket ID, create a Salesforce case with ticket details and link them."
          inputParameters:
            - name: ticket_id
              in: body
              type: string
              description: "The Zendesk ticket ID."
          steps:
            - name: get-ticket
              type: call
              call: zendesk.get-ticket
              with:
                ticket_id: "{{ticket_id}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "{{get-ticket.subject}}"
                description: "Zendesk #{{ticket_id}}: {{get-ticket.description}}"
                priority: "{{get-ticket.priority}}"
                contact_email: "{{get-ticket.requester_email}}"
  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://johndeere.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token"
      resources:
        - name: tickets
          path: "/tickets/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-ticket
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://johndeere.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

Enriches a company record with ZoomInfo data, returning employee count, revenue estimate, industry, and headquarters location.

naftiko: "0.5"
info:
  label: "ZoomInfo Company Enrichment"
  description: "Enriches a company record with ZoomInfo data, returning employee count, revenue estimate, industry, and headquarters location."
  tags:
    - sales
    - zoominfo
    - data-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-company
          description: "Given a company domain, enrich it with ZoomInfo data. Returns employee count, revenue, industry, and HQ location. Use for sales prospecting."
          inputParameters:
            - name: company_domain
              in: body
              type: string
              description: "The company website domain."
          call: zoominfo.enrich-company
          with:
            domain: "{{company_domain}}"
          outputParameters:
            - name: employee_count
              type: number
              mapping: "$.data[0].employeeCount"
            - name: revenue
              type: string
              mapping: "$.data[0].revenue"
            - name: industry
              type: string
              mapping: "$.data[0].industry"
  consumes:
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: company-enrich
          path: "/enrich/company"
          operations:
            - name: enrich-company
              method: POST