Dow Jones Capabilities

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

Sort
Expand

Reviews access at Dow Jones via Okta, IAM, and Jira.

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at Dow Jones via Okta, IAM, and Jira."
  tags:
    - security
    - access-management
    - okta
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: access-rev
      port: 8080
      tools:
        - name: review
          description: "Review access at Dow Jones."
          inputParameters:
            - name: dept
              in: body
              type: string
              description: "Department."
          steps:
            - name: ent
              type: call
              call: "okta.get-users"
              with:
                dept: "{{dept}}"
            - name: compare
              type: call
              call: "iam.compare"
              with:
                data: "{{ent.data}}"
            - name: flag
              type: call
              call: "iam.flag"
              with:
                violations: "{{compare.violations}}"
            - name: fix
              type: call
              call: "jira.create-issue"
              with:
                project: "IAM"
                summary: "Violations in {{dept}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dowjones.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: get-users
              method: GET
    - type: http
      namespace: iam
      baseUri: "https://iam.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.iam_token"
      resources:
        - name: reviews
          path: "/compare"
          operations:
            - name: compare
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Runs a segment-level Adobe Analytics report for a specified report suite and date range, returning visitor and page view breakdowns.

naftiko: "0.5"
info:
  label: "Adobe Analytics Segment Report"
  description: "Runs a segment-level Adobe Analytics report for a specified report suite and date range, returning visitor and page view breakdowns."
  tags:
    - analytics
    - adobe-analytics
capability:
  exposes:
    - type: mcp
      namespace: adobe-analytics
      port: 8080
      tools:
        - name: get-segment-report
          description: "Run an Adobe Analytics segment report by suite, segment, and date range."
          inputParameters:
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID."
            - name: segment_id
              in: body
              type: string
              description: "The segment identifier."
            - name: date_from
              in: body
              type: string
              description: "Start date YYYY-MM-DD."
            - name: date_to
              in: body
              type: string
              description: "End date YYYY-MM-DD."
          call: "adobeanalytics.get-report"
          with:
            rsid: "{{report_suite_id}}"
            segment_id: "{{segment_id}}"
            date_from: "{{date_from}}"
            date_to: "{{date_to}}"
  consumes:
    - type: http
      namespace: adobeanalytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{rsid}}/reports"
          inputParameters:
            - name: rsid
              in: path
          operations:
            - name: get-report
              method: POST

Manages API deprecation at Dow Jones via consumer identification, notices, and tracking.

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at Dow Jones via consumer identification, notices, and tracking."
  tags:
    - api-management
    - communications
    - governance
capability:
  exposes:
    - type: mcp
      namespace: api-sunset
      port: 8080
      tools:
        - name: notify-sunset
          description: "Manage API sunset at Dow Jones."
          inputParameters:
            - name: api
              in: body
              type: string
              description: "API name."
            - name: date
              in: body
              type: string
              description: "Sunset date."
          steps:
            - name: consumers
              type: call
              call: "api-gw.consumers"
              with:
                api: "{{api}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{consumers.emails}}"
                subject: "{{api}} sunset: {{date}}"
            - name: track
              type: call
              call: "analytics.usage"
              with:
                api: "{{api}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "API"
                summary: "Sunset {{api}} by {{date}}"
  consumes:
    - type: http
      namespace: api-gw
      baseUri: "https://api-gw.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.api_gw_token"
      resources:
        - name: consumers
          path: "/apis/{{api}}/consumers"
          inputParameters:
            - name: api
              in: path
          operations:
            - name: consumers
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: usage
          path: "/api-usage"
          operations:
            - name: usage
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

When an editor approves a story in the CMS, publishes the article to the website, indexes it in Elasticsearch for search, and sends a push notification via WhatsApp and Twitter.

naftiko: "0.5"
info:
  label: "Article Publishing Pipeline"
  description: "When an editor approves a story in the CMS, publishes the article to the website, indexes it in Elasticsearch for search, and sends a push notification via WhatsApp and Twitter."
  tags:
    - publishing
    - news
    - elasticsearch
    - twitter
    - whatsapp
capability:
  exposes:
    - type: mcp
      namespace: publishing
      port: 8080
      tools:
        - name: publish-article
          description: "Given a CMS article ID, publish to the website, index in Elasticsearch, and distribute via social channels."
          inputParameters:
            - name: article_id
              in: body
              type: string
              description: "The CMS article identifier."
            - name: publish_channel
              in: body
              type: string
              description: "Target publish channel (web, mobile, all)."
          steps:
            - name: fetch-article
              type: call
              call: "cms.get-article"
              with:
                article_id: "{{article_id}}"
            - name: index-article
              type: call
              call: "elasticsearch.index-document"
              with:
                index: "articles"
                document_id: "{{article_id}}"
                body: "{{fetch-article.content}}"
            - name: post-twitter
              type: call
              call: "twitter.create-tweet"
              with:
                text: "NEW: {{fetch-article.headline}} — {{fetch-article.url}}"
            - name: send-whatsapp
              type: call
              call: "whatsapp.send-message"
              with:
                channel_id: "breaking_news"
                text: "{{fetch-article.headline}}: {{fetch-article.summary}}"
  consumes:
    - type: http
      namespace: cms
      baseUri: "https://cms.dowjones.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.cms_token"
      resources:
        - name: articles
          path: "/articles/{{article_id}}"
          inputParameters:
            - name: article_id
              in: path
          operations:
            - name: get-article
              method: GET
    - type: http
      namespace: elasticsearch
      baseUri: "https://search.dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: documents
          path: "/{{index}}/_doc/{{document_id}}"
          inputParameters:
            - name: index
              in: path
            - name: document_id
              in: path
          operations:
            - name: index-document
              method: PUT
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_token"
      resources:
        - name: tweets
          path: "/tweets"
          operations:
            - name: create-tweet
              method: POST
    - type: http
      namespace: whatsapp
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a user in Azure Active Directory by UPN and returns profile details including department, manager, and group memberships.

naftiko: "0.5"
info:
  label: "Azure Active Directory User Lookup"
  description: "Looks up a user in Azure Active Directory by UPN and returns profile details including department, manager, and group memberships."
  tags:
    - identity
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: lookup-user
          description: "Look up an Azure AD user by UPN."
          inputParameters:
            - name: upn
              in: body
              type: string
              description: "User principal name (email)."
          call: "azuread.get-user"
          with:
            upn: "{{upn}}"
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-user
              method: GET

Checks the status of an Azure Databricks job run and returns the run state, result, and execution duration.

naftiko: "0.5"
info:
  label: "Azure Databricks Job Status"
  description: "Checks the status of an Azure Databricks job run and returns the run state, result, and execution duration."
  tags:
    - data
    - azure-databricks
capability:
  exposes:
    - type: mcp
      namespace: databricks-ops
      port: 8080
      tools:
        - name: get-job-status
          description: "Fetch Azure Databricks job run status by run ID."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The Databricks run identifier."
          call: "databricks.get-run"
          with:
            run_id: "{{run_id}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://eastus.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: runs
          path: "/jobs/runs/get"
          operations:
            - name: get-run
              method: GET

Checks build at Dow Jones.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at Dow Jones."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at Dow Jones."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Project."
            - name: build_id
              in: body
              type: string
              description: "Build ID."
          call: "azdo.get-build"
          with:
            project: "{{project}}"
            build_id: "{{build_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET

Triggers an Azure Functions deployment from a GitHub Actions build artifact and monitors the deployment status.

naftiko: "0.5"
info:
  label: "Azure Functions Deployment Trigger"
  description: "Triggers an Azure Functions deployment from a GitHub Actions build artifact and monitors the deployment status."
  tags:
    - deployment
    - azure-functions
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: serverless-deploy
      port: 8080
      tools:
        - name: deploy-azure-function
          description: "Deploy an Azure Function from a GitHub Actions build artifact."
          inputParameters:
            - name: function_app_name
              in: body
              type: string
              description: "The Azure Function App name."
            - name: artifact_url
              in: body
              type: string
              description: "URL of the build artifact."
          steps:
            - name: deploy-function
              type: call
              call: "azurefunctions.deploy"
              with:
                app_name: "{{function_app_name}}"
                artifact_url: "{{artifact_url}}"
            - name: check-status
              type: call
              call: "azurefunctions.get-status"
              with:
                app_name: "{{function_app_name}}"
  consumes:
    - type: http
      namespace: azurefunctions
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/dj-rg/providers/Microsoft.Web/sites"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: deployments
          path: "/{{app_name}}/extensions/MSDeploy"
          inputParameters:
            - name: app_name
              in: path
          operations:
            - name: deploy
              method: PUT
        - name: status
          path: "/{{app_name}}"
          inputParameters:
            - name: app_name
              in: path
          operations:
            - name: get-status
              method: GET

Verifies backups at Dow Jones.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at Dow Jones."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at Dow Jones."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: date
              in: body
              type: string
              description: "Backup date."
          steps:
            - name: status
              type: call
              call: "backup.get-status"
              with:
                db: "{{db}}"
                date: "{{date}}"
            - name: verify
              type: call
              call: "backup.verify"
              with:
                id: "{{status.backup_id}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#dba"
                text: "Backup {{db}}: {{verify.status}}"
  consumes:
    - type: http
      namespace: backup
      baseUri: "https://backup.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.backup_token"
      resources:
        - name: backups
          path: "/databases/{{db}}/status"
          inputParameters:
            - name: db
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://dowjones.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Synchronizes product listings from SAP to the BigCommerce storefront and updates the Elasticsearch product search index.

naftiko: "0.5"
info:
  label: "BigCommerce Product Catalog Sync"
  description: "Synchronizes product listings from SAP to the BigCommerce storefront and updates the Elasticsearch product search index."
  tags:
    - ecommerce
    - bigcommerce
    - sap
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: product-sync
      port: 8080
      tools:
        - name: sync-product
          description: "Push a SAP product to BigCommerce and update the search index."
          inputParameters:
            - name: product_id
              in: body
              type: string
              description: "The SAP material number."
          steps:
            - name: get-product
              type: call
              call: "sap.get-product"
              with:
                product_id: "{{product_id}}"
            - name: upsert-bigcommerce
              type: call
              call: "bigcommerce.upsert-product"
              with:
                sku: "{{product_id}}"
                name: "{{get-product.name}}"
                price: "{{get-product.price}}"
                description: "{{get-product.description}}"
            - name: update-index
              type: call
              call: "elasticsearch.index-document"
              with:
                index: "products"
                document_id: "{{product_id}}"
                body: '{"name":"{{get-product.name}}","price":"{{get-product.price}}"}'
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dowjones-sap.s4hana.cloud/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/products/{{product_id}}"
          inputParameters:
            - name: product_id
              in: path
          operations:
            - name: get-product
              method: GET
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/dowjones/v3"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: products
          path: "/catalog/products"
          operations:
            - name: upsert-product
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://search.dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: documents
          path: "/{{index}}/_doc/{{document_id}}"
          inputParameters:
            - name: index
              in: path
            - name: document_id
              in: path
          operations:
            - name: index-document
              method: PUT

Pulls latest market data from Bloomberg Enterprise Data, enriches it with Factiva news sentiment, and pushes a consolidated feed to the internal data warehouse via Azure Databricks.

naftiko: "0.5"
info:
  label: "Bloomberg Data Feed Sync"
  description: "Pulls latest market data from Bloomberg Enterprise Data, enriches it with Factiva news sentiment, and pushes a consolidated feed to the internal data warehouse via Azure Databricks."
  tags:
    - data
    - market-data
    - bloomberg-enterprise-data
    - factiva
    - azure-databricks
