<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: smura</title>
    <description>The latest articles on DEV Community by smura (@shin_m_5c8fda95a8ffc03f70).</description>
    <link>https://dev.to/shin_m_5c8fda95a8ffc03f70</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4135928%2Fc2d236a4-f12e-4c1a-8923-b8e849c2eb45.jpg</url>
      <title>DEV Community: smura</title>
      <link>https://dev.to/shin_m_5c8fda95a8ffc03f70</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shin_m_5c8fda95a8ffc03f70"/>
    <language>en</language>
    <item>
      <title>Deploying Snowflake Cortex Agent and Knowledge Graph with ServiceNow MCP Server</title>
      <dc:creator>smura</dc:creator>
      <pubDate>Tue, 22 Sep 2026 07:58:15 +0000</pubDate>
      <link>https://dev.to/shin_m_5c8fda95a8ffc03f70/deploying-snowflake-cortex-agent-and-knowledge-graph-with-servicenow-mcp-server-4lff</link>
      <guid>https://dev.to/shin_m_5c8fda95a8ffc03f70/deploying-snowflake-cortex-agent-and-knowledge-graph-with-servicenow-mcp-server-4lff</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg2vtk2abi6mimqdfn5j0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg2vtk2abi6mimqdfn5j0.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;ServiceNow provides a feature called &lt;strong&gt;MCP Server&lt;/strong&gt;. It allows various capabilities registered in ServiceNow, such as flows and knowledge graphs, to be exposed as callable &lt;strong&gt;tools&lt;/strong&gt; that AI agents such as Claude Code can invoke directly.&lt;/p&gt;

&lt;p&gt;This article documents the steps used to build the following environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable natural-language queries against hardware asset management data stored in &lt;strong&gt;Snowflake&lt;/strong&gt; using Cortex Agent and a Semantic View&lt;/li&gt;
&lt;li&gt;Enable natural-language queries against software asset management data stored in &lt;strong&gt;ServiceNow&lt;/strong&gt; using Knowledge Graph&lt;/li&gt;
&lt;li&gt;Register both capabilities as &lt;strong&gt;tools in ServiceNow MCP Server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Connect to ServiceNow MCP Server from &lt;strong&gt;Claude Code, acting as an MCP Client&lt;/strong&gt;, and submit natural-language queries to obtain answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final objective is to let a user ask a single AI agent a question such as, “What assets are managed by Tim?” and receive an answer spanning both the hardware assets in Snowflake and the software assets in ServiceNow. The advantage of this architecture is that users do not need to know where the data is stored, whether in Snowflake or ServiceNow.&lt;/p&gt;

&lt;p&gt;All instance URLs and account names in this article have been replaced with placeholders such as &lt;code&gt;&amp;lt;your-instance&amp;gt;&lt;/code&gt;. When implementing this architecture, replace them with the values for your own environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overall Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code (MCP Client)
        │  MCP protocol (OAuth authentication)
        ▼
ServiceNow
 ├─ MCP Server (gateway for tools)
 │   ├─ Tool: Subflow ── Invokes Snowflake Cortex Agent
 │   └─ Tool: Knowledge Graph ── Searches data in ServiceNow
 │
 └─ Snowflake, accessed through the subflow
      ├─ Cortex Agent
      └─ Semantic View (HARDWARE / ADMIN tables)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Hardware asset information is stored in &lt;strong&gt;Snowflake&lt;/strong&gt;, while software asset information is stored separately in &lt;strong&gt;ServiceNow&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;ServiceNow MCP Server acts as the entry point and selects between two internal tools: one that queries Snowflake and another that searches data in ServiceNow.&lt;/li&gt;
&lt;li&gt;The MCP Client, Claude Code in this example, only needs to submit a question. It does not need to know where each tool stores its data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites: Key Terms
&lt;/h2&gt;

&lt;p&gt;Before proceeding with the implementation, this section summarizes the terms used throughout the article. Return here if you encounter an unfamiliar term.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A standard protocol that allows AI agents to invoke external tools and data sources. An MCP Server provides tools, while an MCP Client, Claude Code in this example, consumes them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cortex Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An AI agent capability provided by Snowflake. It receives a natural-language query, uses a Semantic View to construct SQL, retrieves data from tables, and returns an answer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semantic View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A definition that adds business meaning to table columns and relationships, such as identifying an administrator name or an asset name. By using a Semantic View, Cortex Agent can construct SQL from natural language without directly relying on the physical table structure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ServiceNow Knowledge Graph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A ServiceNow capability that connects tables through edges and makes the resulting graph structure searchable using natural language. Within ServiceNow, it plays a role similar to the combination of a Snowflake Semantic View and Cortex Agent.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subflow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A reusable unit of processing created in ServiceNow Flow Designer and invoked by other flows. In this implementation, the Cortex Agent invocation is encapsulated in a subflow.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Building the Snowflake Components
&lt;/h2&gt;

