mcpField
S
smart-assessment

smart-assessment

github.com/happy-technologies-llcその他4142 回インストール2 日前に更新
リポジトリ

smart-assessment について

ServiceNow の管理者や評価設計者向けに、アンケートの作成、スコアリングや条件付き質問の設定、結果分析を行うスキルです。過去のデータに基づく AI 回答候補の設定方法も扱います。

主な機能

  1. 01複数の設問形式で評価を設計
  2. 02カテゴリの重みとスコア方式を設定
  3. 03回答に応じて質問を表示・非表示
  4. 04過去データに基づく回答候補の提示
  5. 05スコアの集計とベンチマーク分析

活用シーン

  1. 01GRC コンプライアンスリスク評価の作成
  2. 02ベンダー評価アンケートの構築
  3. 03従業員満足度調査の設計
  4. 04部門のセキュリティ・成熟度評価

MCP 対応

MCP ツールを使って評価、カテゴリ、指標を作成し、指標を更新して、結果や評価インスタンスを検索します。バックグラウンドスクリプトによる結果分析にも対応します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill smart-assessment

インストール後、Claude Code で/smart-assessmentを入力して読み込まれたか確認します。

詳細

スマートアセスメントの設定

概要

このスキルでは、スマートな AI 支援機能を備えた ServiceNow Assessments の設定について説明します。以下を取り上げます。

  • 複数のメトリックタイプ(尺度、ブール値、選択肢、テキスト)を使ったアセスメント質問票の設計
  • スコアリングモデルとカテゴリー間の重み付けの設定
  • 過去の回答に応じて質問を表示/非表示にする条件付きロジックの構築
  • 過去のデータから回答を事前入力する AI 支援の回答候補の設定
  • 集計スコアとベンチマークを使ったアセスメント結果の分析
  • アセスメントと GRC リスクプロファイル、HR 人材レビュー、ベンダー評価の統合

使用する場面:

  • GRC コンプライアンス評価向けのリスクアセスメントの作成
  • TPRM プログラム向けのベンダーアセスメント質問票の作成
  • 従業員エンゲージメントまたは満足度調査の設計
  • 部門のコンプライアンスチェック向けのセキュリティ自己評価の設定
  • 能力評価向けの成熟度モデルアセスメントの設定

前提条件

  • ロール: assessment_admin、assessment_creator、または admin
  • プラグイン: com.snc.assessment(Assessment Designer)、GRC 統合にはオプションで com.sn_grc
  • アクセス権: asmt_metric、asmt_assessment、asmt_metric_result テーブルへの読み取り/書き込みアクセス
  • 知識: アセスメント設計の原則、スコアリング手法、評価対象のビジネス領域に関する理解

主なアセスメントテーブル

テーブル用途主なフィールド
asmt_metricアセスメントの質問/メトリックname, metric_type, category, order, weight, mandatory, condition, description, scale_definition
asmt_assessmentアセスメント定義name, description, state, due_date, assessment_type, scoring_type, source_table, category
asmt_metric_result個別の回答/結果metric, assessment_instance, value, string_value, actual_value, scored_value, notes
asmt_metric_typeメトリックタイプの定義name, data_type, scale, choices, validation
asmt_metric_category質問カテゴリー/セクションname, assessment, order, weight, description
asmt_assessment_instanceアセスメントのインスタンス(割り当て済み)assessment, user, state, due_date, score, percent_answered, taken_on
asmt_assessment_instance_question質問ごとのインスタンスデータinstance, metric, response, score, skipped

手順

ステップ 1:アセスメントの構成を設計する

作成前に、カテゴリー、メトリック、スコアリングを含むアセスメントを計画します。

アセスメント設計フレームワーク:

コンポーネント設計上の決定事項選択肢
アセスメントタイプ何を評価しますか?リスク、コンプライアンス、満足度、成熟度、ベンダー
スコアリングタイプ結果をどのように計算しますか?加重平均、合計、最大値、カスタム数式
尺度どのような回答形式を使いますか?1~5 のリッカート尺度、1~10 の数値、はい/いいえ、複数選択
カテゴリー質問をどのようにグループ化しますか?ドメイン別、管理策ファミリー別、トピック領域別
重み付け各セクションの重要度はどの程度ですか?均等な重み付け、リスクベース、カスタム割合
ステップ 2:アセスメント定義を作成する

MCP を使用する(Claude Code/Desktop):