capability:
  exposes:
    - type: mcp
      namespace: market-data-sync
      port: 8080
      tools:
        - name: sync-market-feed
          description: "Pull market data from Bloomberg, enrich with Factiva sentiment, and load into Databricks."
          inputParameters:
            - name: instrument_id
              in: body
              type: string
              description: "Bloomberg instrument identifier."
            - name: date
              in: body
              type: string
              description: "Market date in YYYY-MM-DD format."
          steps:
            - name: get-market-data
              type: call
              call: "bloomberg.get-instrument-data"
              with:
                instrument_id: "{{instrument_id}}"
                date: "{{date}}"
            - name: get-sentiment
              type: call
              call: "factiva.search-articles"
              with:
                query: "{{get-market-data.issuer_name}}"
                date_from: "{{date}}"
                date_to: "{{date}}"
            - name: load-to-warehouse
              type: call
              call: "databricks.submit-job"
              with:
                job_name: "market_data_load"
                parameters: '{"instrument":"{{instrument_id}}","sentiment_score":"{{get-sentiment.avg_score}}"}'
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: instruments
          path: "/data/{{instrument_id}}"
          inputParameters:
            - name: instrument_id
              in: path
          operations:
            - name: get-instrument-data
              method: GET
    - type: http
      namespace: factiva
      baseUri: "https://api.dowjones.com/factiva/v1"
      authentication:
        type: bearer
        token: "$secrets.factiva_token"
      resources:
        - name: articles
          path: "/search"
          operations:
            - name: search-articles
              method: POST
    - type: http
      namespace: databricks
      baseUri: "https://eastus.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: submit-job
              method: POST

Retrieves a Bloomberg Intelligence research report by report ID and returns the executive summary, sector, and analyst details.

naftiko: "0.5"
info:
  label: "Bloomberg Intelligence Report Fetch"
  description: "Retrieves a Bloomberg Intelligence research report by report ID and returns the executive summary, sector, and analyst details."
  tags:
    - research
    - bloomberg-intelligence
capability:
  exposes:
    - type: mcp
      namespace: bi-research
      port: 8080
      tools:
        - name: get-bi-report
          description: "Fetch a Bloomberg Intelligence report by ID."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The Bloomberg Intelligence report identifier."
          call: "bi.get-report"
          with:
            report_id: "{{report_id}}"
  consumes:
    - type: http
      namespace: bi
      baseUri: "https://api.bloomberg.com/bi/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: reports
          path: "/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET

On breaking news flag in CMS, pushes alerts to Twitter, Instagram, LinkedIn, and WhatsApp simultaneously, then logs the distribution event in Datadog.

naftiko: "0.5"
info:
  label: "Breaking News Alert Orchestrator"
  description: "On breaking news flag in CMS, pushes alerts to Twitter, Instagram, LinkedIn, and WhatsApp simultaneously, then logs the distribution event in Datadog."
  tags:
    - news
    - alerts
    - twitter
    - instagram
    - linkedin
    - whatsapp
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: breaking-news
      port: 8080
      tools:
        - name: distribute-breaking-alert
          description: "Distribute a breaking news alert across all social channels and log to monitoring."
          inputParameters:
            - name: article_id
              in: body
              type: string
              description: "The CMS article ID for the breaking story."
            - name: headline
              in: body
              type: string
              description: "The breaking news headline."
            - name: url
              in: body
              type: string
              description: "The article URL."
          steps:
            - name: post-twitter
              type: call
              call: "twitter.create-tweet"
              with:
                text: "BREAKING: {{headline}} {{url}}"
            - name: post-linkedin
              type: call
              call: "linkedin.create-post"
              with:
                text: "BREAKING: {{headline}} — Read more: {{url}}"
            - name: post-instagram
              type: call
              call: "instagram.create-post"
              with:
                caption: "BREAKING: {{headline}}"
                link: "{{url}}"
            - name: send-whatsapp
              type: call
              call: "whatsapp.send-message"
              with:
                channel_id: "breaking_alerts"
                text: "BREAKING: {{headline}} {{url}}"
            - name: log-distribution
              type: call
              call: "datadog.send-event"
              with:
                title: "Breaking news distributed: {{article_id}}"
                text: "{{headline}} pushed to 4 channels"
                tags: "breaking,news"
  consumes:
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_token"
      resources:
        - name: tweets
          path: "/tweets"
          operations:
            - name: create-tweet
              method: POST
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST
    - type: http
      namespace: instagram
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.instagram_token"
      resources:
        - name: media
          path: "/media"
          operations:
            - name: create-post
              method: POST
    - type: http
      namespace: whatsapp
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.whatsapp_token"
      resources:
        - name: messages
          path: "/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: send-event
              method: POST

Analyzes budget variance at Dow Jones via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at Dow Jones via Oracle, Workday, and Slack."
  tags:
    - finance
    - budget
    - oracle
    - workday
capability:
  exposes:
    - type: mcp
      namespace: budget-var
      port: 8080
      tools:
        - name: analyze-variance
          description: "Check budget variance at Dow Jones."
          inputParameters:
            - name: cc
              in: body
              type: string
              description: "Cost center."
            - name: period
              in: body
              type: string
              description: "Period."
          steps:
            - name: actuals
              type: call
              call: "oracle.get-actuals"
              with:
                cc: "{{cc}}"
                period: "{{period}}"
            - name: budget
              type: call
              call: "workday.get-budget"
              with:
                cc: "{{cc}}"
            - name: compute
              type: call
              call: "analytics.variance"
              with:
                a: "{{actuals.total}}"
                b: "{{budget.total}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Variance {{cc}}: ${{compute.variance}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/actuals"
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: budgets
          path: "/budgets"
          operations:
            - name: get-budget
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: var
          path: "/compute"
          operations:
            - name: variance
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Plans capacity at Dow Jones by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at Dow Jones by collecting utilization and forecasting."
  tags:
    - infrastructure
    - capacity-planning
    - forecasting
capability:
  exposes:
    - type: mcp
      namespace: capacity
      port: 8080
      tools:
        - name: plan-capacity
          description: "Plan capacity at Dow Jones."
          inputParameters:
            - name: resource
              in: body
              type: string
              description: "Resource type."
            - name: months
              in: body
              type: number
              description: "Forecast months."
          steps:
            - name: util
              type: call
              call: "monitoring.get-util"
              with:
                resource: "{{resource}}"
            - name: forecast
              type: call
              call: "analytics.forecast"
              with:
                current: "{{util.pct}}"
                months: "{{months}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "capacity"
                resource: "{{resource}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "capacity"
  consumes:
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: util
          path: "/resources/{{resource}}/util"
          inputParameters:
            - name: resource
              in: path
          operations:
            - name: get-util
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: forecast
          path: "/demand"
          operations:
            - name: forecast
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Monitors cert expiry at Dow Jones.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at Dow Jones."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at Dow Jones."
          inputParameters:
            - name: domains
              in: body
              type: string
              description: "Domains to check."
          steps:
            - name: scan
              type: call
              call: "cert-scanner.scan"
              with:
                domains: "{{domains}}"
            - name: filter
              type: call
              call: "analytics.filter-expiring"
              with:
                certs: "{{scan.results}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "{{filter.count}} certs expiring"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Cert alert: {{filter.count}} expiring"
  consumes:
    - type: http
      namespace: cert-scanner
      baseUri: "https://certs.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cert_token"
      resources:
        - name: scans
          path: "/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Routes changes at Dow Jones through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at Dow Jones through ServiceNow and CAB approval."
  tags:
    - change-management
    - servicenow
    - itil
capability:
  exposes:
    - type: mcp
      namespace: change-mgmt
      port: 8080
      tools:
        - name: process-change
          description: "Process changes at Dow Jones."
          inputParameters:
            - name: change_id
              in: body
              type: string
              description: "Change ID."
            - name: date
              in: body
              type: string
              description: "Date."
          steps:
            - name: get
              type: call
              call: "servicenow.get-change"
              with:
                id: "{{change_id}}"
            - name: conflicts
              type: call
              call: "servicenow.check-conflicts"
              with:
                date: "{{date}}"
            - name: submit
              type: call
              call: "servicenow.update"
              with:
                id: "{{change_id}}"
                state: "approval"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "cab@co.com"
                subject: "CAB: {{change_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: changes
          path: "/table/change_request/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Queries Cisco network infrastructure for device status, interface health, and uptime metrics.

naftiko: "0.5"
info:
  label: "Cisco Network Device Status"
  description: "Queries Cisco network infrastructure for device status, interface health, and uptime metrics."
  tags:
    - infrastructure
    - networking
    - cisco
capability:
  exposes:
    - type: mcp
      namespace: network-status
      port: 8080
      tools:
        - name: get-device-status
          description: "Fetch Cisco device status by hostname or IP."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "The Cisco device hostname or IP address."
          call: "cisco.get-device"
          with:
            device_id: "{{device_id}}"
  consumes:
    - type: http
      namespace: cisco
      baseUri: "https://sandboxdnac.cisco.com/dna/intent/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cisco_token"
      resources:
        - name: devices
          path: "/network-device/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-device
              method: GET

Looks up active user sessions on Citrix NetScaler by username and returns session count, duration, and gateway details.

naftiko: "0.5"
info:
  label: "Citrix NetScaler Session Lookup"
  description: "Looks up active user sessions on Citrix NetScaler by username and returns session count, duration, and gateway details."
  tags:
    - infrastructure
    - remote-access
    - citrix-netscaler
capability:
  exposes:
    - type: mcp
      namespace: remote-access
      port: 8080
      tools:
        - name: get-user-sessions
          description: "Look up active Citrix NetScaler sessions by username."
          inputParameters:
            - name: username
              in: body
              type: string
              description: "The user's network login name."
          call: "netscaler.get-sessions"
          with:
            username: "{{username}}"
  consumes:
    - type: http
      namespace: netscaler
      baseUri: "https://netscaler.dowjones.com/nitro/v1"
      authentication:
        type: basic
        username: "$secrets.netscaler_user"
        password: "$secrets.netscaler_password"
      resources:
        - name: sessions
          path: "/config/aaasession"
          operations:
            - name: get-sessions
              method: GET

Optimizes cloud costs at Dow Jones via Azure, FinOps, Jira, and Power BI.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at Dow Jones via Azure, FinOps, Jira, and Power BI."
  tags:
    - cloud
    - cost-management
    - finops
capability:
  exposes:
    - type: mcp
      namespace: cloud-opt
      port: 8080
      tools:
        - name: optimize
          description: "Optimize cloud costs at Dow Jones."
          inputParameters:
            - name: provider
              in: body
              type: string
              description: "Provider."
            - name: range
              in: body
              type: string
              description: "Range."
          steps:
            - name: spend
              type: call
              call: "cloud.get-costs"
              with:
                provider: "{{provider}}"
                range: "{{range}}"
            - name: savings
              type: call
              call: "finops.analyze"
              with:
                data: "{{spend.data}}"
            - name: action
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Save ${{savings.potential}}"
            - name: report
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cloud"
  consumes:
    - type: http
      namespace: cloud
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: costs
          path: "/providers/Microsoft.CostManagement/query"
          operations:
            - name: get-costs
              method: POST
    - type: http
      namespace: finops
      baseUri: "https://finops.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.finops_token"
      resources:
        - name: analysis
          path: "/savings"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Retrieves DNS records for a Cloudflare-managed zone by record name and type.

naftiko: "0.5"
info:
  label: "Cloudflare DNS Record Lookup"
  description: "Retrieves DNS records for a Cloudflare-managed zone by record name and type."
  tags:
    - infrastructure
    - dns
    - cloudflare
capability:
  exposes:
    - type: mcp
      namespace: dns-mgmt
      port: 8080
      tools:
        - name: lookup-dns-record
          description: "Look up Cloudflare DNS records by zone and record name."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The Cloudflare zone identifier."
            - name: record_name
              in: body
              type: string
              description: "The DNS record name to look up."
          call: "cloudflare.get-dns-records"
          with:
            zone_id: "{{zone_id}}"
            record_name: "{{record_name}}"
  consumes:
    - type: http
      namespace: cloudflare
      baseUri: "https://api.cloudflare.com/client/v4"
      authentication:
        type: bearer
        token: "$secrets.cloudflare_token"
      resources:
        - name: dns-records
          path: "/zones/{{zone_id}}/dns_records"
          inputParameters:
            - name: zone_id
              in: path
            - name: record_name
              in: query
          operations:
            - name: get-dns-records
              method: GET

Retrieves the current status of an AWS CloudFormation stack including resources, events, and drift detection results.