&lt;p&gt;To use Cortex Agent, first create an entry point in Snowflake that accepts OAuth authentication from ServiceNow. You must also create the Semantic View that gives business meaning to the data, as well as a runtime user and the permissions required to query the agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the Security Integration and Retrieve Credentials
&lt;/h3&gt;

&lt;p&gt;Open a Snowsight worksheet using the &lt;code&gt;ACCOUNTADMIN&lt;/code&gt; role and run the following SQL. This configuration allows Snowflake to accept OAuth authentication from ServiceNow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- 01. OAuth settings&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;ACCOUNTADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;SECURITY&lt;/span&gt; &lt;span class="n"&gt;INTEGRATION&lt;/span&gt; &lt;span class="n"&gt;_cortex_oauth_2&lt;/span&gt;
  &lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAUTH&lt;/span&gt;
  &lt;span class="n"&gt;ENABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;
  &lt;span class="n"&gt;OAUTH_CLIENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CUSTOM&lt;/span&gt;
  &lt;span class="n"&gt;OAUTH_CLIENT_TYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'CONFIDENTIAL'&lt;/span&gt;
  &lt;span class="n"&gt;OAUTH_REDIRECT_URI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'https://&amp;lt;your-instance&amp;gt;.service-now.com/oauth_redirect.do'&lt;/span&gt;
  &lt;span class="n"&gt;OAUTH_ISSUE_REFRESH_TOKENS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;
  &lt;span class="n"&gt;OAUTH_REFRESH_TOKEN_VALIDITY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7776000&lt;/span&gt; &lt;span class="c1"&gt;-- Refresh-token lifetime in seconds, up to 90 days&lt;/span&gt;
  &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'OAuth integration for ServiceNow Cortex Agent Integration'&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'&lt;/code&gt; assumes that the client secret can be stored securely on the ServiceNow server side. A &lt;code&gt;PUBLIC&lt;/code&gt; client is used for environments such as browsers or mobile applications where a secret cannot be protected. Because this implementation is a server-to-server integration, &lt;code&gt;CONFIDENTIAL&lt;/code&gt; is selected.&lt;/p&gt;

&lt;p&gt;After creating the security integration, retrieve the Client ID and Client Secret.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- 02. Check the Client Secret and Client ID&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;SYSTEM&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;SHOW_OAUTH_CLIENT_SECRETS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'_CORTEX_OAUTH_2'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep these values available because they will be used in the ServiceNow Application Registry configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Load the Data
&lt;/h3&gt;

&lt;p&gt;Create the database and schema that will contain the managed data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SYSADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;management&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the following two tables in this schema and load the sample data.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ADMIN&lt;/code&gt;: Contains administrator IDs and administrator names.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;admin_id&lt;/th&gt;
&lt;th&gt;admin_name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IT0001&lt;/td&gt;
&lt;td&gt;Tim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0002&lt;/td&gt;
&lt;td&gt;Chester&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0003&lt;/td&gt;
&lt;td&gt;Arlon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0004&lt;/td&gt;
&lt;td&gt;Michel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0005&lt;/td&gt;
&lt;td&gt;Lick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0006&lt;/td&gt;
&lt;td&gt;Len&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0007&lt;/td&gt;
&lt;td&gt;Eathon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HARDWARE&lt;/code&gt;: Contains asset names, descriptions, vendors, administrator IDs, and related information.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;admin_id&lt;/th&gt;
&lt;th&gt;asset_name&lt;/th&gt;
&lt;th&gt;vender&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IT0001&lt;/td&gt;
&lt;td&gt;MacBook Pro 14&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;Laptop for sales and proposal activities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0002&lt;/td&gt;
&lt;td&gt;Dell Latitude 7450&lt;/td&gt;
&lt;td&gt;Dell&lt;/td&gt;
&lt;td&gt;Windows laptop for internal business operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0003&lt;/td&gt;
&lt;td&gt;ThinkPad X1 Carbon&lt;/td&gt;
&lt;td&gt;Lenovo&lt;/td&gt;
&lt;td&gt;Laptop for data analysis and customer support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0004&lt;/td&gt;
&lt;td&gt;Surface Laptop 7&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;PC for meetings and presentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0005&lt;/td&gt;
&lt;td&gt;ProBook 440 G11&lt;/td&gt;
&lt;td&gt;HP&lt;/td&gt;
&lt;td&gt;PC for general administration and remote work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0006&lt;/td&gt;
&lt;td&gt;iPhone 16&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;Smartphone for business communication and multi-factor authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0007&lt;/td&gt;
&lt;td&gt;Galaxy Tab S10&lt;/td&gt;
&lt;td&gt;Samsung&lt;/td&gt;
&lt;td&gt;Tablet for on-site viewing and mobile approvals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0001&lt;/td&gt;
&lt;td&gt;Dell UltraSharp U2723QE&lt;/td&gt;
&lt;td&gt;Dell&lt;/td&gt;
&lt;td&gt;27-inch external monitor for remote work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0003&lt;/td&gt;
&lt;td&gt;MX Keys S&lt;/td&gt;
&lt;td&gt;Logitech&lt;/td&gt;
&lt;td&gt;Wireless keyboard for data entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0006&lt;/td&gt;
&lt;td&gt;Jabra Evolve2 65&lt;/td&gt;
&lt;td&gt;Jabra&lt;/td&gt;
&lt;td&gt;Wireless headset for online meetings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Create the Semantic View
&lt;/h3&gt;