Tool: SN-Create-Record
Parameters:
  table_name: asmt_assessment
  fields:
    name: "Vendor Security Assessment 2026"
    description: "Annual security posture assessment for critical and high-tier vendors. Covers access control, data protection, incident response, and business continuity."
    state: draft
    assessment_type: vendor
    scoring_type: weighted_average
    source_table: core_company
    anonymous: false
    allow_retake: false
    introduction: "This assessment evaluates your organization's security controls and practices. Please answer all questions accurately based on your current capabilities."
    due_date: 2026-06-30

REST API を使用する:

POST /api/now/table/asmt_assessment
Content-Type: application/json

{
  "name": "Vendor Security Assessment 2026",
  "description": "Annual security posture assessment for critical and high-tier vendors.",
  "state": "draft",
  "assessment_type": "vendor",
  "scoring_type": "weighted_average",
  "source_table": "core_company",
  "due_date": "2026-06-30"
}
ステップ 3:アセスメントカテゴリーを作成する

質問を重み付けした論理的なセクションにグループ化します。

MCP を使用する:

Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric_category
  fields:
    name: "Access Control"
    assessment: [assessment_sys_id]
    order: 100
    weight: 25
    description: "Evaluate identity management, authentication, authorization, and access review practices"

追加のカテゴリーを作成する:

Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric_category
  fields:
    name: "Data Protection"
    assessment: [assessment_sys_id]
    order: 200
    weight: 30
    description: "Assess data classification, encryption, backup, and data handling procedures"
Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric_category
  fields:
    name: "Incident Response"
    assessment: [assessment_sys_id]
    order: 300
    weight: 25
    description: "Review incident detection, response procedures, notification timelines, and recovery capabilities"
Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric_category
  fields:
    name: "Business Continuity"
    assessment: [assessment_sys_id]
    order: 400
    weight: 20
    description: "Evaluate disaster recovery, redundancy, and operational resilience"
ステップ 4:アセスメントメトリック(質問)を作成する

適切なメトリックタイプを使って個々の質問を作成します。

尺度メトリック(1~5 のリッカート尺度):

Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric
  fields:
    name: "Multi-factor authentication is enforced for all privileged access"
    metric_type: scale
    category: [access_control_category_sys_id]
    order: 110
    weight: 15
    mandatory: true
    scale_definition: "1=Not Implemented,2=Partially Implemented,3=Implemented but Not Enforced,4=Implemented and Enforced,5=Implemented, Enforced, and Audited"
    description: "Rate the maturity of MFA implementation for privileged accounts including admin, root, and service accounts."
    ai_suggestion_enabled: true

ブール値メトリック(はい/いいえ):

Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric
  fields:
    name: "Does your organization maintain a documented incident response plan?"
    metric_type: boolean
    category: [incident_response_category_sys_id]
    order: 310
    weight: 10
    mandatory: true
    description: "A documented IRP should include roles, communication procedures, and escalation paths."

選択肢メトリック(複数選択):

Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric
  fields:
    name: "What is your data encryption standard for data at rest?"
    metric_type: choice
    category: [data_protection_category_sys_id]
    order: 210
    weight: 12
    mandatory: true
    choices: "AES-256,AES-128,DES/3DES,No encryption,Other"
    scored_choices: "AES-256=5,AES-128=4,DES/3DES=2,No encryption=0,Other=1"

テキストメトリック(自由回答):

Tool: SN-Create-Record
Parameters:
  table_name: asmt_metric
  fields:
    name: "Describe your data breach notification process and timeline"
    metric_type: text
    category: [incident_response_category_sys_id]
    order: 320
    weight: 0
    mandatory: false
    description: "Include notification timeline, regulatory requirements, and communication channels."
    max_length: 2000
ステップ 5:条件付きロジックを設定する

過去の回答に応じて質問を表示または非表示にします。

MCP を使用する:

Tool: SN-Update-Record
Parameters:
  table_name: asmt_metric
  sys_id: [follow_up_question_sys_id]
  data:
    condition: "javascript: current.metric == '[parent_metric_sys_id]' && current.value < 3"
    condition_description: "Show only if MFA maturity is rated below 3 (Implemented)"
ステップ 6:AI 支援の回答候補を有効にする

過去のデータに基づいて回答を事前入力するスマートな候補を設定します。