naftiko: "0.5"
info:
  label: "CloudFormation Stack Status"
  description: "Retrieves the current status of an AWS CloudFormation stack including resources, events, and drift detection results."
  tags:
    - infrastructure
    - cloudformation
capability:
  exposes:
    - type: mcp
      namespace: cloud-infra
      port: 8080
      tools:
        - name: get-stack-status
          description: "Fetch AWS CloudFormation stack status by stack name."
          inputParameters:
            - name: stack_name
              in: body
              type: string
              description: "The CloudFormation stack name."
          call: "cfn.describe-stack"
          with:
            stack_name: "{{stack_name}}"
  consumes:
    - type: http
      namespace: cfn
      baseUri: "https://cloudformation.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_token"
      resources:
        - name: stacks
          path: "/"
          operations:
            - name: describe-stack
              method: POST

Searches Confluence at Dow Jones.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at Dow Jones."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at Dow Jones."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Query."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dowjones.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

Scans a draft article through Palo Alto Networks content filter, checks for restricted terms in Elasticsearch, and routes flagged content to a ServiceNow compliance task.

naftiko: "0.5"
info:
  label: "Content Compliance Review"
  description: "Scans a draft article through Palo Alto Networks content filter, checks for restricted terms in Elasticsearch, and routes flagged content to a ServiceNow compliance task."
  tags:
    - compliance
    - publishing
    - palo-alto-networks
    - elasticsearch
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: content-compliance
      port: 8080
      tools:
        - name: review-content-compliance
          description: "Scan article for compliance issues, check restricted terms, and route flagged items to compliance team."
          inputParameters:
            - name: article_id
              in: body
              type: string
              description: "The CMS article ID to review."
            - name: author_email
              in: body
              type: string
              description: "Author email for notification."
          steps:
            - name: fetch-article
              type: call
              call: "cms.get-article"
              with:
                article_id: "{{article_id}}"
            - name: scan-content
              type: call
              call: "paloalto.scan-content"
              with:
                content: "{{fetch-article.content}}"
            - name: check-terms
              type: call
              call: "elasticsearch.search"
              with:
                index: "restricted_terms"
                query: "{{fetch-article.content}}"
            - name: create-review-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Compliance review: {{fetch-article.headline}}"
                description: "Scan result: {{scan-content.status}}. Restricted terms found: {{check-terms.hits_total}}. Author: {{author_email}}."
                assigned_group: "Editorial_Compliance"
  consumes:
    - type: http
      namespace: cms
      baseUri: "https://cms.dowjones.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.cms_token"
      resources:
        - name: articles
          path: "/articles/{{article_id}}"
          inputParameters:
            - name: article_id
              in: path
          operations:
            - name: get-article
              method: GET
    - type: http
      namespace: paloalto
      baseUri: "https://api.paloaltonetworks.com/v1"
      authentication:
        type: bearer
        token: "$secrets.paloalto_token"
      resources:
        - name: scans
          path: "/content-scan"
          operations:
            - name: scan-content
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://search.dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

When a reader accesses premium content, validates their SAP subscription status via Azure Active Directory, and either grants access or redirects to the subscription page, logging the event in Elasticsearch.

naftiko: "0.5"
info:
  label: "Content Paywall Enforcement"
  description: "When a reader accesses premium content, validates their SAP subscription status via Azure Active Directory, and either grants access or redirects to the subscription page, logging the event in Elasticsearch."
  tags:
    - subscriptions
    - access-control
    - sap
    - azure-active-directory
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: paywall
      port: 8080
      tools:
        - name: enforce-paywall
          description: "Validate subscriber access to premium content and log the access attempt."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The reader email address."
            - name: article_id
              in: body
              type: string
              description: "The premium article identifier."
          steps:
            - name: lookup-user
              type: call
              call: "azuread.get-user"
              with:
                upn: "{{user_email}}"
            - name: check-subscription
              type: call
              call: "sap.get-subscription"
              with:
                account_id: "{{lookup-user.extension_account_id}}"
            - name: log-access
              type: call
              call: "elasticsearch.index-document"
              with:
                index: "paywall_events"
                document_id: "{{article_id}}_{{user_email}}"
                body: '{"article":"{{article_id}}","user":"{{user_email}}","status":"{{check-subscription.status}}"}'
  consumes:
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{upn}}"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: get-user
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://dowjones-sap.s4hana.cloud/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: subscriptions
          path: "/subscriptions/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-subscription
              method: GET
    - type: http
      namespace: elasticsearch
      baseUri: "https://search.dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: documents
          path: "/{{index}}/_doc/{{document_id}}"
          inputParameters:
            - name: index
              in: path
            - name: document_id
              in: path
          operations:
            - name: index-document
              method: PUT

Tracks contract renewals at Dow Jones via contracts system, email, Jira, and Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at Dow Jones via contracts system, email, Jira, and Salesforce."
  tags:
    - procurement
    - contracts
    - salesforce
    - jira
capability:
  exposes:
    - type: mcp
      namespace: contract-renew
      port: 8080
      tools:
        - name: track
          description: "Track renewals at Dow Jones."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Contract ID."
            - name: owner
              in: body
              type: string
              description: "Owner email."
          steps:
            - name: get
              type: call
              call: "contracts.get"
              with:
                id: "{{contract_id}}"
            - name: remind
              type: call
              call: "email.send"
              with:
                to: "{{owner}}"
                subject: "Renewal: {{contract_id}}"
            - name: task
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                summary: "Renew {{contract_id}}"
            - name: crm
              type: call
              call: "salesforce.update"
              with:
                id: "{{contract_id}}"
                stage: "Renewal"
  consumes:
    - type: http
      namespace: contracts
      baseUri: "https://contracts.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.contracts_token"
      resources:
        - name: contracts
          path: "/contracts/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://dowjones.com.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opps
          path: "/sobjects/Opportunity"
          operations:
            - name: update
              method: PATCH

Reallocates costs at Dow Jones.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at Dow Jones."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at Dow Jones."
          inputParameters:
            - name: source
              in: body
              type: string
              description: "Source CC."
            - name: target
              in: body
              type: string
              description: "Target CC."
            - name: amount
              in: body
              type: number
              description: "Amount."
          steps:
            - name: current
              type: call
              call: "oracle.get-alloc"
              with:
                cc: "{{source}}"
            - name: compute
              type: call
              call: "analytics.realloc"
              with:
                source: "{{source}}"
                target: "{{target}}"
                amount: "{{amount}}"
            - name: post
              type: call
              call: "oracle.post-journal"
              with:
                entries: "{{compute.entries}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Reallocated ${{amount}} from {{source}} to {{target}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: allocations
          path: "/cost-centers/{{cc}}/allocations"
          inputParameters:
            - name: cc
              in: path
          operations:
            - name: get-alloc
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: realloc
          path: "/compute"
          operations:
            - name: realloc
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Triggers a Crystal Reports generation job for a specified report template and parameters, then stores the output PDF in SharePoint.

naftiko: "0.5"
info:
  label: "Crystal Reports Generation"
  description: "Triggers a Crystal Reports generation job for a specified report template and parameters, then stores the output PDF in SharePoint."
  tags:
    - reporting
    - crystal-reports
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: reporting
      port: 8080
      tools:
        - name: generate-report
          description: "Generate a Crystal Report and store the result in SharePoint."
          inputParameters:
            - name: template_id
              in: body
              type: string
              description: "Crystal Reports template identifier."
            - name: parameters
              in: body
              type: string
              description: "JSON-encoded report parameters."
            - name: output_folder
              in: body
              type: string
              description: "SharePoint folder path for output."
          steps:
            - name: run-report
              type: call
              call: "crystal.generate-report"
              with:
                template_id: "{{template_id}}"
                parameters: "{{parameters}}"
            - name: upload-to-sharepoint
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "reports_site"
                folder_path: "{{output_folder}}"
                file_name: "{{run-report.file_name}}"
                content: "{{run-report.output_url}}"
  consumes:
    - type: http
      namespace: crystal
      baseUri: "https://reports.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.crystal_reports_token"
      resources:
        - name: reports
          path: "/reports/generate"
          operations:
            - name: generate-report
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Monitors data pipelines at Dow Jones via Databricks, Snowflake, Slack, and ServiceNow.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at Dow Jones via Databricks, Snowflake, Slack, and ServiceNow."
  tags:
    - data-engineering
    - databricks
    - monitoring
    - slack
capability:
  exposes:
    - type: mcp
      namespace: pipeline-mon
      port: 8080
      tools:
        - name: monitor
          description: "Monitor pipelines at Dow Jones."
          inputParameters:
            - name: pipeline_id
              in: body
              type: string
              description: "Pipeline ID."
          steps:
            - name: status
              type: call
              call: "databricks.get-run"
              with:
                id: "{{pipeline_id}}"
            - name: quality
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT COUNT(*) FROM out WHERE p='{{pipeline_id}}'"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#data"
                text: "Pipeline {{pipeline_id}}: {{status.state}}"
            - name: incident
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "Pipeline {{pipeline_id}} issue"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://dowjones.com.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/get"
          operations:
            - name: get-run
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://dowjones.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries Datadog for a specific metric time series over a given window. Returns data points for dashboards and alerting.

naftiko: "0.5"
info:
  label: "Datadog Metric Query"
  description: "Queries Datadog for a specific metric time series over a given window. Returns data points for dashboards and alerting."
  tags:
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: metrics
      port: 8080
      tools:
        - name: query-metric
          description: "Query a Datadog metric by name and time range."
          inputParameters:
            - name: metric_name
              in: body
              type: string
              description: "The Datadog metric name."
            - name: from_ts
              in: body
              type: string
              description: "Start timestamp (epoch seconds)."
            - name: to_ts
              in: body
              type: string
              description: "End timestamp (epoch seconds)."
          call: "datadog.query-metric"
          with:
            query: "{{metric_name}}"
            from: "{{from_ts}}"
            to: "{{to_ts}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metric
              method: GET

Checks Datadog monitor at Dow Jones.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at Dow Jones."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at Dow Jones."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Tests disaster recovery at Dow Jones via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at Dow Jones via failover, health checks, and reporting."
  tags:
    - disaster-recovery
    - business-continuity
    - testing
capability:
  exposes:
    - type: mcp
      namespace: dr-test
      port: 8080
      tools:
        - name: test-dr
          description: "Test DR at Dow Jones."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "Plan ID."
            - name: type
              in: body
              type: string
              description: "Test type."
          steps:
            - name: failover
              type: call
              call: "dr.failover"
              with:
                plan: "{{plan_id}}"
                type: "{{type}}"
            - name: validate
              type: call
              call: "monitoring.check"
              with:
                scope: "critical"
            - name: measure
              type: call
              call: "dr.metrics"
              with:
                id: "{{failover.id}}"
            - name: report
              type: call
              call: "confluence.create-page"
              with:
                title: "DR - {{plan_id}}"
                body: "RTO:{{measure.rto}}m RPO:{{measure.rpo}}m"
  consumes:
    - type: http
      namespace: dr
      baseUri: "https://dr.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.dr_token"
      resources:
        - name: failovers
          path: "/failovers"
          operations:
            - name: failover
              method: POST
    - type: http
      namespace: monitoring
      baseUri: "https://monitoring.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.monitoring_token"
      resources:
        - name: health
          path: "/checks"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://dowjones.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Detects infrastructure drift at Dow Jones via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at Dow Jones via Terraform, Slack, and Jira."
  tags:
    - infrastructure
    - terraform
    - drift-detection
    - devops