&lt;p&gt;Create a Semantic View so that the loaded table data can be queried using natural language.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From the home page, select &lt;strong&gt;AI &amp;amp; ML &amp;gt; Analyst &amp;gt; Create in Workspace&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Guided Wizard&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzrmhddvha9mihdsqx3af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzrmhddvha9mihdsqx3af.png" width="800" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;MANAGEMENT.HARDWARE.ADMIN&lt;/code&gt; and &lt;code&gt;MANAGEMENT.HARDWARE.HARDWARE&lt;/code&gt; as the tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2azs68zevzaxw7i17ck0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2azs68zevzaxw7i17ck0.png" width="643" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select all imported tables and columns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6jtqgf96fnyx0dmycq22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6jtqgf96fnyx0dmycq22.png" width="638" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the Semantic View name to &lt;code&gt;SV_HARDWARE_ADMIN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set the save location to &lt;code&gt;MANAGEMENT.HARDWARE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the editor for &lt;code&gt;SV_HARDWARE_ADMIN&lt;/code&gt;, configure the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Relationships&lt;/strong&gt;, link the &lt;code&gt;ADMIN_ID&lt;/code&gt; columns in the two tables. This allows the agent to understand which administrator is responsible for each asset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13l7ckmi0d3ba32i8qei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F13l7ckmi0d3ba32i8qei.png" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Under &lt;strong&gt;Verified queries&lt;/strong&gt;, register representative questions and their corresponding SQL statements in advance. This is an important way to improve the agent's response accuracy. It effectively teaches the agent an FAQ with model answers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Question: &lt;code&gt;What hardware assets are managed by each administrator?&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SQL:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ADMIN_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ASSET_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DESCRIPTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VENDER&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;admin&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
  &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;hardware&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ADMIN_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ADMIN_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gvxo437hg2hg6r28ye1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gvxo437hg2hg6r28ye1.png" width="797" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the Cortex Agent
&lt;/h3&gt;

&lt;p&gt;Next, create the agent that provides the external endpoint and selects the appropriate tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From the home page, select &lt;strong&gt;AI &amp;amp; ML &amp;gt; Agent Studio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Create Agent&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Create an agent named &lt;code&gt;SEARCH_AGENT&lt;/code&gt; in &lt;code&gt;MANAGEMENT.HARDWARE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure the settings as follows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Under &lt;strong&gt;Instructions&lt;/strong&gt;, configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: Claude Sonnet 5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration instructions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Check the administrator and hardware tables.&lt;/li&gt;
&lt;li&gt;Select the administrator user name.&lt;/li&gt;
&lt;li&gt;Select the hardware name, vendor, and description related to the administrator ID.&lt;/li&gt;
&lt;li&gt;Return the results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response instructions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Search for administrators and their hardware assets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhdz96fnbbbmeosmtpqlj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhdz96fnbbbmeosmtpqlj.png" width="664" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under &lt;strong&gt;Tools&lt;/strong&gt;, select &lt;strong&gt;Add semantic view&lt;/strong&gt; and add the previously created &lt;code&gt;SV_HARDWARE_ADMIN&lt;/code&gt;. This allows the agent to access data safely through the business definitions in the Semantic View rather than writing SQL without semantic context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff7vwti58x72c5b0gd703.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff7vwti58x72c5b0gd703.png" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, use &lt;strong&gt;Preview&lt;/strong&gt; to test a question such as “Check the hardware managed by Tim” and verify that the expected answer is returned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feujvsvpvzop45ttcqfvi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feujvsvpvzop45ttcqfvi.png" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Grant Permissions to the Runtime User
&lt;/h3&gt;