MCP を使用する:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    // Enable AI suggestions for assessment metrics
    var assessmentSysId = '[assessment_sys_id]';

    var metric = new GlideRecord('asmt_metric');
    metric.addQuery('category.assessment', assessmentSysId);
    metric.addQuery('metric_type', 'IN', 'scale,choice,boolean');
    metric.query();

    var updated = 0;
    while (metric.next()) {
      // Check for historical responses to generate suggestions
      var history = new GlideAggregate('asmt_metric_result');
      history.addQuery('metric', metric.sys_id.toString());
      history.addAggregate('COUNT');
      history.addAggregate('AVG', 'actual_value');
      history.query();

      if (history.next()) {
        var responseCount = parseInt(history.getAggregate('COUNT'));
        var avgValue = parseFloat(history.getAggregate('AVG', 'actual_value')) || 0;

        if (responseCount >= 5) {
          metric.ai_suggestion_enabled = true;
          metric.ai_suggestion_confidence = Math.min(responseCount / 50, 1.0);
          metric.ai_suggested_value = Math.round(avgValue);
          metric.update();
          updated++;
        }
      }
    }

    gs.info('AI suggestions enabled for ' + updated + ' metrics based on historical response data.');
  description: "Assessment: Enable AI response suggestions from historical data"
ステップ 7:評価結果を分析する

スコアの概要とベンチマークデータを生成します。

MCP を使用:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var assessmentName = 'Vendor Security Assessment 2026';
    var analysis = {
      assessment: assessmentName,
      generated_date: new GlideDateTime().toString(),
      summary: { total_instances: 0, completed: 0, in_progress: 0, not_started: 0, avg_score: 0 },
      by_category: {},
      score_distribution: { excellent: 0, good: 0, fair: 0, poor: 0 },
      lowest_scoring_metrics: [],
      highest_scoring_metrics: []
    };

    // Get assessment
    var asmt = new GlideRecord('asmt_assessment');
    asmt.addQuery('name', assessmentName);
    asmt.query();
    if (!asmt.next()) { gs.info('Assessment not found'); return; }

    // Instance statistics
    var inst = new GlideRecord('asmt_assessment_instance');
    inst.addQuery('assessment', asmt.sys_id.toString());
    inst.query();
    var scores = [];
    while (inst.next()) {
      analysis.summary.total_instances++;
      var state = inst.state.toString();
      if (state == 'complete') { analysis.summary.completed++; scores.push(parseFloat(inst.score.toString()) || 0); }
      else if (state == 'wip') analysis.summary.in_progress++;
      else analysis.summary.not_started++;
    }

    if (scores.length > 0) {
      var total = 0;
      for (var i = 0; i < scores.length; i++) {
        total += scores[i];
        if (scores[i] >= 80) analysis.score_distribution.excellent++;
        else if (scores[i] >= 60) analysis.score_distribution.good++;
        else if (scores[i] >= 40) analysis.score_distribution.fair++;
        else analysis.score_distribution.poor++;
      }
      analysis.summary.avg_score = Math.round(total / scores.length);
    }

    // Category scores
    var cat = new GlideRecord('asmt_metric_category');
    cat.addQuery('assessment', asmt.sys_id.toString());
    cat.query();
    while (cat.next()) {
      var catResults = new GlideAggregate('asmt_metric_result');
      catResults.addQuery('metric.category', cat.sys_id.toString());
      catResults.addAggregate('AVG', 'actual_value');
      catResults.query();
      if (catResults.next()) {
        analysis.by_category[cat.name.toString()] = {
          avg_score: Math.round(parseFloat(catResults.getAggregate('AVG', 'actual_value')) || 0),
          weight: cat.weight.toString() + '%'
        };
      }
    }

    gs.info('ASSESSMENT ANALYSIS:\n' + JSON.stringify(analysis, null, 2));
  description: "Assessment: Analyze results with scoring and benchmarking"

ツールの使用方法

操作MCP ツールREST エンドポイント
評価を作成SN-Create-RecordPOST /api/now/table/asmt_assessment
カテゴリを作成SN-Create-RecordPOST /api/now/table/asmt_metric_category
メトリクスを作成SN-Create-RecordPOST /api/now/table/asmt_metric
結果を照会SN-Query-TableGET /api/now/table/asmt_metric_result
インスタンスを照会SN-Query-TableGET /api/now/table/asmt_assessment_instance
メトリクスを更新SN-Update-RecordPATCH /api/now/table/asmt_metric
結果を分析SN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
スキーマを検出SN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