capability:
  exposes:
    - type: mcp
      namespace: drift-det
      port: 8080
      tools:
        - name: detect
          description: "Detect drift at Dow Jones."
          inputParameters:
            - name: ws_id
              in: body
              type: string
              description: "Workspace ID."
            - name: env
              in: body
              type: string
              description: "Environment."
          steps:
            - name: plan
              type: call
              call: "terraform.run"
              with:
                ws: "{{ws_id}}"
            - name: check
              type: call
              call: "terraform.get-plan"
              with:
                run: "{{plan.id}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#infra"
                text: "Drift {{env}}: {{check.changes}} changes"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                summary: "Drift in {{env}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: run
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Reads editorial assignments from Google Forms responses, creates corresponding tasks in Microsoft Planner, and notifies editors in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Editorial Calendar Sync"
  description: "Reads editorial assignments from Google Forms responses, creates corresponding tasks in Microsoft Planner, and notifies editors in Microsoft Teams."
  tags:
    - publishing
    - planning
    - google-forms
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: editorial-calendar
      port: 8080
      tools:
        - name: sync-editorial-calendar
          description: "Pull form submissions, create planner tasks, and notify editors."
          inputParameters:
            - name: form_id
              in: body
              type: string
              description: "The Google Forms form identifier."
            - name: team_channel
              in: body
              type: string
              description: "Microsoft Teams channel for notifications."
          steps:
            - name: get-responses
              type: call
              call: "gforms.get-responses"
              with:
                form_id: "{{form_id}}"
            - name: create-tasks
              type: call
              call: "planner.create-task"
              with:
                plan_id: "editorial_plan"
                title: "{{get-responses.latest_title}}"
                due_date: "{{get-responses.latest_due_date}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{team_channel}}"
                text: "New editorial assignment: {{get-responses.latest_title}} due {{get-responses.latest_due_date}}."
  consumes:
    - type: http
      namespace: gforms
      baseUri: "https://forms.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_forms_token"
      resources:
        - name: responses
          path: "/forms/{{form_id}}/responses"
          inputParameters:
            - name: form_id
              in: path
          operations:
            - name: get-responses
              method: GET
    - type: http
      namespace: planner
      baseUri: "https://graph.microsoft.com/v1.0/planner"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: tasks
          path: "/tasks"
          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: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks ES index at Dow Jones.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at Dow Jones."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at Dow Jones."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "Index name."
          call: "es.get-health"
          with:
            index: "{{index}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: docs
              type: number
              mapping: "$.docs.count"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://es.dowjones.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

Creates or updates an Elasticsearch index with specified mappings and settings for content management.

naftiko: "0.5"
info:
  label: "Elasticsearch Index Management"
  description: "Creates or updates an Elasticsearch index with specified mappings and settings for content management."
  tags:
    - data
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: search-admin
      port: 8080
      tools:
        - name: manage-index
          description: "Create or update an Elasticsearch index with mappings."
          inputParameters:
            - name: index_name
              in: body
              type: string
              description: "The Elasticsearch index name."
            - name: mappings
              in: body
              type: string
              description: "JSON index mappings."
          call: "elasticsearch.create-index"
          with:
            index: "{{index_name}}"
            body: "{{mappings}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://search.dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: indices
          path: "/{{index}}"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: create-index
              method: PUT

Offboards employees at Dow Jones via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at Dow Jones via Okta, Slack, ServiceNow, and storage."
  tags:
    - hr
    - offboarding
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: offboarding
      port: 8080
      tools:
        - name: offboard
          description: "Offboard employees at Dow Jones."
          inputParameters:
            - name: emp_id
              in: body
              type: string
              description: "Employee ID."
            - name: last_day
              in: body
              type: string
              description: "Last day."
          steps:
            - name: disable
              type: call
              call: "okta.deactivate"
              with:
                user: "{{emp_id}}"
            - name: revoke
              type: call
              call: "slack.remove"
              with:
                user: "{{emp_id}}"
            - name: return
              type: call
              call: "servicenow.create-request"
              with:
                type: "return"
                emp: "{{emp_id}}"
            - name: archive
              type: call
              call: "storage.archive"
              with:
                user: "{{emp_id}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dowjones.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user}}/lifecycle/deactivate"
          inputParameters:
            - name: user
              in: path
          operations:
            - name: deactivate
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.remove"
          operations:
            - name: remove
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: storage
      baseUri: "https://storage.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

Audits expenses at Dow Jones via Concur, compliance checks, and email.

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at Dow Jones via Concur, compliance checks, and email."
  tags:
    - finance
    - travel
    - sap-concur
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit
          description: "Audit expenses at Dow Jones."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Report ID."
          steps:
            - name: get
              type: call
              call: "concur.get-report"
              with:
                id: "{{report_id}}"
            - name: check
              type: call
              call: "compliance.check"
              with:
                expenses: "{{get.entries}}"
            - name: flag
              type: call
              call: "workflow.flag"
              with:
                id: "{{report_id}}"
                violations: "{{check.violations}}"
            - name: notify
              type: call
              call: "email.send"
              with:
                to: "{{get.approver}}"
                subject: "Expense {{report_id}} violations"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: policies
          path: "/check"
          operations:
            - name: check
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: reviews
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Retrieves the current status of an F5 virtual server including pool member health, active connections, and throughput.

naftiko: "0.5"
info:
  label: "F5 Networks Load Balancer Status"
  description: "Retrieves the current status of an F5 virtual server including pool member health, active connections, and throughput."
  tags:
    - infrastructure
    - networking
    - f5-networks
capability:
  exposes:
    - type: mcp
      namespace: load-balancer
      port: 8080
      tools:
        - name: get-virtual-server-status
          description: "Fetch F5 virtual server health and connection stats."
          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}}"
  consumes:
    - type: http
      namespace: f5
      baseUri: "https://f5.dowjones.com/mgmt/tm"
      authentication:
        type: basic
        username: "$secrets.f5_user"
        password: "$secrets.f5_password"
      resources:
        - name: virtual-servers
          path: "/ltm/virtual/{{name}}/stats"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: get-virtual-server
              method: GET

Publishes a post to the Dow Jones Facebook page with a link and message text.

naftiko: "0.5"
info:
  label: "Facebook Page Post"
  description: "Publishes a post to the Dow Jones Facebook page with a link and message text."
  tags:
    - social-media
    - facebook
capability:
  exposes:
    - type: mcp
      namespace: social-facebook
      port: 8080
      tools:
        - name: post-to-facebook
          description: "Publish a post to the Dow Jones Facebook page."
          inputParameters:
            - name: message
              in: body
              type: string
              description: "The post message text."
            - name: link
              in: body
              type: string
              description: "URL to attach to the post."
          call: "facebook.create-post"
          with:
            message: "{{message}}"
            link: "{{link}}"
  consumes:
    - type: http
      namespace: facebook
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.facebook_token"
      resources:
        - name: posts
          path: "/me/feed"
          operations:
            - name: create-post
              method: POST

Executes a full-text search against the Factiva database and returns matching articles with metadata, source, and relevance scores.

naftiko: "0.5"
info:
  label: "Factiva Search Query"
  description: "Executes a full-text search against the Factiva database and returns matching articles with metadata, source, and relevance scores."
  tags:
    - data
    - search
    - factiva
capability:
  exposes:
    - type: mcp
      namespace: factiva-search
      port: 8080
      tools:
        - name: search-factiva
          description: "Search the Factiva news archive by keyword, date range, and source filter. Returns article summaries and metadata."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Full-text search query string."
            - name: date_from
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: date_to
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          call: "factiva.search-articles"
          with:
            query: "{{query}}"
            date_from: "{{date_from}}"
            date_to: "{{date_to}}"
  consumes:
    - type: http
      namespace: factiva
      baseUri: "https://api.dowjones.com/factiva/v1"
      authentication:
        type: bearer
        token: "$secrets.factiva_token"
      resources:
        - name: articles
          path: "/search"
          operations:
            - name: search-articles
              method: POST

Analyzes feedback at Dow Jones via surveys, AI sentiment, and Power BI.

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at Dow Jones via surveys, AI sentiment, and Power BI."
  tags:
    - customer-experience
    - analytics
    - sentiment-analysis
capability:
  exposes:
    - type: mcp
      namespace: feedback
      port: 8080
      tools:
        - name: analyze
          description: "Analyze feedback at Dow Jones."
          inputParameters:
            - name: survey_id
              in: body
              type: string
              description: "Survey ID."
          steps:
            - name: collect
              type: call
              call: "survey.get"
              with:
                id: "{{survey_id}}"
            - name: sentiment
              type: call
              call: "ai.analyze"
              with:
                text: "{{collect.responses}}"
            - name: themes
              type: call
              call: "ai.themes"
              with:
                data: "{{collect.responses}}"
            - name: dashboard
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "cx"
  consumes:
    - type: http
      namespace: survey
      baseUri: "https://surveys.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.survey_token"
      resources:
        - name: responses
          path: "/surveys/{{id}}/responses"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Fetches the latest CI run status from GitHub Actions for a given repository and branch.

naftiko: "0.5"
info:
  label: "GitHub Actions CI Status"
  description: "Fetches the latest CI run status from GitHub Actions for a given repository and branch."
  tags:
    - development
    - ci
    - github-actions
capability:
  exposes:
    - type: mcp
      namespace: ci-status
      port: 8080
      tools:
        - name: get-ci-status
          description: "Check the latest GitHub Actions workflow run status for a repo and branch."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository name (owner/repo)."
            - name: branch
              in: body
              type: string
              description: "Branch name."
          call: "github.get-workflow-runs"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
  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"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: query
          operations:
            - name: get-workflow-runs
              method: GET

Checks GitHub repo at Dow Jones.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at Dow Jones."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at Dow Jones."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repo."
            - name: branch
              in: body
              type: string
              description: "Branch."
          call: "github.get-branch"
          with:
            repo: "{{repo}}"
            branch: "{{branch}}"
          outputParameters:
            - name: sha
              type: string
              mapping: "$.commit.sha"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branches
          path: "/repos/org/{{repo}}/branches/{{branch}}"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch
              method: GET

Retrieves the latest pipeline status and merge request summary for a GitLab project.

naftiko: "0.5"
info:
  label: "GitLab Repository Status"
  description: "Retrieves the latest pipeline status and merge request summary for a GitLab project."
  tags:
    - development
    - gitlab
capability:
  exposes:
    - type: mcp
      namespace: gitlab-ops
      port: 8080
      tools:
        - name: get-project-status
          description: "Fetch latest GitLab pipeline status and open MR count for a project."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The GitLab project ID."
          call: "gitlab.get-project"
          with:
            project_id: "{{project_id}}"
  consumes:
    - type: http
      namespace: gitlab
      baseUri: "https://gitlab.dowjones.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.gitlab_token"
      resources:
        - name: projects
          path: "/projects/{{project_id}}"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET

Retrieves a Google Analytics traffic report for a specified date range and property, returning page views, sessions, and bounce rate.

naftiko: "0.5"
info:
  label: "Google Analytics Report Fetch"
  description: "Retrieves a Google Analytics traffic report for a specified date range and property, returning page views, sessions, and bounce rate."
  tags:
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-analytics-report
          description: "Fetch a Google Analytics report by property ID and date range."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "The GA4 property ID."
            - name: date_from
              in: body
              type: string
              description: "Report start date YYYY-MM-DD."
            - name: date_to
              in: body
              type: string
              description: "Report end date YYYY-MM-DD."
          call: "ga.get-report"
          with:
            property_id: "{{property_id}}"
            date_from: "{{date_from}}"
            date_to: "{{date_to}}"
  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: get-report
              method: POST

Triggers a Google Apps Script function by script ID and function name, and returns the execution result.

naftiko: "0.5"
info:
  label: "Google Apps Script Execution"
  description: "Triggers a Google Apps Script function by script ID and function name, and returns the execution result."
  tags:
    - automation
    - google-apps-script
capability:
  exposes:
    - type: mcp
      namespace: gscript-automation
      port: 8080
      tools:
        - name: run-apps-script
          description: "Execute a Google Apps Script function by script ID and function name."
          inputParameters:
            - name: script_id
              in: body
              type: string
              description: "The Apps Script project ID."
            - name: function_name
              in: body
              type: string
              description: "The function name to execute."
            - name: parameters
              in: body
              type: string
              description: "JSON array of function parameters."
          call: "gscript.run"
          with:
            script_id: "{{script_id}}"
            function: "{{function_name}}"
            parameters: "{{parameters}}"
  consumes:
    - type: http
      namespace: gscript
      baseUri: "https://script.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_apps_script_token"
      resources:
        - name: scripts
          path: "/scripts/{{script_id}}:run"
          inputParameters:
            - name: script_id
              in: path
          operations:
            - name: run
              method: POST