&lt;p&gt;Grant the end user connecting from ServiceNow permission to execute Cortex Agent and access the required resources. A dedicated role and service account are used to follow the &lt;strong&gt;principle of least privilege&lt;/strong&gt;, exposing only the permissions needed for the external integration. Using an administrator role for the ServiceNow connection could permit unintended operations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- 04. Create the role and grant permissions&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SECURITYADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX_AGENT_USER&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORTEX_USER&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;management&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hardware&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;AGENT&lt;/span&gt; &lt;span class="n"&gt;management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search_agent&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="n"&gt;compute_wh&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;MANAGEMENT&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;MANAGEMENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDWARE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;CORTEX_AGENT_HARDWARE_SEARCH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;MANAGEMENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDWARE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SV_HARDWARE_ADMIN&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;CORTEX_AGENT_HARDWARE_SEARCH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;SEMANTIC&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;MANAGEMENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDWARE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SV_HARDWARE_ADMIN&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;CORTEX_AGENT_HARDWARE_SEARCH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;MANAGEMENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDWARE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDWARE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;CORTEX_AGENT_HARDWARE_SEARCH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;MANAGEMENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDWARE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;ADMIN&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;CORTEX_AGENT_HARDWARE_SEARCH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Grant the role to the user&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;servicenow&lt;/span&gt;
    &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;your_password&amp;gt;'&lt;/span&gt;
    &lt;span class="n"&gt;DEFAULT_ROLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt;
    &lt;span class="n"&gt;MUST_CHANGE_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;
    &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Service account for ServiceNow integration'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;cortex_agent_hardware_search&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;servicenow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;sysadmin&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;servicenow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure Authentication in ServiceNow
&lt;/h2&gt;

&lt;p&gt;Use ServiceNow's standard OAuth integration capabilities to connect securely from ServiceNow to Snowflake. ServiceNow OAuth integration uses three layers, each with a different role:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the external provider in &lt;strong&gt;Application Registry&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Issue and obtain authentication information through &lt;strong&gt;Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Define the actual destination through &lt;strong&gt;Connection &amp;amp; Credential Alias&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configure the Snowflake Security Integration in Application Registry
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In ServiceNow, go to &lt;strong&gt;System OAuth &amp;gt; Application Registry&lt;/strong&gt; and select &lt;strong&gt;New&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Connect to a third party OAuth Provider&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure the following values.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Snowflake Cortex Agents OAuth 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client ID&lt;/td&gt;
&lt;td&gt;Client ID issued by Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Secret&lt;/td&gt;
&lt;td&gt;Client Secret issued by Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default Grant type&lt;/td&gt;
&lt;td&gt;Authorization Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://&amp;lt;your-account&amp;gt;.snowflakecomputing.com/oauth/authorize&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://&amp;lt;your-account&amp;gt;.snowflakecomputing.com/oauth/token-request&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirect URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://&amp;lt;your-instance&amp;gt;.service-now.com/oauth_redirect.do&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xatu63iy8y8f4cp7vbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xatu63iy8y8f4cp7vbv.png" width="799" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This step registers the &lt;strong&gt;definition&lt;/strong&gt; that tells ServiceNow which credentials to use when authenticating with Snowflake as an OAuth provider. It does not yet establish a connection or issue an authentication token.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Connection &amp;amp; Credential Alias
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Configure the Credential
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Connections &amp;amp; Credentials &amp;gt; Credentials&lt;/strong&gt; and select &lt;strong&gt;New&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;OAuth 2.0 Credentials&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure the following values.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Snowflake Cortex Agents User Credential&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Entity Profile&lt;/td&gt;
&lt;td&gt;Entity Profile for Snowflake Cortex Agents OAuth 2.0 created in Application Registry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration Type&lt;/td&gt;
&lt;td&gt;Personal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivqb6lje8uvjgsx3hrb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fivqb6lje8uvjgsx3hrb0.png" width="799" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the configuration, then select &lt;strong&gt;Get OAuth Token&lt;/strong&gt; to obtain an authentication token and store it in ServiceNow. At this point, the OAuth flow defined in Application Registry runs for the first time, including browser-based login and consent, and a token is issued.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configure the Credential Alias and Connection
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Connections &amp;amp; Credentials &amp;gt; Connection &amp;amp; Credential Aliases&lt;/strong&gt; and select &lt;strong&gt;New&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure the following value.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Snowflake OAuth Cortex Agents Alias&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwlc9brf6ehn0qtomc58f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwlc9brf6ehn0qtomc58f.png" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the configuration, then create a connection from the &lt;strong&gt;Connections&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Configure the following values.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Snowflake Cortex Agents HTTP Connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential&lt;/td&gt;
&lt;td&gt;Snowflake Cortex Agents User Credential&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://&amp;lt;your-account&amp;gt;.snowflakecomputing.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujjensumq82mgk8nad90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fujjensumq82mgk8nad90.png" width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connection &amp;amp; Credential Alias provides an abstraction that Flow Designer can reference to determine which connection information to use for an HTTP request. If the destination or credential changes, the flow implementation does not need to be modified as long as the alias continues to resolve to the appropriate connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Cortex Agent Execution in ServiceNow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Implement the ServiceNow Action That Invokes Cortex Agent
&lt;/h3&gt;