ベストプラクティス

  • 質問の明確さ: 回答者によって回答が異ならないよう、曖昧さのない質問を作成します
  • バランスの取れたスコアリング: 中間スコアが完璧さではなく、妥当な基準を示すように尺度の定義を調整します
  • 必須項目と任意項目: コンプライアンスの中核となる質問は必須にし、補足的な背景情報を尋ねる質問は任意にします
  • カテゴリの重み付け: カテゴリの重みを組織のリスク優先度に合わせ、リスク許容度の変化に応じて毎年更新します
  • AI 提案のしきい値: 信頼できる平均値を得るため、過去の回答が少なくとも 5 件ある場合にのみ AI 提案を有効にします
  • 条件分岐による効率化: 条件ロジックを使って評価の長さを短縮し、関連する場合にのみ追加の質問を表示します
  • パイロットテスト: 分かりにくい質問を特定するため、広く展開する前に小規模なグループで評価をテストします
  • 匿名性に関する考慮事項: 従業員エンゲージメント調査は匿名にし、ベンダー評価は匿名にしないでください
  • バージョン管理: サイクルの途中で有効な評価を変更するのではなく、新しい評価バージョンを作成します

トラブルシューティング

評価スコアが計算されない

症状: 完了した評価インスタンスのスコアが 0 または null になります 原因: メトリクスの重みの合計が正しくないか、スコアリングタイプの設定が誤っている可能性があります 解決策: カテゴリの重みの合計が 100% であることを確認します。各カテゴリ内で個々のメトリクスの重みが設定されていることを確認します。評価の scoring_type が "none" に設定されていないことを確認します。

条件付きの質問が常に非表示になる

症状: 親の質問への回答に関係なく、追加の質問が表示されません 原因: 条件スクリプトが誤ったメトリクス sys_id を参照しているか、値の比較方法が正しくありません 解決策: condition フィールドで正しい親メトリクス sys_id を使用していることを確認します。まず明示的な値でテストし、その後で動的ロジックを追加します。

AI 提案に古いデータが表示される

症状: 提案された回答が現在の基準ではなく、古い評価サイクルを反映しています 原因: AI 提案が、古い評価を含むすべての過去の結果からデータを取得しています 解決策: 提案の計算時に、日付範囲または評価バージョンで過去のデータをフィルタリングします。基準が変更された場合は ai_suggested_value を更新します。

メトリクスの結果が GRC にリンクされない

症状: 評価結果が GRC のリスクモジュールまたはコンプライアンスモジュールに表示されません 原因: 評価の source_table が GRC プロファイルテーブルと一致していないか、インテグレーションのマッピングがありません 解決策: 評価の source_table が GRC プロファイルテーブル(例:sn_grc_profile)に設定されていることを確認します。評価モジュールと GRC モジュール間のインテグレーションビジネスルールを確認します。

例

例 1:NIST CSF 成熟度評価

シナリオ: NIST サイバーセキュリティフレームワークに準拠したサイバーセキュリティ成熟度評価を作成します。

カテゴリ(重み付け):

  • 識別(20%) - 資産管理、リスク評価、ガバナンス
  • 防御(25%) - アクセス制御、意識向上、データセキュリティ
  • 検知(20%) - 異常、監視、検知プロセス
  • 対応(20%) - 対応計画、コミュニケーション、分析
  • 復旧(15%) - 復旧計画、改善、コミュニケーション

尺度: 1=初期、2=管理、3=定義、4=定量的管理、5=最適化

例 2:従業員エンゲージメント調査

シナリオ: AI が提案するベンチマークを用いた四半期ごとのパルス調査

Tool: SN-Create-Record
Parameters:
  table_name: asmt_assessment
  fields:
    name: "Q1 2026 Employee Engagement Pulse"
    assessment_type: survey
    scoring_type: weighted_average
    source_table: sys_user
    anonymous: true
    allow_retake: false
    due_date: 2026-03-31

結果分析: 平均スコアは3.8/5.0です。最も低いカテゴリはワークライフバランス(3.2)、最も高いカテゴリはチームのコラボレーション(4.3)です。AI は、低下傾向に基づき、ワークライフバランス施策を重点的に実施することを提案しています。

関連スキル

  • grc/risk-assessment-summarization - リスク評価結果を分析します
  • grc/tprm-issue-summarization - TPRM 評価とベンダー評価
  • hrsd/sentiment-analysis - 感情データで評価を補完します
  • admin/workflow-creation - 評価の配布とフォローアップを自動化します
  • reporting/executive-dashboard - 評価結果のダッシュボードを作成します

コメント