Fetches results from a Google Optimize experiment and returns variant performance metrics.

naftiko: "0.5"
info:
  label: "Google Optimize A/B Test Results"
  description: "Fetches results from a Google Optimize experiment and returns variant performance metrics."
  tags:
    - analytics
    - experimentation
    - google-optimize
capability:
  exposes:
    - type: mcp
      namespace: experimentation
      port: 8080
      tools:
        - name: get-experiment-results
          description: "Retrieve Google Optimize experiment results by experiment ID."
          inputParameters:
            - name: experiment_id
              in: body
              type: string
              description: "The Google Optimize experiment identifier."
          call: "optimize.get-experiment"
          with:
            experiment_id: "{{experiment_id}}"
  consumes:
    - type: http
      namespace: optimize
      baseUri: "https://www.googleapis.com/analytics/v3"
      authentication:
        type: bearer
        token: "$secrets.google_optimize_token"
      resources:
        - name: experiments
          path: "/management/accounts/dowjones/experiments/{{experiment_id}}"
          inputParameters:
            - name: experiment_id
              in: path
          operations:
            - name: get-experiment
              method: GET

Checks Grafana dashboard at Dow Jones.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at Dow Jones."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at Dow Jones."
          inputParameters:
            - name: uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dash"
          with:
            uid: "{{uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.dowjones.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dash
              method: GET

When a SolarWinds critical alert fires, creates a ServiceNow incident, pages the on-call team via Microsoft Teams, and opens a Datadog investigation dashboard.

naftiko: "0.5"
info:
  label: "Incident Response Orchestrator"
  description: "When a SolarWinds critical alert fires, creates a ServiceNow incident, pages the on-call team via Microsoft Teams, and opens a Datadog investigation dashboard."
  tags:
    - incident-response
    - solarwinds
    - servicenow
    - microsoft-teams
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "On critical SolarWinds alert, create incident, page team, and open investigation."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The SolarWinds alert identifier."
            - name: node_name
              in: body
              type: string
              description: "The affected node name."
            - name: severity
              in: body
              type: string
              description: "Alert severity level."
          steps:
            - name: get-alert-detail
              type: call
              call: "solarwinds.get-alert-detail"
              with:
                alert_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Critical alert on {{node_name}}: {{get-alert-detail.message}}"
                severity: "{{severity}}"
                assigned_group: "NOC"
                description: "SolarWinds alert {{alert_id}} on {{node_name}}. Details: {{get-alert-detail.message}}"
            - name: page-oncall
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "noc_alerts"
                text: "CRITICAL: {{node_name}} — {{get-alert-detail.message}}. Incident: {{create-incident.number}}. Severity: {{severity}}"
            - name: create-dashboard
              type: call
              call: "datadog.create-dashboard"
              with:
                title: "Investigation: {{node_name}} — {{alert_id}}"
                widgets: '{"node":"{{node_name}}","metric":"system.cpu.user"}'
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.dowjones.com:17778/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: alerts
          path: "/Query"
          operations:
            - name: get-alert-detail
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.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: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: dashboards
          path: "/dashboard"
          operations:
            - name: create-dashboard
              method: POST

Publishes an Instagram story from a CMS-provided image URL and caption, tracking engagement via a Datadog custom metric.

naftiko: "0.5"
info:
  label: "Instagram Story Publish"
  description: "Publishes an Instagram story from a CMS-provided image URL and caption, tracking engagement via a Datadog custom metric."
  tags:
    - social-media
    - publishing
    - instagram
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: social-instagram
      port: 8080
      tools:
        - name: publish-instagram-story
          description: "Post an Instagram story with tracking and publish a Datadog metric."
          inputParameters:
            - name: image_url
              in: body
              type: string
              description: "URL of the image to post."
            - name: caption
              in: body
              type: string
              description: "Story caption text."
          steps:
            - name: create-post
              type: call
              call: "instagram.create-story"
              with:
                image_url: "{{image_url}}"
                caption: "{{caption}}"
            - name: track-metric
              type: call
              call: "datadog.submit-metric"
              with:
                metric: "social.instagram.stories_published"
                value: 1
                tags: "channel:instagram,type:story"
  consumes:
    - type: http
      namespace: instagram
      baseUri: "https://graph.facebook.com/v17.0"
      authentication:
        type: bearer
        token: "$secrets.instagram_token"
      resources:
        - name: stories
          path: "/media"
          operations:
            - name: create-story
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/series"
          operations:
            - name: submit-metric
              method: POST

Escalates IT incidents at Dow Jones via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at Dow Jones via ServiceNow, PagerDuty, and Slack."
  tags:
    - incident-management
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-escalation
      port: 8080
      tools:
        - name: escalate-incident
          description: "Escalate incidents at Dow Jones."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
            - name: severity
              in: body
              type: string
              description: "Severity."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_id: "{{incident_id}}"
            - name: page
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "{{get-incident.description}}"
                urgency: "{{severity}}"
            - name: channel
              type: call
              call: "slack.create-channel"
              with:
                name: "inc-{{incident_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#inc-{{incident_id}}"
                text: "P{{severity}}: {{get-incident.description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST

Retrieves sprint progress at Dow Jones.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at Dow Jones."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at Dow Jones."
          inputParameters:
            - name: project_key
              in: body
              type: string
              description: "Project key."
          call: "jira.get-sprints"
          with:
            project: "{{project_key}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.values[0].name"
            - name: state
              type: string
              mapping: "$.values[0].state"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/agile/1.0"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/board/1/sprint"
          operations:
            - name: get-sprints
              method: GET

Maintains KB at Dow Jones by finding stale articles and notifying owners.

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at Dow Jones by finding stale articles and notifying owners."
  tags:
    - knowledge-management
    - confluence
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: kb-maint
      port: 8080
      tools:
        - name: maintain-kb
          description: "Maintain KB at Dow Jones."
          inputParameters:
            - name: space
              in: body
              type: string
              description: "Confluence space."
            - name: stale_days
              in: body
              type: number
              description: "Days threshold."
          steps:
            - name: find
              type: call
              call: "confluence.search-stale"
              with:
                space: "{{space}}"
                days: "{{stale_days}}"
            - name: notify
              type: call
              call: "email.batch"
              with:
                to: "{{find.owners}}"
                subject: "KB review needed"
            - name: flag
              type: call
              call: "confluence.add-label"
              with:
                pages: "{{find.ids}}"
                label: "needs-review"
            - name: report
              type: call
              call: "slack.post-message"
              with:
                channel: "#kb"
                text: "KB: {{find.count}} stale articles"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://dowjones.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search-stale
              method: GET
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: batch
          path: "/send-batch"
          operations:
            - name: batch
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates KPI digest at Dow Jones from Snowflake, Oracle, Power BI, and email.

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at Dow Jones from Snowflake, Oracle, Power BI, and email."
  tags:
    - reporting
    - kpi
    - snowflake
    - executive
capability:
  exposes:
    - type: mcp
      namespace: kpi-digest
      port: 8080
      tools:
        - name: gen-digest
          description: "Generate KPI digest at Dow Jones."
          inputParameters:
            - name: week
              in: body
              type: string
              description: "Week ending."
            - name: dist
              in: body
              type: string
              description: "Distribution list."
          steps:
            - name: ops
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM kpis WHERE w='{{week}}'"
            - name: fin
              type: call
              call: "oracle.get-summary"
              with:
                period: "{{week}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "exec_kpis"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "{{dist}}"
                subject: "KPIs - {{week}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dowjones.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: fin
          path: "/summary"
          operations:
            - name: get-summary
              method: GET
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks K8s pod health at Dow Jones.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at Dow Jones."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at Dow Jones."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod
              in: body
              type: string
              description: "Pod name."
          call: "k8s.get-pod"
          with:
            namespace: "{{namespace}}"
            pod: "{{pod}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.status.phase"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://k8s.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: pods
          path: "/namespaces/{{namespace}}/pods/{{pod}}"
          inputParameters:
            - name: namespace
              in: path
            - name: pod
              in: path
          operations:
            - name: get-pod
              method: GET

Checks license compliance at Dow Jones via scanning, entitlements, and procurement.

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at Dow Jones via scanning, entitlements, and procurement."
  tags:
    - compliance
    - licensing
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: license-comp
      port: 8080
      tools:
        - name: check-licenses
          description: "Check license compliance at Dow Jones."
          inputParameters:
            - name: software
              in: body
              type: string
              description: "Software."
            - name: vendor
              in: body
              type: string
              description: "Vendor."
          steps:
            - name: scan
              type: call
              call: "assets.installations"
              with:
                sw: "{{software}}"
            - name: entitlements
              type: call
              call: "licenses.get"
              with:
                sw: "{{software}}"
            - name: flag
              type: call
              call: "compliance.flag"
              with:
                installed: "{{scan.count}}"
                entitled: "{{entitlements.count}}"
            - name: procure
              type: call
              call: "servicenow.create-request"
              with:
                type: "license"
                sw: "{{software}}"
  consumes:
    - type: http
      namespace: assets
      baseUri: "https://assets.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_token"
      resources:
        - name: installations
          path: "/installations"
          operations:
            - name: installations
              method: GET
    - type: http
      namespace: licenses
      baseUri: "https://licenses.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.license_token"
      resources:
        - name: ent
          path: "/entitlements"
          operations:
            - name: get
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: overages
          path: "/flag"
          operations:
            - name: flag
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Syndicates a published Dow Jones article to LinkedIn as a company post and tracks impressions via Google Analytics.

naftiko: "0.5"
info:
  label: "LinkedIn Article Syndication"
  description: "Syndicates a published Dow Jones article to LinkedIn as a company post and tracks impressions via Google Analytics."
  tags:
    - publishing
    - social-media
    - linkedin
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: social-syndication
      port: 8080
      tools:
        - name: syndicate-to-linkedin
          description: "Publish a Dow Jones article summary to LinkedIn and tag a GA tracking parameter."
          inputParameters:
            - name: article_id
              in: body
              type: string
              description: "The CMS article identifier."
          steps:
            - name: fetch-article
              type: call
              call: "cms.get-article"
              with:
                article_id: "{{article_id}}"
            - name: post-linkedin
              type: call
              call: "linkedin.create-post"
              with:
                text: "{{fetch-article.headline}} — {{fetch-article.summary}} {{fetch-article.url}}?utm_source=linkedin"
  consumes:
    - type: http
      namespace: cms
      baseUri: "https://cms.dowjones.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.cms_token"
      resources:
        - name: articles
          path: "/articles/{{article_id}}"
          inputParameters:
            - name: article_id
              in: path
          operations:
            - name: get-article
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST

Checks device compliance status in Microsoft Endpoint Manager and returns compliance state, OS version, and last check-in time.

naftiko: "0.5"
info:
  label: "Microsoft Endpoint Manager Device Compliance"
  description: "Checks device compliance status in Microsoft Endpoint Manager and returns compliance state, OS version, and last check-in time."
  tags:
    - security
    - devices
    - microsoft-endpoint-manager
capability:
  exposes:
    - type: mcp
      namespace: device-compliance
      port: 8080
      tools:
        - name: check-device-compliance
          description: "Check Microsoft Endpoint Manager compliance for a device by device ID."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "The Intune managed device ID."
          call: "intune.get-device-compliance"
          with:
            device_id: "{{device_id}}"
  consumes:
    - type: http
      namespace: intune
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: devices
          path: "/deviceManagement/managedDevices/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-device-compliance
              method: GET

Generates a formatted Microsoft Office document from a template stored in SharePoint, populates with data, and returns the download URL.

naftiko: "0.5"
info:
  label: "Microsoft Office Document Generation"
  description: "Generates a formatted Microsoft Office document from a template stored in SharePoint, populates with data, and returns the download URL."
  tags:
    - content
    - microsoft-office
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-generation
      port: 8080
      tools:
        - name: generate-document
          description: "Generate an Office document from a SharePoint template with data merge."
          inputParameters:
            - name: template_path
              in: body
              type: string
              description: "SharePoint path to the document template."
            - name: data
              in: body
              type: string
              description: "JSON data to merge into the template."
          steps:
            - name: get-template
              type: call
              call: "sharepoint.get-file"
              with:
                site_id: "templates_site"
                file_path: "{{template_path}}"
            - name: generate-doc
              type: call
              call: "sharepoint.create-file-from-template"
              with:
                site_id: "templates_site"
                template_url: "{{get-template.download_url}}"
                data: "{{data}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET
            - name: create-file-from-template
              method: POST