&lt;p&gt;Snowflake Cortex Agent is invoked through the &lt;code&gt;agent:run&lt;/code&gt; REST API.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Process Automation &amp;gt; Flow Designer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;From &lt;strong&gt;New&lt;/strong&gt;, select &lt;strong&gt;Action&lt;/strong&gt; and name the action &lt;code&gt;Ask Snowflake Cortex Agent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure it as follows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Input variable definition&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;user_prompt&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3vbvg6bi7olv70l7y6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu3vbvg6bi7olv70l7y6e.png" width="799" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action step definition&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: REST&lt;/li&gt;
&lt;li&gt;Name: Cortex Agents Action&lt;/li&gt;
&lt;li&gt;Connection Details:&lt;/li&gt;
&lt;li&gt;Connection: Use Connection Alias&lt;/li&gt;
&lt;li&gt;Connection Alias: Snowflake_OAuth_Cortex_Agents_Alias&lt;/li&gt;
&lt;li&gt;Request Details:&lt;/li&gt;
&lt;li&gt;Build Request: Manually&lt;/li&gt;
&lt;li&gt;Resource Path: &lt;code&gt;/api/v2/databases/management/schemas/hardware/agents/search_agent:run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;HTTP Method: POST&lt;/li&gt;
&lt;li&gt;Request headers, shown in the UI as Name/Label:

&lt;ul&gt;
&lt;li&gt;Content-Type / application/json&lt;/li&gt;
&lt;li&gt;Accept / application/json&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Request Content:&lt;/li&gt;
&lt;li&gt;Request Type: Text&lt;/li&gt;
&lt;li&gt;Request Body:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stream"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{input user_prompt}}"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gumiilpnxbhska15766.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gumiilpnxbhska15766.png" width="800" height="409"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuwiwcxrkcdjoqs8j4cpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuwiwcxrkcdjoqs8j4cpy.png" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: Script&lt;/li&gt;
&lt;li&gt;Name: Return Output&lt;/li&gt;
&lt;li&gt;Input Variables, shown as Name / Value:&lt;/li&gt;
&lt;li&gt;response_body / &lt;code&gt;&amp;lt;step1 cortex agent action - response_body&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;status_code / &lt;code&gt;&amp;lt;step1 cortex agent action - status_code&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Script:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error: HTTP &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; - &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response_body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response_body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;answerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Extract text from the content array in the non-streaming response&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;answerText&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;answerText&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to parse response: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;ul&gt;
&lt;li&gt;Output Variables, shown as Label / Type:&lt;/li&gt;
&lt;li&gt;answer / String&lt;/li&gt;
&lt;li&gt;error / String&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3inhvnahng7mw4fszt4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3inhvnahng7mw4fszt4t.png" width="800" height="230"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ax4l40wmtj2slz7v6ii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ax4l40wmtj2slz7v6ii.png" width="800" height="327"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbes1tgr8wbwuxxwzcfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcbes1tgr8wbwuxxwzcfz.png" width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action output variable definition&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;answer&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;step2 return output - answer&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;error&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;step2 return output - error&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsgj01nypkewox3nhbvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsgj01nypkewox3nhbvr.png" width="798" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, select &lt;strong&gt;Publish&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configure the Subflow and Action Invocation
&lt;/h3&gt;

