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