Generates monthly security reports at Dow Jones from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at Dow Jones from Splunk and Qualys."
  tags:
    - security
    - reporting
    - splunk
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: sec-report
      port: 8080
      tools:
        - name: gen-sec-report
          description: "Generate security report at Dow Jones."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "Month."
          steps:
            - name: splunk
              type: call
              call: "splunk.search"
              with:
                query: "index=security earliest=-30d"
            - name: scans
              type: call
              call: "qualys.results"
              with:
                month: "{{month}}"
            - name: compile
              type: call
              call: "analytics.compile-security"
              with:
                events: "{{splunk.count}}"
                vulns: "{{scans.critical}}"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "ciso@co.com"
                subject: "Security - {{month}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.dowjones.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: results
          path: "/fo/scan/results"
          operations:
            - name: results
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: security
          path: "/compile"
          operations:
            - name: compile-security
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Onboards employees at Dow Jones with Okta, ServiceNow, Slack, and calendar.

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at Dow Jones with Okta, ServiceNow, Slack, and calendar."
  tags:
    - hr
    - onboarding
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: it-onboarding
      port: 8080
      tools:
        - name: onboard-employee
          description: "Onboard employees at Dow Jones."
          inputParameters:
            - name: name
              in: body
              type: string
              description: "Name."
            - name: dept
              in: body
              type: string
              description: "Department."
            - name: start
              in: body
              type: string
              description: "Start date."
          steps:
            - name: okta
              type: call
              call: "okta.create-user"
              with:
                name: "{{name}}"
                department: "{{dept}}"
            - name: equip
              type: call
              call: "servicenow.create-request"
              with:
                type: "new_hire"
                for: "{{name}}"
            - name: slack
              type: call
              call: "slack.invite"
              with:
                email: "{{okta.email}}"
            - name: orient
              type: call
              call: "calendar.create-event"
              with:
                title: "Orientation - {{name}}"
                date: "{{start}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dowjones.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: users
          path: "/users.admin.invite"
          operations:
            - name: invite
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/hr/events"
          operations:
            - name: create-event
              method: POST

Checks New Relic APM at Dow Jones.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at Dow Jones."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at Dow Jones."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "App ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: health
              type: string
              mapping: "$.application.health_status"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Aggregates Google Analytics page metrics, Elasticsearch article counts, and Salesforce subscription conversions to build a daily newsroom performance snapshot and posts it to Microsoft Teams.

naftiko: "0.5"
info:
  label: "Newsroom Performance Dashboard"
  description: "Aggregates Google Analytics page metrics, Elasticsearch article counts, and Salesforce subscription conversions to build a daily newsroom performance snapshot and posts it to Microsoft Teams."
  tags:
    - analytics
    - news
    - google-analytics
    - elasticsearch
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: newsroom-dashboard
      port: 8080
      tools:
        - name: build-daily-snapshot
          description: "Aggregate metrics from GA, Elasticsearch, and Salesforce, then post summary to Teams."
          inputParameters:
            - name: date
              in: body
              type: string
              description: "Snapshot date YYYY-MM-DD."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel for the summary."
          steps:
            - name: get-traffic
              type: call
              call: "ga.get-report"
              with:
                property_id: "dj_web_property"
                date_from: "{{date}}"
                date_to: "{{date}}"
            - name: get-article-count
              type: call
              call: "elasticsearch.count"
              with:
                index: "articles"
                date: "{{date}}"
            - name: get-conversions
              type: call
              call: "salesforce.get-conversions"
              with:
                date: "{{date}}"
            - name: post-summary
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{channel_id}}"
                text: "Daily Snapshot ({{date}}): {{get-traffic.sessions}} sessions, {{get-article-count.count}} articles, {{get-conversions.total}} conversions."
  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: get-report
              method: POST
    - type: http
      namespace: elasticsearch
      baseUri: "https://search.dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token"
      resources:
        - name: count
          path: "/{{index}}/_count"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: count
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://dowjones.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: conversions
          path: "/query"
          operations:
            - name: get-conversions
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks Okta user at Dow Jones.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at Dow Jones."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at Dow Jones."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Email."
          call: "okta.get-user"
          with:
            email: "{{email}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://dowjones.com.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{email}}"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves cost and usage data from Oracle Cloud for a specified compartment and date range.

naftiko: "0.5"
info:
  label: "Oracle Cloud Cost Reporting"
  description: "Retrieves cost and usage data from Oracle Cloud for a specified compartment and date range."
  tags:
    - finance
    - cloud
    - oracle-cloud
capability:
  exposes:
    - type: mcp
      namespace: cloud-costs
      port: 8080
      tools:
        - name: get-cloud-costs
          description: "Fetch Oracle Cloud cost and usage data by compartment and date range."
          inputParameters:
            - name: compartment_id
              in: body
              type: string
              description: "The Oracle Cloud compartment OCID."
            - name: start_date
              in: body
              type: string
              description: "Start date YYYY-MM-DD."
            - name: end_date
              in: body
              type: string
              description: "End date YYYY-MM-DD."
          call: "oraclecloud.get-usage"
          with:
            compartment_id: "{{compartment_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
  consumes:
    - type: http
      namespace: oraclecloud
      baseUri: "https://usageapi.us-ashburn-1.oci.oraclecloud.com/20200107"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: usage
          path: "/usage"
          operations:
            - name: get-usage
              method: POST

Checks on-call at Dow Jones.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at Dow Jones."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at Dow Jones."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user
              type: string
              mapping: "$.oncalls[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Queries Palo Alto Networks for threat intelligence on an IP address or domain and returns threat classification, severity, and associated campaigns.

naftiko: "0.5"
info:
  label: "Palo Alto Networks Threat Intelligence"
  description: "Queries Palo Alto Networks for threat intelligence on an IP address or domain and returns threat classification, severity, and associated campaigns."
  tags:
    - security
    - threat-intelligence
    - palo-alto-networks
capability:
  exposes:
    - type: mcp
      namespace: threat-intel
      port: 8080
      tools:
        - name: query-threat-intel
          description: "Look up threat intelligence for an indicator in Palo Alto Networks."
          inputParameters:
            - name: indicator
              in: body
              type: string
              description: "IP address or domain to investigate."
            - name: indicator_type
              in: body
              type: string
              description: "Type of indicator (ip, domain, url)."
          call: "paloalto.get-threat-intel"
          with:
            indicator: "{{indicator}}"
            type: "{{indicator_type}}"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://api.paloaltonetworks.com/v1"
      authentication:
        type: bearer
        token: "$secrets.paloalto_token"
      resources:
        - name: threats
          path: "/threats/{{indicator}}"
          inputParameters:
            - name: indicator
              in: path
          operations:
            - name: get-threat-intel
              method: GET

Searches the PeopleSoft employee directory by name or employee ID and returns contact information, department, and location.

naftiko: "0.5"
info:
  label: "PeopleSoft Employee Directory Lookup"
  description: "Searches the PeopleSoft employee directory by name or employee ID and returns contact information, department, and location."
  tags:
    - hr
    - peoplesoft
capability:
  exposes:
    - type: mcp
      namespace: employee-directory
      port: 8080
      tools:
        - name: search-employee
          description: "Search PeopleSoft employee directory by name or ID."
          inputParameters:
            - name: search_term
              in: body
              type: string
              description: "Employee name or ID to search."
          call: "peoplesoft.search-employees"
          with:
            query: "{{search_term}}"
  consumes:
    - type: http
      namespace: peoplesoft
      baseUri: "https://peoplesoft.dowjones.com/PSIGW/RESTListeningConnector/PSFT_HR"
      authentication:
        type: basic
        username: "$secrets.peoplesoft_user"
        password: "$secrets.peoplesoft_password"
      resources:
        - name: employees
          path: "/employees"
          operations:
            - name: search-employees
              method: GET

Assigns a Pluralsight learning path to employees by department from PeopleSoft and tracks completion in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pluralsight Training Assignment"
  description: "Assigns a Pluralsight learning path to employees by department from PeopleSoft and tracks completion in Microsoft Teams."
  tags:
    - learning
    - pluralsight
    - peoplesoft
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: training
      port: 8080
      tools:
        - name: assign-training
          description: "Assign a Pluralsight path to a department and notify via Teams."
          inputParameters:
            - name: department_id
              in: body
              type: string
              description: "PeopleSoft department identifier."
            - name: path_id
              in: body
              type: string
              description: "Pluralsight learning path ID."
          steps:
            - name: get-department
              type: call
              call: "peoplesoft.get-department"
              with:
                department_id: "{{department_id}}"
            - name: assign-path
              type: call
              call: "pluralsight.assign-path"
              with:
                path_id: "{{path_id}}"
                emails: "{{get-department.employee_emails}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "learning_dev"
                text: "New training assigned: Pluralsight path {{path_id}} for {{get-department.name}} ({{get-department.employee_count}} employees)."
  consumes:
    - type: http
      namespace: peoplesoft
      baseUri: "https://peoplesoft.dowjones.com/PSIGW/RESTListeningConnector/PSFT_HR"
      authentication:
        type: basic
        username: "$secrets.peoplesoft_user"
        password: "$secrets.peoplesoft_password"
      resources:
        - name: departments
          path: "/departments/{{department_id}}"
          inputParameters:
            - name: department_id
              in: path
          operations:
            - name: get-department
              method: GET
    - type: http
      namespace: pluralsight
      baseUri: "https://api.pluralsight.com/v1"
      authentication:
        type: bearer
        token: "$secrets.pluralsight_token"
      resources:
        - name: assignments
          path: "/assignments"
          operations:
            - name: assign-path
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Creates postmortems at Dow Jones.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at Dow Jones."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at Dow Jones."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          steps:
            - name: timeline
              type: call
              call: "pagerduty.get-log"
              with:
                id: "{{incident_id}}"
            - name: metrics
              type: call
              call: "datadog.get-metrics"
              with:
                incident: "{{incident_id}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Postmortem: {{timeline.title}}"
                body: "Impact: {{metrics.impact}}"
            - name: review
              type: call
              call: "calendar.create-event"
              with:
                title: "Review: {{timeline.title}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}/log_entries"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-log
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://dowjones.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Checks Power BI refresh at Dow Jones.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at Dow Jones."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at Dow Jones."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "power-bi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Generates compliance reports at Dow Jones from Snowflake, Power BI, and email.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at Dow Jones from Snowflake, Power BI, and email."
  tags:
    - compliance
    - reporting
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: compliance-rpt
      port: 8080
      tools:
        - name: gen-report
          description: "Generate compliance reports at Dow Jones."
          inputParameters:
            - name: quarter
              in: body
              type: string
              description: "Quarter."
            - name: type
              in: body
              type: string
              description: "Type."
          steps:
            - name: data
              type: call
              call: "snowflake.query"
              with:
                query: "SELECT * FROM compliance WHERE q='{{quarter}}'"
            - name: metrics
              type: call
              call: "analytics.compute"
              with:
                data: "{{data.results}}"
            - name: refresh
              type: call
              call: "power-bi.refresh"
              with:
                dataset: "compliance"
            - name: send
              type: call
              call: "email.send"
              with:
                to: "compliance@co.com"
                subject: "{{type}} - {{quarter}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://dowjones.com.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: query
              method: POST
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: metrics
          path: "/compute"
          operations:
            - name: compute
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks Redis at Dow Jones.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at Dow Jones."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at Dow Jones."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "redis.get-info"
          with:
            instance: "{{instance}}"
          outputParameters:
            - name: memory
              type: string
              mapping: "$.used_memory_human"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: instances
          path: "/instances/{{instance}}/info"
          inputParameters:
            - name: instance
              in: path
          operations:
            - name: get-info
              method: GET

