mcpField
R
rest-integration

rest-integration

github.com/serac-labs開発7764 回インストール9 週間前に更新
リポジトリ

rest-integration について

ServiceNow 開発者向けの REST 連携パターンガイドです。外部リクエスト、認証、レスポンス処理、障害対応に加え、関連する MCP ツール例を紹介します。

主な機能

  1. 01GET と POST リクエストの送信
  2. 02複数の認証方式の設定
  3. 03レスポンス本文とヘッダーの処理
  4. 04タイムアウトとリトライの設定

活用シーン

  1. 01外部 API の呼び出し
  2. 02JSON レスポンスの解析
  3. 03失敗やレート制限の調査

MCP 対応

REST Message 作成用の MCP ツール例を掲載しています。

インストール

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

$npx skills add https://github.com/serac-labs/serac --skill rest-integration

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

詳細

ServiceNow の REST 統合パターン

ServiceNow では、アウトバウンドの REST API 呼び出しに RESTMessageV2 を、インバウンドのリクエストに REST API を使用します。

アウトバウンド REST(外部 API の呼び出し)

基本的な GET リクエスト
var request = new sn_ws.RESTMessageV2()
request.setEndpoint("https://api.example.com/users")
request.setHttpMethod("GET")
request.setRequestHeader("Accept", "application/json")

var response = request.execute()
var httpStatus = response.getStatusCode()
var body = response.getBody()

if (httpStatus == 200) {
  var data = JSON.parse(body)
  gs.info("Found " + data.length + " users")
}
JSON 本文を使用した POST リクエスト
var request = new sn_ws.RESTMessageV2()
request.setEndpoint("https://api.example.com/incidents")
request.setHttpMethod("POST")
request.setRequestHeader("Content-Type", "application/json")
request.setRequestHeader("Accept", "application/json")

var payload = {
  title: "New Incident",
  description: "Created from ServiceNow",
  priority: "high",
}
request.setRequestBody(JSON.stringify(payload))

var response = request.execute()
REST Message レコードの使用

再利用可能な統合のために REST Message レコードを作成します。

// Using predefined REST Message from sys_rest_message
var request = new sn_ws.RESTMessageV2("External API", "Create User")

// Set variable substitutions defined in the REST Message
request.setStringParameter("user_name", userName)
request.setStringParameter("email", email)

var response = request.execute()

認証方法

基本認証
var request = new sn_ws.RESTMessageV2()
request.setEndpoint("https://api.example.com/data")
request.setHttpMethod("GET")
request.setBasicAuth("username", "password")
Bearer トークン
var request = new sn_ws.RESTMessageV2()
request.setEndpoint("https://api.example.com/data")
request.setHttpMethod("GET")
request.setRequestHeader("Authorization", "Bearer " + token)
OAuth 2.0(OAuth プロファイルを使用)
var request = new sn_ws.RESTMessageV2()
request.setEndpoint("https://api.example.com/data")
request.setHttpMethod("GET")
request.setAuthenticationProfile("oauth2", "My OAuth Profile")
API キー
var request = new sn_ws.RESTMessageV2()
request.setEndpoint("https://api.example.com/data")
request.setHttpMethod("GET")
request.setRequestHeader("X-API-Key", apiKey)
// Or as query parameter
request.setQueryParameter("api_key", apiKey)

エラー処理

try {
  var request = new sn_ws.RESTMessageV2()
  request.setEndpoint("https://api.example.com/data")
  request.setHttpMethod("GET")
  request.setHttpTimeout(10000) // 10 second timeout

  var response = request.execute()
  var httpStatus = response.getStatusCode()

  if (httpStatus == 200) {
    var body = response.getBody()
    var data = JSON.parse(body)
    // Process successful response
  } else if (httpStatus == 401) {
    gs.error("Authentication failed")
  } else if (httpStatus == 404) {
    gs.error("Resource not found")
  } else if (httpStatus >= 500) {
    gs.error("Server error: " + httpStatus)
  } else {
    gs.error("Unexpected status: " + httpStatus)
  }
} catch (ex) {
  gs.error("REST Exception: " + ex.message)
}

レスポンスの処理

JSON レスポンスの解析
var body = response.getBody()
var data = JSON.parse(body)

// Access nested data
var userName = data.user.name
var items = data.items || []
配列の処理
var body = response.getBody()
var users = JSON.parse(body)

for (var i = 0; i < users.length; i++) {
  var user = users[i]
  gs.info("User: " + user.name + " (" + user.email + ")")
}
レスポンスヘッダー
var contentType = response.getHeader("Content-Type")
var rateLimitRemaining = response.getHeader("X-RateLimit-Remaining")

REST 用 MCP ツール

// Create REST Message record
snow_create_rest_message({
  name: "External API",
  endpoint: "https://api.example.com",
  authentication: "basic", // or "oauth2", "api_key"
  methods: [
    {
      name: "Get Users",
      http_method: "GET",
      endpoint: "/users",
    },
    {
      name: "Create User",
      http_method: "POST",
      endpoint: "/users",
      content_type: "application/json",
    },
  ],
})

// Test REST connection
snow_test_rest_connection({
  endpoint: "https://api.example.com/health",
})

ベストプラクティス

  1. REST Message レコードを使用する - 設定を一元管理し、保守を容易にします
  2. タイムアウトを設定する - setHttpTimeout() を使用して、スクリプトのハングを防ぎます
  3. すべてのステータスコードを処理する - 200 だけではありません
  4. 失敗をログに記録する - デバッグには gs.error() を使用します
  5. 時間のかかる API には非同期処理を使用する - ビジネスルールをブロックしないようにします
  6. 認証情報を安全に保管する - Connection & Credential Aliases を使用します
  7. 再試行ロジックを実装する - 一時的な障害に備えます
  8. レート制限を考慮する - レスポンスヘッダーを確認し、バックオフを実装します

再試行パターン

function callApiWithRetry(endpoint, maxRetries) {
  var retries = 0
  var delay = 1000 // Start with 1 second

  while (retries < maxRetries) {
    try {
      var request = new sn_ws.RESTMessageV2()
      request.setEndpoint(endpoint)
      request.setHttpMethod("GET")

      var response = request.execute()

      if (response.getStatusCode() == 200) {
        return JSON.parse(response.getBody())
      }

      if (response.getStatusCode() >= 500) {
        // Server error - retry
        retries++
        gs.sleep(delay)
        delay = delay * 2 // Exponential backoff
        continue
      }

      // Client error - don't retry
      throw new Error("Client error: " + response.getStatusCode())
    } catch (ex) {
      retries++
      if (retries >= maxRetries) {
        throw ex
      }
      gs.sleep(delay)
      delay = delay * 2
    }
  }
}

コメント