&lt;p&gt;The action is invoked through a subflow rather than used directly so that the &lt;strong&gt;execution user's context is preserved&lt;/strong&gt;. Calls from MCP Server should execute while retaining the identity of the user who submitted the question. This behavior is controlled through the subflow's &lt;strong&gt;Run As&lt;/strong&gt; setting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the Flow Designer home page, select &lt;strong&gt;New&lt;/strong&gt; and create a subflow.&lt;/li&gt;
&lt;li&gt;Configure it as follows.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Hardware Search Cortex Agents Sub Flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run As&lt;/td&gt;
&lt;td&gt;User who initiates session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Input and output variables&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input, shown as Label / Type: &lt;code&gt;user_prompt&lt;/code&gt; / String&lt;/li&gt;
&lt;li&gt;Outputs, shown as Label / Type: &lt;code&gt;answer&lt;/code&gt; / String and &lt;code&gt;error&lt;/code&gt; / String&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4xrtplskvyxctu0pa8o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4xrtplskvyxctu0pa8o.png" width="799" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action 1: Invoke &lt;code&gt;Ask Snowflake Cortex Agent&lt;/code&gt;. For the Snowflake OAuth Cortex Agents Alias connection, select &lt;strong&gt;Use Default Connection&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31k3k15e6i659r3vjjct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31k3k15e6i659r3vjjct.png" width="640" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action 2: Assign the subflow outputs:

&lt;ul&gt;
&lt;li&gt;answer / &lt;code&gt;&amp;lt;1 Ask Snowflake Cortex Agent - answer&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;error / &lt;code&gt;&amp;lt;1 Ask Snowflake Cortex Agent - error&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7v1i22gw6x2qtmmfkzpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7v1i22gw6x2qtmmfkzpj.png" width="798" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Test&lt;/strong&gt;, enter &lt;code&gt;What kind of hardware is managed by Tim?&lt;/code&gt;, and verify that the expected value is returned. Finally, select &lt;strong&gt;Publish&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv8ov82kug5023wzlxcw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv8ov82kug5023wzlxcw7.png" width="774" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2e72bt8rfzu7erou2sec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2e72bt8rfzu7erou2sec.png" width="799" height="238"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configure Permissions for the Subflow
&lt;/h3&gt;

&lt;p&gt;Finally, configure permissions so that an external AI agent can invoke this subflow through an MCP Client.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From &lt;strong&gt;Elevate Role&lt;/strong&gt;, select &lt;code&gt;security_admin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On the subflow properties page, select &lt;strong&gt;Managed Security&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add a new access control with the following settings.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operation&lt;/td&gt;
&lt;td&gt;invoke_from_ai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision Type&lt;/td&gt;
&lt;td&gt;Allow If&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;snc_internal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F37kj3rvr0zrbosg9slw8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F37kj3rvr0zrbosg9slw8.png" width="800" height="143"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff6zfzultmju2fp8e0lwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff6zfzultmju2fp8e0lwy.png" width="799" height="217"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrx0k248w9vbzhwftm45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrx0k248w9vbzhwftm45.png" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dedicated &lt;code&gt;invoke_from_ai&lt;/code&gt; operation makes it possible to distinguish between execution by a person through the UI and execution by an AI agent through MCP. Calls from AI can therefore be allowed or restricted independently of ordinary flow execution permissions.&lt;/p&gt;

&lt;p&gt;The ServiceNow subflow configuration is now complete.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure ServiceNow Knowledge Graph
&lt;/h2&gt;

&lt;p&gt;Software asset information is stored in ServiceNow tables, so natural-language search is implemented differently from the Snowflake part of the architecture. ServiceNow &lt;strong&gt;Knowledge Graph&lt;/strong&gt; defines relationships between tables as a graph, allowing the data to be traversed through natural-language queries.&lt;/p&gt;
&lt;h3&gt;
  
  
  Import the Tables
&lt;/h3&gt;