Checks release readiness at Dow Jones.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at Dow Jones."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at Dow Jones."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Release ID."
            - name: project
              in: body
              type: string
              description: "Project."
          steps:
            - name: tests
              type: call
              call: "azdo.get-tests"
              with:
                project: "{{project}}"
                release: "{{release_id}}"
            - name: quality
              type: call
              call: "sonarqube.get-gate"
              with:
                project: "{{project}}"
            - name: security
              type: call
              call: "security.get-scan"
              with:
                project: "{{project}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Release - {{release_id}}"
                body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/dowjones.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: tests
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-tests
              method: GET
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.dowjones.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality
          path: "/qualitygates/project_status"
          operations:
            - name: get-gate
              method: GET
    - type: http
      namespace: security
      baseUri: "https://security.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: scans
          path: "/results"
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://dowjones.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Creates a new lead in Salesforce from an inbound subscription inquiry and notifies the sales team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Lead Capture"
  description: "Creates a new lead in Salesforce from an inbound subscription inquiry and notifies the sales team in Microsoft Teams."
  tags:
    - sales
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sales-leads
      port: 8080
      tools:
        - name: capture-lead
          description: "Create a Salesforce lead from inquiry data and notify the sales team."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "Lead email address."
            - name: company
              in: body
              type: string
              description: "Lead company name."
            - name: source
              in: body
              type: string
              description: "Lead source (web, event, referral)."
          steps:
            - name: create-lead
              type: call
              call: "salesforce.create-lead"
              with:
                email: "{{email}}"
                company: "{{company}}"
                source: "{{source}}"
            - name: notify-sales
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "sales_leads"
                text: "New lead from {{company}} ({{source}}): {{email}}. SF ID: {{create-lead.id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://dowjones.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: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Initiates the SAP monthly financial close process, validates balances against Oracle Cloud, and generates a Crystal Reports summary for the finance team via SharePoint.

naftiko: "0.5"
info:
  label: "SAP Financial Close Orchestrator"
  description: "Initiates the SAP monthly financial close process, validates balances against Oracle Cloud, and generates a Crystal Reports summary for the finance team via SharePoint."
  tags:
    - finance
    - sap
    - oracle-cloud
    - crystal-reports
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: financial-close
      port: 8080
      tools:
        - name: run-financial-close
          description: "Execute monthly close in SAP, cross-check Oracle, and generate finance report."
          inputParameters:
            - name: period
              in: body
              type: string
              description: "The fiscal period (e.g., 2026-03)."
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
          steps:
            - name: close-period
              type: call
              call: "sap.close-period"
              with:
                period: "{{period}}"
                company_code: "{{company_code}}"
            - name: validate-oracle
              type: call
              call: "oraclecloud.get-balances"
              with:
                period: "{{period}}"
            - name: generate-report
              type: call
              call: "crystal.generate-report"
              with:
                template_id: "monthly_close"
                parameters: '{"period":"{{period}}","sap_balance":"{{close-period.balance}}","oracle_balance":"{{validate-oracle.balance}}"}'
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "finance_site"
                folder_path: "MonthlyClose/{{period}}"
                file_name: "close_report_{{period}}.pdf"
                content: "{{generate-report.output_url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dowjones-sap.s4hana.cloud/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: periods
          path: "/financial-close"
          operations:
            - name: close-period
              method: POST
    - type: http
      namespace: oraclecloud
      baseUri: "https://usageapi.us-ashburn-1.oci.oraclecloud.com/20200107"
      authentication:
        type: bearer
        token: "$secrets.oracle_cloud_token"
      resources:
        - name: balances
          path: "/balances"
          operations:
            - name: get-balances
              method: POST
    - type: http
      namespace: crystal
      baseUri: "https://reports.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.crystal_reports_token"
      resources:
        - name: reports
          path: "/reports/generate"
          operations:
            - name: generate-report
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Checks SAP PO at Dow Jones.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at Dow Jones."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at Dow Jones."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "PO number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: vendor
              type: string
              mapping: "$.order.vendor"
            - name: status
              type: string
              mapping: "$.order.status"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: purchase-orders
          path: "/purchase-orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Remediates vulnerabilities at Dow Jones via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at Dow Jones via scanning, Jira, and Slack."
  tags:
    - security
    - vulnerability-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vuln-fix
      port: 8080
      tools:
        - name: remediate
          description: "Fix vulnerabilities at Dow Jones."
          inputParameters:
            - name: target
              in: body
              type: string
              description: "Target."
            - name: policy
              in: body
              type: string
              description: "Policy."
          steps:
            - name: scan
              type: call
              call: "qualys.scan"
              with:
                target: "{{target}}"
                policy: "{{policy}}"
            - name: prioritize
              type: call
              call: "security.prioritize"
              with:
                scan: "{{scan.id}}"
            - name: ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "SEC"
                summary: "Vulns: {{prioritize.critical}} critical"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#security"
                text: "Scan: {{prioritize.critical}} critical"
  consumes:
    - type: http
      namespace: qualys
      baseUri: "https://qualysapi.qualys.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.qualys_token"
      resources:
        - name: scans
          path: "/fo/scan"
          operations:
            - name: scan
              method: POST
    - type: http
      namespace: security
      baseUri: "https://security.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: vulns
          path: "/prioritize"
          operations:
            - name: prioritize
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://dowjones.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks IT incident in ServiceNow for Dow Jones.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for Dow Jones."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at Dow Jones."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Fetches a document from a SharePoint site by path and returns the file metadata and download URL.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Fetches a document from a SharePoint site by path and returns the file metadata and download URL."
  tags:
    - content
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: document-mgmt
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a SharePoint document by site and file path."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site identifier."
            - name: file_path
              in: body
              type: string
              description: "Path to the document within the site."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: get-file
              method: GET

Retrieves SharePoint metadata at Dow Jones.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at Dow Jones."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at Dow Jones."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "Path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            path: "{{file_path}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: number
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET

Monitors SLAs at Dow Jones via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at Dow Jones via Datadog and Slack."
  tags:
    - operations
    - sla
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sla-monitor
      port: 8080
      tools:
        - name: check-sla
          description: "Monitor SLAs at Dow Jones."
          inputParameters:
            - name: service
              in: body
              type: string
              description: "Service."
            - name: target
              in: body
              type: number
              description: "SLA target %."
          steps:
            - name: metrics
              type: call
              call: "datadog.get-sla"
              with:
                service: "{{service}}"
            - name: check
              type: call
              call: "analytics.check-sla"
              with:
                uptime: "{{metrics.uptime}}"
                target: "{{target}}"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#ops"
                text: "SLA: {{service}} at {{metrics.uptime}}% (target: {{target}}%)"
            - name: log
              type: call
              call: "servicenow.create-incident"
              with:
                desc: "SLA breach: {{service}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/metrics"
          operations:
            - name: get-sla
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://dowjones.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves the current alert status from SolarWinds for a monitored node and returns severity, message, and timestamp.

naftiko: "0.5"
info:
  label: "SolarWinds Infrastructure Alert"
  description: "Retrieves the current alert status from SolarWinds for a monitored node and returns severity, message, and timestamp."
  tags:
    - infrastructure
    - monitoring
    - solarwinds
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-node-alerts
          description: "Fetch active alerts for a SolarWinds monitored node."
          inputParameters:
            - name: node_id
              in: body
              type: string
              description: "The SolarWinds node identifier."
          call: "solarwinds.get-alerts"
          with:
            node_id: "{{node_id}}"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.dowjones.com:17778/SolarWinds/InformationService/v3/Json"
      authentication:
        type: basic
        username: "$secrets.solarwinds_user"
        password: "$secrets.solarwinds_password"
      resources:
        - name: alerts
          path: "/Query"
          operations:
            - name: get-alerts
              method: POST

Exports a Sparx Enterprise Architect model package as XMI and uploads it to SharePoint for architecture review.

naftiko: "0.5"
info:
  label: "Sparx Enterprise Architect Model Export"
  description: "Exports a Sparx Enterprise Architect model package as XMI and uploads it to SharePoint for architecture review."
  tags:
    - architecture
    - sparx-enterprise-architect
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: architecture-models
      port: 8080
      tools:
        - name: export-model
          description: "Export a Sparx EA model package and store in SharePoint."
          inputParameters:
            - name: package_id
              in: body
              type: string
              description: "The Sparx EA package GUID."
            - name: output_folder
              in: body
              type: string
              description: "SharePoint folder for the export."
          steps:
            - name: export-package
              type: call
              call: "sparxea.export-package"
              with:
                package_id: "{{package_id}}"
            - name: upload-export
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "architecture_site"
                folder_path: "{{output_folder}}"
                file_name: "{{export-package.file_name}}"
                content: "{{export-package.xmi_url}}"
  consumes:
    - type: http
      namespace: sparxea
      baseUri: "https://sparxea.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sparxea_token"
      resources:
        - name: packages
          path: "/packages/{{package_id}}/export"
          inputParameters:
            - name: package_id
              in: path
          operations:
            - name: export-package
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Searches Splunk at Dow Jones.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at Dow Jones."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at Dow Jones."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "SPL query."
          call: "splunk.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.results.count"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.dowjones.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Pulls subscriber engagement data from Google Analytics and SAP subscription records, runs a churn prediction in Azure Databricks, and creates a retention campaign in Salesforce.

naftiko: "0.5"
info:
  label: "Subscriber Churn Prediction Pipeline"
  description: "Pulls subscriber engagement data from Google Analytics and SAP subscription records, runs a churn prediction in Azure Databricks, and creates a retention campaign in Salesforce."
  tags:
    - subscriptions
    - analytics
    - google-analytics
    - sap
    - azure-databricks
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: churn-prediction
      port: 8080
      tools:
        - name: predict-churn
          description: "Run churn prediction for a subscriber segment and create retention campaigns."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "The subscriber segment identifier."
            - name: date_range
              in: body
              type: string
              description: "Analysis date range (e.g., last_30d)."
          steps:
            - name: get-engagement
              type: call
              call: "ga.get-report"
              with:
                property_id: "dj_subscriber_property"
                date_from: "{{date_range}}"
                date_to: "today"
            - name: get-subscriptions
              type: call
              call: "sap.get-segment"
              with:
                segment_id: "{{segment_id}}"
            - name: run-prediction
              type: call
              call: "databricks.submit-job"
              with:
                job_name: "churn_prediction"
                parameters: '{"segment":"{{segment_id}}","engagement":"{{get-engagement.summary}}"}'
            - name: create-campaign
              type: call
              call: "salesforce.create-campaign"
              with:
                name: "Retention — {{segment_id}}"
                description: "Auto-generated retention campaign. Churn risk: {{run-prediction.risk_score}}"
  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: get-report
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://dowjones-sap.s4hana.cloud/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: segments
          path: "/segments/{{segment_id}}"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: get-segment
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://eastus.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: submit-job
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://dowjones.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign"
          operations:
            - name: create-campaign
              method: POST

When a subscription nears expiration in SAP, sends a renewal reminder via Microsoft Outlook, creates a follow-up task in Salesforce, and logs the outreach in Datadog.

naftiko: "0.5"
info:
  label: "Subscriber Renewal Orchestrator"
  description: "When a subscription nears expiration in SAP, sends a renewal reminder via Microsoft Outlook, creates a follow-up task in Salesforce, and logs the outreach in Datadog."
  tags:
    - subscriptions
    - renewals
    - sap
    - microsoft-outlook
    - salesforce
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: renewals
      port: 8080
      tools:
        - name: trigger-renewal-outreach
          description: "Send renewal reminders, create follow-up tasks, and log the outreach."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The SAP subscription account ID."
            - name: subscriber_email
              in: body
              type: string
              description: "Subscriber email address."
          steps:
            - name: get-subscription
              type: call
              call: "sap.get-subscription"
              with:
                account_id: "{{account_id}}"
            - name: send-reminder
              type: call
              call: "outlook.send-email"
              with:
                to: "{{subscriber_email}}"
                subject: "Your Dow Jones subscription expires {{get-subscription.expiry_date}}"
                body: "Dear subscriber, your {{get-subscription.plan_name}} plan expires on {{get-subscription.expiry_date}}. Renew now to maintain access."
            - name: create-task
              type: call
              call: "salesforce.create-task"
              with:
                subject: "Renewal follow-up: {{account_id}}"
                description: "Subscription {{get-subscription.plan_name}} expiring {{get-subscription.expiry_date}}."
                due_date: "{{get-subscription.expiry_date}}"
            - name: log-outreach
              type: call
              call: "datadog.send-event"
              with:
                title: "Renewal outreach: {{account_id}}"
                text: "Reminder sent to {{subscriber_email}} for plan {{get-subscription.plan_name}}"
                tags: "renewals,subscriptions"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dowjones-sap.s4hana.cloud/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: subscriptions
          path: "/subscriptions/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-subscription
              method: GET
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@dowjones.com/sendMail"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://dowjones.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: events
          path: "/events"
          operations:
            - name: send-event
              method: POST

Creates a new digital subscription in SAP, provisions access in Azure Active Directory, and sends the welcome email via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Subscription Activation"
  description: "Creates a new digital subscription in SAP, provisions access in Azure Active Directory, and sends the welcome email via Microsoft Outlook."
  tags:
    - subscriptions
    - sap
    - azure-active-directory
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: subscriptions
      port: 8080
      tools:
        - name: activate-subscription
          description: "Given subscriber details, create the SAP subscription record, provision AD access, and send welcome email."
          inputParameters:
            - name: subscriber_email
              in: body
              type: string
              description: "The subscriber email address."
            - name: plan_id
              in: body
              type: string
              description: "The subscription plan identifier."
            - name: subscriber_name
              in: body
              type: string
              description: "Full name of the subscriber."
          steps:
            - name: create-subscription
              type: call
              call: "sap.create-subscription"
              with:
                email: "{{subscriber_email}}"
                plan_id: "{{plan_id}}"
                name: "{{subscriber_name}}"
            - name: provision-access
              type: call
              call: "azuread.create-user"
              with:
                email: "{{subscriber_email}}"
                display_name: "{{subscriber_name}}"
                group: "subscribers_{{plan_id}}"
            - name: send-welcome
              type: call
              call: "outlook.send-email"
              with:
                to: "{{subscriber_email}}"
                subject: "Welcome to Dow Jones — Your subscription is active"
                body: "Dear {{subscriber_name}}, your {{plan_id}} subscription is now active. Account ID: {{create-subscription.account_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://dowjones-sap.s4hana.cloud/api/v1"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: subscriptions
          path: "/subscriptions"
          operations:
            - name: create-subscription
              method: POST
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/noreply@dowjones.com/sendMail"
          operations:
            - name: send-email
              method: POST

Retrieves Teams activity at Dow Jones.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at Dow Jones."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at Dow Jones."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
          call: "teams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Triggers a Terraform plan for a specified workspace, retrieves the plan output, and posts a summary to Microsoft Teams for approval.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Plan"
  description: "Triggers a Terraform plan for a specified workspace, retrieves the plan output, and posts a summary to Microsoft Teams for approval."
  tags:
    - infrastructure
    - terraform
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-automation
      port: 8080
      tools:
        - name: run-terraform-plan
          description: "Trigger a Terraform plan and post the summary to Teams for review."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID."
            - name: team_channel
              in: body
              type: string
              description: "Teams channel for plan review."
          steps:
            - name: create-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                plan_only: true
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{team_channel}}"
                text: "Terraform plan ready for {{workspace_id}}: {{create-run.resource_additions}} additions, {{create-run.resource_changes}} changes, {{create-run.resource_destructions}} destructions. Run ID: {{create-run.id}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks Terraform workspace at Dow Jones.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at Dow Jones."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at Dow Jones."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Workspace ID."
          call: "terraform.get-ws"
          with:
            workspace_id: "{{workspace_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.attributes.name"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-ws
              method: GET

