contracts-query-enhancer について
ServiceNowの契約管理向けスキルです。業務用語の依頼を契約や義務のクエリに変換し、非技術者や契約チームによる契約検索、更新、監査、レポートの絞り込みを支援します。
主な機能
- 01検索語を契約フィールドに対応付け
- 02ベンダー、種類、状態の値を解決
- 03日付表現をクエリ条件に変換
- 04条件を組み合わせて追加検索を提案
- 05義務の検索と保存検索の作成
活用シーン
- 01期限間近または自動更新される契約の検索
- 02ベンダーや金額による契約の絞り込み
- 03契約義務やコンプライアンス事項の監査
- 04契約レポート用の条件作成
MCP 対応
SN-Query-Tableで契約、義務、ベンダー、選択肢の値を検索します。SN-Discover-Table-Schemaでフィールドを確認し、SN-Create-Recordで検索条件を保存できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill contracts-query-enhancerインストール後、Claude Code で/contracts-query-enhancerを入力して読み込まれたか確認します。
詳細
契約クエリーの強化
概要
このスキルは、自然言語による契約検索クエリーを正確な ServiceNow クエリーに変換し、テーブル構造やエンコードクエリーの構文を知らなくても契約を検索できるようにします。以下の内容を扱います。
- 会話形式の検索語を、契約テーブルのフィールドおよびエンコードクエリーの演算子に対応付ける
- ベンダー名、契約タイプ、ステータス値を ServiceNow の値に解決する
- 日付表現(「次の四半期に期限を迎える」「昨年署名された」など)をエンコード日付クエリーに変換する
- 義務に関する用語を理解し、CLM の義務タイプに対応付ける
- 複数の検索条件を組み合わせて、最適化された複合クエリーを作成する
- 広範な結果セットを絞り込むための追加クエリーを提案する
使用するタイミング:
- ユーザーがフィールド名ではなく、ビジネス用語で契約を検索する場合
- 監査、契約更新、デューデリジェンスプロジェクトで契約を見つける場合
- 特定のフィルタ条件を必要とする契約レポートを作成する場合
- ServiceNow の知識がない技術者以外の関係者が契約を見つける必要がある場合
- 自然言語の条件に基づいて実行される自動契約監視の場合
前提条件
- ロール:
contract_reader、contract_manager、sn_clm.user、またはadmin - プラグイン:
com.snc.contract_management(契約管理)またはcom.sn_clm(契約ライフサイクル管理) - アクセス権: ast_contract、clm_obligation、core_company、sys_choice テーブルへの読み取りアクセス
- 知識: 契約用語と、組織の契約分類体系に関する基本的な理解
クエリー対応付けリファレンス
自然言語からフィールドへの対応付け
| 自然言語の用語 | ServiceNow フィールド | テーブル | エンコードクエリーの例 |
|---|---|---|---|
| 「ベンダー」、「サプライヤー」、「プロバイダー」 | vendor | ast_contract | vendor.nameLIKE[term] |
| 「期限切れ」、「期限が近い」、「終了日」 | ends | ast_contract | ends<javascript:gs.daysAgoEnd(-90) |
| 「価値」、「コスト」、「金額」、「価格」 | total_cost | ast_contract | total_cost>100000 |
| 「自動更新」、「自動的な契約更新」 | auto_renew | ast_contract | auto_renew=true |
| 「通知期間」、「オプトアウト期間」 | notice_period | ast_contract | notice_period<=60 |
| 「準拠法」、「管轄地」 | governing_law | ast_contract | governing_lawLIKE[state] |
| 「義務」、「確約」 | short_description | clm_obligation | short_descriptionLIKE[term] |
| 「タイプ」、「カテゴリ」 | contract_type | ast_contract | contract_type=[value] |
| 「有効」、「現在」、「発効中」 | state | ast_contract | state=active |
| 「部門」、「事業部門」 | department | ast_contract | department=[sys_id] |
日付表現の変換
| 自然言語 | エンコードクエリー |
|---|---|
| 「今月に期限を迎える」 | endsBETWEENjavascript:gs.beginningOfThisMonth()@javascript:gs.endOfThisMonth() |
| 「次の四半期に期限を迎える」 | endsBETWEENjavascript:gs.beginningOfNextQuarter()@javascript:gs.endOfNextQuarter() |
| 「90日以内に期限を迎える」 | ends<=javascript:gs.daysAgoEnd(-90)^ends>=javascript:gs.daysAgoEnd(0) |
| 「昨年署名された」 | startsBETWEENjavascript:gs.beginningOfLastYear()@javascript:gs.endOfLastYear() |
| 「2025年に更新された」 | renewal_dateBETWEEN2025-01-01@2025-12-31 |
| 「期限超過の義務」 | due_date<javascript:gs.now()^state!=complete |
手順
ステップ 1:自然言語クエリーを解析する
ユーザーの検索意図を分析し、構成要素を特定します。
- エンティティタイプ: 契約、義務、条項、またはベンダー
- フィルタ条件: 日付範囲、金額、ステータス、当事者
- 並べ替えの優先条件: 日付、金額、関連性、またはリスク
- 範囲: 単一の契約、ベンダーの契約ポートフォリオ、または全契約ポートフォリオ
ステップ 2:フィールド値を解決する
ユーザーの用語を ServiceNow の選択肢の値および参照に対応付けます。
契約タイプの値を解決する:
Tool: SN-Query-Table
Parameters:
table_name: sys_choice
query: name=ast_contract^element=contract_type
fields: value,label
limit: 50
REST API を使用する:
GET /api/now/table/sys_choice?sysparm_query=name=ast_contract^element=contract_type&sysparm_fields=value,label&sysparm_limit=50
名前からベンダーを解決する:
Tool: SN-Query-Table
Parameters:
table_name: core_company
query: nameLIKE[search_term]^vendor=true
fields: sys_id,name,vendor_type
limit: 10
ステップ 3:拡張クエリを作成する
解決した値を組み合わせて、最適化されたエンコード済みクエリを作成します。
例:「AcmeとのSaaS契約のうち、今後6か月以内に期限を迎え、10万ドルを超えるものをすべて表示して」
段階的な変換:
- 「SaaS契約」 ->
contract_type=saas(sys_choiceから解決) - 「Acmeとの」 ->
vendor=[acme_sys_id](core_companyから解決) - 「今後6か月以内に期限を迎える」 ->
ends<=javascript:gs.daysAgoEnd(-180)^ends>=javascript:gs.daysAgoEnd(0) - 「10万ドルを超える」 ->
total_cost>100000
結合したクエリ:
Tool: SN-Query-Table
Parameters:
table_name: ast_contract
query: contract_type=saas^vendor=[acme_sys_id]^ends<=javascript:gs.daysAgoEnd(-180)^ends>=javascript:gs.daysAgoEnd(0)^total_cost>100000^active=true
fields: sys_id,number,short_description,vendor,contract_type,starts,ends,total_cost,auto_renew,notice_period,state
limit: 50
order_by: ends
ステップ 4:結果を実行して検証する
クエリを実行し、結果がユーザーの意図に合っていることを確認します。
REST APIを使用する場合:
GET /api/now/table/ast_contract?sysparm_query=contract_type=saas^vendor=[acme_sys_id]^ends<=javascript:gs.daysAgoEnd(-180)^ends>=javascript:gs.daysAgoEnd(0)^total_cost>100000^active=true&sysparm_fields=sys_id,number,short_description,vendor,contract_type,starts,ends,total_cost,auto_renew,notice_period&sysparm_limit=50&sysparm_display_value=true
または、あいまい検索には自然言語検索を使用します:
Tool: SN-Query-Table
Parameters:
table_name: ast_contract
query: contract_type=saas^vendor=[acme_sys_id]^ends<=javascript:gs.daysAgoEnd(-180)^ends>=javascript:gs.daysAgoEnd(0)^total_cost>100000^active=true
limit: 25
ステップ 5:コンテキストから義務を検索する
義務に関するクエリをCLMテーブル検索に変換します。
例:「今四半期が期限の、ベンダーのデータ保護義務をすべて検索して」
Tool: SN-Query-Table
Parameters:
table_name: clm_obligation
query: obligation_type=vendor_obligation^short_descriptionLIKEdata protection^due_dateBETWEENjavascript:gs.beginningOfThisQuarter()@javascript:gs.endOfThisQuarter()^active=true
fields: sys_id,short_description,contract,obligation_type,responsible_party,due_date,state,compliance_status,clause_reference
limit: 50
ステップ 6:クエリ候補を生成する
結果を絞り込むための追加クエリを提示します:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var suggestions = {
original_query: 'SaaS contracts with Acme expiring next 6 months over $100K',
results_found: 0,
refinement_suggestions: [],
broadening_suggestions: []
};
// Count results
var ga = new GlideAggregate('ast_contract');
ga.addQuery('contract_type', 'saas');
ga.addQuery('active', true);
ga.addQuery('ends', '<=', gs.daysAgoEnd(-180));
ga.addQuery('ends', '>=', gs.daysAgoEnd(0));
ga.addQuery('total_cost', '>', 100000);
ga.addAggregate('COUNT');
ga.query();
if (ga.next()) suggestions.results_found = parseInt(ga.getAggregate('COUNT'));
if (suggestions.results_found > 20) {
suggestions.refinement_suggestions = [
'Add department filter: "...in the Engineering department"',
'Narrow timeline: "...expiring in the next 30 days"',
'Add renewal filter: "...with auto-renewal enabled"'
];
} else if (suggestions.results_found == 0) {
suggestions.broadening_suggestions = [
'Remove value filter: "SaaS contracts with Acme expiring in 6 months"',
'Expand vendor: "SaaS contracts expiring in 6 months over $100K"',
'Expand type: "All contracts with Acme expiring in 6 months"'
];
}
gs.info('QUERY SUGGESTIONS:\n' + JSON.stringify(suggestions, null, 2));
description: "CLM: Generate query refinement suggestions based on result count"
ステップ 7:保存済み検索クエリを作成する
よく使うクエリパターンを保存して再利用できるようにします:
Tool: SN-Create-Record
Parameters:
table_name: sys_filter
fields:
title: "Contracts Expiring Next 90 Days - Auto Renew"
table: ast_contract
filter: active=true^auto_renew=true^ends<=javascript:gs.daysAgoEnd(-90)^ends>=javascript:gs.daysAgoEnd(0)
ツールの使用方法
| 操作 | MCP ツール | REST エンドポイント |
|---|---|---|
| 契約をクエリする | SN-Query-Table | GET /api/now/table/ast_contract |
| あいまい検索 | SN-Natural-Language-Search | N/A |
| 選択肢の値を解決する | SN-Query-Table | GET /api/now/table/sys_choice |
| ベンダーを解決する | SN-Query-Table | GET /api/now/table/core_company |
| 義務をクエリする | SN-Query-Table | GET /api/now/table/clm_obligation |
| 件数を集計する | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
| フィールドを検出する | SN-Discover-Table-Schema | GET /api/now/table/sys_dictionary |
ベストプラクティス
- 常に参照を解決する: 参照フィールドに未加工のテキストを渡さず、まずベンダー名や部門名をsys_idに解決します
- 日付の安全性: クエリが時間の経過後も有効であるよう、ハードコードした日付ではなくJavaScriptの日付関数を使用します
- 段階的な絞り込み: 幅広いクエリから始め、結果がゼロ件になるのを避けるため、絞り込み方法を提示します
- フィールドの検証: 標準外のフィールドをクエリする前にsys_dictionaryを確認し、「invalid field」エラーを回避します
- 表示値: ユーザー向けの結果では、参照フィールドに名前が表示されるよう、常に
sysparm_display_value=trueを指定します - 複合クエリ: OR条件には
^ORまたは^NQ(新しいクエリ)演算子を使用し、複雑なブール論理は慎重にテストします - パフォーマンス: すべてのクエリに
sysparm_limitを追加し、主なフィルターにはインデックス付きフィールド(number、sys_id、state)を使用します - エンコード: RESTクエリパラメーターの特殊文字、特に
^、=、日付式はURLエンコードします
トラブルシューティング
契約が存在するのにクエリ結果が返されない
症状: 自然言語クエリは正しく変換されるものの、結果が0件になる
原因: 選択肢の値が一致していない(例:「saas」、「SaaS」、「software_as_a_service」)
解決策: まず必ずsys_choiceから選択肢の値を解決します:
Tool: SN-Query-Table
Parameters:
table_name: sys_choice
query: name=ast_contract^element=contract_type^labelLIKESaaS
fields: value,label
limit: 5
日付クエリが予期しない結果を返す
症状: 「次の四半期に期限を迎える」で、誤った期間の契約が返される
原因: JavaScriptの日付関数はサーバーのタイムゾーンを使用し、gs.daysAgoEnd()は今日を基準に計算する
解決策: gs.getProperty('glide.sys.date.format')でサーバーのタイムゾーンを確認します。正確に指定するには、四半期の開始日と終了日を明示したBETWEENを使用します。
ベンダー名を解決できない
症状: 既知のベンダーを検索しても、ベンダーの検索結果が返されない
原因: core_company内のベンダー名が一般的な呼称と異なる可能性がある(例:「International Business Machines」と「IBM」)
解決策: 部分一致にはnameLIKEを使用するか、name、stock_symbol、u_dba_nameフィールドを横断して検索します。
例
例 1:更新ダッシュボードのクエリ
ユーザーのクエリ: 「自動更新され、60日以内に通知が必要な契約をすべて表示して」
拡張クエリ:
Tool: SN-Query-Table
Parameters:
table_name: ast_contract
query: active=true^auto_renew=true^endsRELATIVELE@dayAgo@-60^endsRELATIVEGE@dayAgo@0
fields: number,short_description,vendor,ends,notice_period,total_cost,contract_administrator
limit: 50
order_by: ends
例 2:コンプライアンス監査のクエリ
ユーザークエリ:「GDPR に言及していない欧州のベンダーとの契約を検索してください」
拡張クエリ(2 段階):
Tool: SN-Query-Table
Parameters:
table_name: ast_contract
query: active=true^vendor.country=Germany^ORvendor.country=France^ORvendor.country=Netherlands^terms_and_conditionsNOT LIKEGDPR
fields: number,short_description,vendor,governing_law,total_cost,ends
limit: 50
例 3:財務エクスポージャーのクエリ
ユーザークエリ:「今年期限を迎えるテクノロジーベンダーとの契約支出の総額はいくらですか?」
拡張クエリ:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var ga = new GlideAggregate('ast_contract');
ga.addQuery('active', true);
ga.addQuery('vendor.vendor_type', 'technology');
ga.addQuery('ends', 'BETWEEN', gs.beginningOfThisYear() + '@' + gs.endOfThisYear());
ga.addAggregate('SUM', 'total_cost');
ga.addAggregate('COUNT');
ga.query();
if (ga.next()) {
gs.info('Total contracts: ' + ga.getAggregate('COUNT'));
gs.info('Total spend: $' + ga.getAggregate('SUM', 'total_cost'));
}
description: "CLM: Calculate total spend for technology vendors with contracts expiring this year"
関連スキル
legal/contract-metadata-extraction- 契約レコードからメタデータを抽出しますlegal/contract-analysis- 契約のリスクを包括的に分析しますlegal/contract-obligation-extraction- 義務を特定し、追跡しますlegal/legal-request-triage- 契約レビューの依頼をトリアージしますitsm/natural-language-queries- 自然言語クエリの一般的な手法