&lt;p&gt;Prepare an Excel file and import the following tables through App Engine Studio.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;admin&lt;/code&gt;: When configuring the &lt;code&gt;admin_id&lt;/code&gt; column, select &lt;strong&gt;Display&lt;/strong&gt;, then complete the import.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;software&lt;/code&gt;: When configuring the &lt;code&gt;admin_id&lt;/code&gt; column, set its referenced table to &lt;code&gt;admin&lt;/code&gt;, then complete the import.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;admin_id&lt;/th&gt;
&lt;th&gt;software_name&lt;/th&gt;
&lt;th&gt;vendor&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IT0001&lt;/td&gt;
&lt;td&gt;Microsoft 365 Apps&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Productivity suite for document creation, email, and collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0002&lt;/td&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;Business messaging and team communication platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0003&lt;/td&gt;
&lt;td&gt;Tableau Desktop&lt;/td&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;Data visualization and dashboard development software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0004&lt;/td&gt;
&lt;td&gt;Microsoft Teams&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Online meetings, chat, and collaboration software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0005&lt;/td&gt;
&lt;td&gt;Adobe Acrobat Pro&lt;/td&gt;
&lt;td&gt;Adobe&lt;/td&gt;
&lt;td&gt;PDF creation, editing, and electronic document management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0006&lt;/td&gt;
&lt;td&gt;Microsoft Authenticator&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Multi-factor authentication and secure account access application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0007&lt;/td&gt;
&lt;td&gt;ServiceNow Mobile&lt;/td&gt;
&lt;td&gt;ServiceNow&lt;/td&gt;
&lt;td&gt;Mobile access for workflow tasks, approvals, and service requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0001&lt;/td&gt;
&lt;td&gt;Salesforce Sales Cloud&lt;/td&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;Customer relationship management software for sales activities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0003&lt;/td&gt;
&lt;td&gt;Visual Studio Code&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Source code editor for development and data-related scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT0006&lt;/td&gt;
&lt;td&gt;Jabra Direct&lt;/td&gt;
&lt;td&gt;Jabra&lt;/td&gt;
&lt;td&gt;Device management software for Jabra headsets and firmware updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Configure Knowledge Graph
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Knowledge Graph &amp;gt; Knowledge Graph Designer&lt;/strong&gt; and create a knowledge graph named &lt;code&gt;software admin graph&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add an edge from the &lt;code&gt;software&lt;/code&gt; table to the &lt;code&gt;admin&lt;/code&gt; table. Registering the relationship between tables connected through a reference column as an edge improves the accuracy of natural-language queries.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi0lyj9q123cbnmx6hax9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi0lyj9q123cbnmx6hax9.png" width="799" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Test Schema&lt;/strong&gt;, enter &lt;code&gt;What kind of software is managed by Tim?&lt;/code&gt;, and verify that the expected result is returned.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg804r535pn4uby686cqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg804r535pn4uby686cqw.png" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ServiceNow Knowledge Graph configuration is now complete.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure ServiceNow MCP Server
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Configure MCP Server
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;All &amp;gt; MCP Server Console&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Servers&lt;/strong&gt;, select &lt;strong&gt;Create Server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure the following values.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Label&lt;/td&gt;
&lt;td&gt;assets-admin-ask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Short Description&lt;/td&gt;
&lt;td&gt;This MCP server manages the administrators of hardware and software assets. Hardware assets and administrators are stored in Snowflake, while software assets and administrators are stored in ServiceNow Knowledge Graph.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8k64ni7524v8g1fjao3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8k64ni7524v8g1fjao3.png" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configure the Tools
&lt;/h3&gt;

&lt;p&gt;Under &lt;strong&gt;Tools&lt;/strong&gt;, select &lt;strong&gt;Create Tool&lt;/strong&gt; and create the following two tools. This configuration presents the Snowflake data and ServiceNow data to users as two tools within a single MCP Server.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a tool in the &lt;strong&gt;Knowledge Graph&lt;/strong&gt; category:

&lt;ul&gt;
&lt;li&gt;Label: software admin graph&lt;/li&gt;
&lt;li&gt;Description: Search for software administrators and assets in ServiceNow Knowledge Graph.&lt;/li&gt;
&lt;li&gt;MCP Server: assets-admin-ask&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create a tool in the &lt;strong&gt;Subflow&lt;/strong&gt; category:

&lt;ul&gt;
&lt;li&gt;Label: Hardware Search Cortex Agents Sub Flow&lt;/li&gt;
&lt;li&gt;Description: Search for hardware assets and their administrators.&lt;/li&gt;
&lt;li&gt;MCP Server: assets-admin-ask&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9aq8zpgnc7n5y1rwaw18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9aq8zpgnc7n5y1rwaw18.png" width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure the Inbound Integration for Authentication
&lt;/h2&gt;

&lt;p&gt;OAuth authentication is also required when the MCP Client, Claude Code, connects to ServiceNow MCP Server. In this flow, ServiceNow accepts OAuth requests from an external client, so configure it as an inbound integration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;System OAuth &amp;gt; Inbound integrations&lt;/strong&gt; and select &lt;strong&gt;New Integration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure the following values.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;assets_admin_ask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider Name&lt;/td&gt;
&lt;td&gt;ServiceNow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirect URLs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://localhost:8080/callback&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlcjt4lii4q6g3uh6kbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqlcjt4lii4q6g3uh6kbs.png" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When Claude Code connects to a remote MCP Server through OAuth, it starts a temporary local web server to receive the authorization callback and token. By default, a random port may be used. Because a fixed redirect URL must be registered in the ServiceNow inbound integration in advance, use the &lt;code&gt;--callback-port&lt;/code&gt; option to &lt;strong&gt;fix the port number&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This implementation uses port &lt;code&gt;8080&lt;/code&gt;. Add the following URL to &lt;strong&gt;Redirect URLs&lt;/strong&gt; in the &lt;code&gt;assets_admin_ask&lt;/code&gt; inbound integration created above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080/callback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure the Claude MCP Client and Connect to MCP Server
&lt;/h2&gt;

&lt;p&gt;The ServiceNow-side preparation is now complete. Finally, configure Claude Code through its VS Code extension and connect to the MCP Server in ServiceNow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Register MCP Server with &lt;code&gt;claude mcp add&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Using the &lt;strong&gt;Client ID&lt;/strong&gt; and &lt;strong&gt;Client Secret&lt;/strong&gt; issued for the inbound integration, register the MCP Server through the Claude Code CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--client-id&lt;/span&gt; &amp;lt;Client ID issued by the inbound integration&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--client-secret&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--callback-port&lt;/span&gt; 8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="se"&gt;\&lt;/span&gt;
  servicenow-mcp &lt;span class="se"&gt;\&lt;/span&gt;
  https://&amp;lt;your-instance&amp;gt;.service-now.com/sncapps/mcp-server/mcp/&amp;lt;mcp-server-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Do not write the Client Secret directly on the command line. Specify &lt;code&gt;--client-secret&lt;/code&gt; without a value and enter the secret interactively when prompted, preventing it from being stored in shell history.&lt;/li&gt;
&lt;li&gt;Specifying &lt;code&gt;--scope user&lt;/code&gt; registers the server as a &lt;strong&gt;global user-level configuration&lt;/strong&gt; rather than limiting it to a particular project directory. If &lt;code&gt;--scope&lt;/code&gt; is omitted, the configuration is local to the project and will not be visible to Claude Code sessions started from another directory.&lt;/li&gt;
&lt;li&gt;In the URL, &lt;code&gt;&amp;lt;mcp-server-name&amp;gt;&lt;/code&gt; is the path name corresponding to the server created in MCP Server Console, in this example &lt;code&gt;assets-admin-ask&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This command only &lt;strong&gt;registers the configuration&lt;/strong&gt;. It does not open a browser at this stage. The OAuth authorization flow is started explicitly in the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the OAuth Authorization Flow
&lt;/h3&gt;

&lt;p&gt;Check the authentication state of the registered server with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;servicenow-mcp&lt;/code&gt; is displayed as &lt;code&gt;! Needs authentication&lt;/code&gt;, the configuration has been registered but authentication has not yet been completed. To begin authentication, run the following command in an interactive Claude Code session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select &lt;code&gt;servicenow-mcp&lt;/code&gt; from the list, then select &lt;strong&gt;Authenticate&lt;/strong&gt;. A browser opens and displays the ServiceNow login and authorization page. After authorization, the browser is redirected to &lt;code&gt;http://localhost:8080/callback&lt;/code&gt;, the token is passed to Claude Code, and authentication is completed.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;claude mcp list&lt;/code&gt; again. If &lt;code&gt;servicenow-mcp&lt;/code&gt; is displayed as &lt;code&gt;✔ Connected&lt;/code&gt;, the connection is complete.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pm5cmu32kl8vv63xq86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pm5cmu32kl8vv63xq86.png" width="336" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, ask for the software and hardware assets managed by Tim and verify that the correct results are returned. In Claude Code, the result should look similar to the following.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuy3uekr7zpzdogh4awkn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuy3uekr7zpzdogh4awkn.png" width="719" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This implementation uses ServiceNow MCP Server to provide seamless natural-language access from a single AI agent, Claude Code, to two data sources with different storage locations and query mechanisms: Snowflake Cortex Agent for hardware asset management and ServiceNow Knowledge Graph for software asset management.&lt;/p&gt;

&lt;p&gt;ServiceNow MCP Server makes it possible to invoke both native ServiceNow assets and external tools efficiently through a unified interface.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cloud</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