Fetches the latest bond quote from Tradeweb by instrument ISIN and returns bid, ask, yield, and last-traded timestamp.

naftiko: "0.5"
info:
  label: "Tradeweb Bond Quote Lookup"
  description: "Fetches the latest bond quote from Tradeweb by instrument ISIN and returns bid, ask, yield, and last-traded timestamp."
  tags:
    - data
    - trading
    - tradeweb
capability:
  exposes:
    - type: mcp
      namespace: bond-trading
      port: 8080
      tools:
        - name: get-bond-quote
          description: "Look up a Tradeweb bond quote by ISIN. Returns bid, ask, yield, and timestamp."
          inputParameters:
            - name: isin
              in: body
              type: string
              description: "The bond ISIN identifier."
          call: "tradeweb.get-quote"
          with:
            isin: "{{isin}}"
  consumes:
    - type: http
      namespace: tradeweb
      baseUri: "https://api.tradeweb.com/v1"
      authentication:
        type: bearer
        token: "$secrets.tradeweb_token"
      resources:
        - name: quotes
          path: "/quotes/{{isin}}"
          inputParameters:
            - name: isin
              in: path
          operations:
            - name: get-quote
              method: GET

Checks Vault secret at Dow Jones.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at Dow Jones."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at Dow Jones."
          inputParameters:
            - name: path
              in: body
              type: string
              description: "Secret path."
          call: "vault.get-metadata"
          with:
            path: "{{path}}"
          outputParameters:
            - name: version
              type: number
              mapping: "$.data.current_version"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.dowjones.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/metadata/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: get-metadata
              method: GET

Processes invoices at Dow Jones via OCR, SAP matching, approval, and Oracle recording.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at Dow Jones via OCR, SAP matching, approval, and Oracle recording."
  tags:
    - finance
    - accounts-payable
    - sap
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: invoice-proc
      port: 8080
      tools:
        - name: process-invoice
          description: "Process invoices at Dow Jones."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Invoice ID."
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
          steps:
            - name: extract
              type: call
              call: "ocr.extract"
              with:
                doc: "{{invoice_id}}"
            - name: match
              type: call
              call: "sap.match-po"
              with:
                vendor: "{{vendor_id}}"
                amount: "{{extract.total}}"
            - name: approve
              type: call
              call: "workflow.submit"
              with:
                invoice: "{{invoice_id}}"
            - name: record
              type: call
              call: "oracle.create-payment"
              with:
                invoice: "{{invoice_id}}"
  consumes:
    - type: http
      namespace: ocr
      baseUri: "https://ocr.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.ocr_token"
      resources:
        - name: invoices
          path: "/extract"
          operations:
            - name: extract
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://sap.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: pos
          path: "/match"
          operations:
            - name: match-po
              method: POST
    - type: http
      namespace: workflow
      baseUri: "https://workflow.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workflow_token"
      resources:
        - name: approvals
          path: "/submit"
          operations:
            - name: submit
              method: POST
    - type: http
      namespace: oracle
      baseUri: "https://oracle.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Reviews vendors at Dow Jones.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at Dow Jones."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at Dow Jones."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter."
          steps:
            - name: perf
              type: call
              call: "procurement.get-metrics"
              with:
                vendor: "{{vendor_id}}"
                q: "{{quarter}}"
            - name: scorecard
              type: call
              call: "analytics.scorecard"
              with:
                data: "{{perf.data}}"
            - name: invite
              type: call
              call: "email.send"
              with:
                to: "{{perf.contact}}"
                subject: "QBR - {{quarter}}"
            - name: schedule
              type: call
              call: "calendar.create-event"
              with:
                title: "QBR - {{perf.name}}"
  consumes:
    - type: http
      namespace: procurement
      baseUri: "https://procurement.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor}}/metrics"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: scorecards
          path: "/compute"
          operations:
            - name: scorecard
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/proc/events"
          operations:
            - name: create-event
              method: POST

Checks the latest Veritas InfoScale backup job status for a given volume group and returns completion state and size.

naftiko: "0.5"
info:
  label: "Veritas InfoScale Backup Status"
  description: "Checks the latest Veritas InfoScale backup job status for a given volume group and returns completion state and size."
  tags:
    - infrastructure
    - backup
    - veritas-infoscale
capability:
  exposes:
    - type: mcp
      namespace: backup-status
      port: 8080
      tools:
        - name: get-backup-status
          description: "Fetch Veritas InfoScale backup job status for a volume group."
          inputParameters:
            - name: volume_group
              in: body
              type: string
              description: "The Veritas InfoScale volume group name."
          call: "veritas.get-backup-status"
          with:
            volume_group: "{{volume_group}}"
  consumes:
    - type: http
      namespace: veritas
      baseUri: "https://veritas.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.veritas_token"
      resources:
        - name: backups
          path: "/volume-groups/{{volume_group}}/backups/latest"
          inputParameters:
            - name: volume_group
              in: path
          operations:
            - name: get-backup-status
              method: GET

Triggers a WebSphere application deployment, monitors the deployment status, and sends a completion notification to Microsoft Teams.

naftiko: "0.5"
info:
  label: "WebSphere Application Deployment"
  description: "Triggers a WebSphere application deployment, monitors the deployment status, and sends a completion notification to Microsoft Teams."
  tags:
    - deployment
    - websphere
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: app-deployment
      port: 8080
      tools:
        - name: deploy-application
          description: "Deploy an application to WebSphere and notify the team on completion."
          inputParameters:
            - name: app_name
              in: body
              type: string
              description: "The application name to deploy."
            - name: version
              in: body
              type: string
              description: "The application version."
            - name: team_channel
              in: body
              type: string
              description: "Teams channel for deployment notification."
          steps:
            - name: trigger-deploy
              type: call
              call: "websphere.deploy-app"
              with:
                app_name: "{{app_name}}"
                version: "{{version}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{team_channel}}"
                text: "Deployment complete: {{app_name}} v{{version}} — Status: {{trigger-deploy.status}}"
  consumes:
    - type: http
      namespace: websphere
      baseUri: "https://websphere.dowjones.com/IBMJMXConnectorREST/mbeans"
      authentication:
        type: basic
        username: "$secrets.websphere_user"
        password: "$secrets.websphere_password"
      resources:
        - name: deployments
          path: "/deployments"
          operations:
            - name: deploy-app
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves employee profile from Workday for Dow Jones.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for Dow Jones."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up Dow Jones employee in Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Employee ID."
          call: "workday.get-worker"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.worker.name"
            - name: title
              type: string
              mapping: "$.worker.title"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5.dowjones.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET

Uploads a video to YouTube from an editorial brief, creates the listing metadata, and shares the link across Twitter and LinkedIn.

naftiko: "0.5"
info:
  label: "YouTube Video Upload Pipeline"
  description: "Uploads a video to YouTube from an editorial brief, creates the listing metadata, and shares the link across Twitter and LinkedIn."
  tags:
    - publishing
    - video
    - youtube
    - twitter
    - linkedin
capability:
  exposes:
    - type: mcp
      namespace: video-publishing
      port: 8080
      tools:
        - name: publish-video
          description: "Upload a video to YouTube and distribute links to social channels."
          inputParameters:
            - name: video_url
              in: body
              type: string
              description: "URL of the video file to upload."
            - name: title
              in: body
              type: string
              description: "Video title."
            - name: description
              in: body
              type: string
              description: "Video description."
          steps:
            - name: upload-video
              type: call
              call: "youtube.upload-video"
              with:
                video_url: "{{video_url}}"
                title: "{{title}}"
                description: "{{description}}"
            - name: share-twitter
              type: call
              call: "twitter.create-tweet"
              with:
                text: "NEW VIDEO: {{title}} — Watch now: {{upload-video.url}}"
            - name: share-linkedin
              type: call
              call: "linkedin.create-post"
              with:
                text: "New video from Dow Jones: {{title}} — {{upload-video.url}}"
  consumes:
    - type: http
      namespace: youtube
      baseUri: "https://www.googleapis.com/upload/youtube/v3"
      authentication:
        type: bearer
        token: "$secrets.youtube_token"
      resources:
        - name: videos
          path: "/videos"
          operations:
            - name: upload-video
              method: POST
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_token"
      resources:
        - name: tweets
          path: "/tweets"
          operations:
            - name: create-tweet
              method: POST
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST