はじめに
自作のServiceNow MCPサーバー(tedorigawa001/ServiceNow-MCP、npm公開中)に、v1.6.0で新しいツールを2本追加しました。
-
search_store_apps— ServiceNow Storeの公開カタログをキーワード検索 -
get_store_app_versions— Storeアプリのバージョン別リリースノート(新機能・バグ修正)を取得
これでAIに「VRの最新版と今入っているバージョンの差分を教えて」と聞くと、インスタンスのインストール済みバージョンとStoreのリリースノートを突き合わせて答えられるようになりました。
この記事は、そこに至るまでの調査ログです。
想定読者
- ServiceNowのアプリアップグレード計画を立てる人
- 「この情報、どのテーブルに入ってるんだろう」を調べるのが好きな人
- MCPツールを自作している人
第1歩: テーブルを探す → 無い
App Manager(プラグイン画面)には各バージョンの追加機能・修正内容が表示されます。
当然どこかのテーブルにあるはず、と探しました。
-
sys_app_version— バージョン番号・公開日・依存関係・互換プラットフォームは入っている。リリースノートのカラムは無い -
sys_store_app/sys_remote_app— 同上 -
sys_dictionaryをelement LIKE note/LIKE releaseで横断検索 — 0件
つまりApp Manager UIは、表示のたびにStore側からリモート取得しています。
Table APIベースのツールでは取得できませんでした。
第2歩: Storeページをスクレイピング → 失敗
次にstore.servicenow.comのアプリページを取りに行きました。
- WebFetch(HTML取得) → SPAなのでタイトルしか返らない
- ヘッドレスブラウザでレンダリング後にテキスト抽出 → 空。ページ全体が
<app-details-page>のShadow DOM内にあり、しかも多重ネスト
Shadow DOMを再帰的に掘るコードを書き始める前に、発想を変えました。
SPAが裏で何を取っているかをネットワークタブで見ればいい。
第3歩: ネットワークを見る → 公開APIを発見
ブラウザのネットワークログにこれが流れていました。
GET https://store.servicenow.com/api/sn_store/v1/store/listings/{listing_id}/reviews?limit=2
/reviewsがあるなら/versionsもあるのでは、と試したら:
curl -s "https://store.servicenow.com/api/sn_store/v1/store/listings/21d8a32e1be06a50a85b16db234bcb7e/versions"
# → 200 OK。認証不要で、全20バージョン分のrelease_notes(HTML)・publish_date・release_typeが返ってくる
サインイン不要の公開APIでした。
VR本体なら24.0.10〜30.7.2の20バージョン分が一発で取れます。
第4歩: MCPツール化
あとは素直に実装するだけです。ポイントは2つ。
// listing_idは32桁sys_idのみ許可 — パストラバーサル/URLインジェクション防止
if (!SYS_ID_RE.test(String(args.listing_id))) {
throw new ServiceNowError('listing_id must be a 32-char sys_id', 'INVALID_REQUEST');
}
release_notesはHTMLで返ってくるので、<li>→- 変換などでプレーンテキスト化してからAIに渡します(HTMLのままだとトークンの無駄+読みにくい)。
実際に使ってみる
「VRの最新版と今のバージョンの差分を教えて」に対する動きはこうなります。
- インスタンスの
sys_scopeからsn_vulのインストール済みバージョンを取得 →30.3.5 -
get_store_app_versionsでStoreの全バージョンを取得 → 最新30.7.2 - 間にある
30.6.0/30.6.1/30.7.2のリリースノートを提示
実際のPDIで試したところ、差分3リリースの中に「セキュリティ修正」「新しい検出が誤ってINVALIDマークされる問題の修正」「100件超のfinding分割で空の修復タスクが作られるバグの修正」など、アップグレード判断に直結する情報がきちんと出てきました。
まとめ
- App Managerのリリースノートはインスタンス内に存在しない(リモート取得)
- Storeには認証不要の公開API(
/api/sn_store/v1/store/listings/{id}/versions)があり、これが唯一のプログラマティックな取得経路 - 「間違ったパラメータでも200が返る」APIは、結果件数で正しさを検証する
