<?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>Forem: Mark Nelson</title>
    <description>The latest articles on Forem by Mark Nelson (@mark_nelson_oracle).</description>
    <link>https://forem.com/mark_nelson_oracle</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3927505%2F13fcb607-d587-418c-bf02-eb061fcea3b9.jpg</url>
      <title>Forem: Mark Nelson</title>
      <link>https://forem.com/mark_nelson_oracle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mark_nelson_oracle"/>
    <language>en</language>
    <item>
      <title>Managed MCP in Autonomous AI Database: remote, governed tools per database</title>
      <dc:creator>Mark Nelson</dc:creator>
      <pubDate>Thu, 21 May 2026 10:32:46 +0000</pubDate>
      <link>https://forem.com/oracledevs/managed-mcp-in-autonomous-ai-database-remote-governed-tools-per-database-5edb</link>
      <guid>https://forem.com/oracledevs/managed-mcp-in-autonomous-ai-database-remote-governed-tools-per-database-5edb</guid>
      <description>&lt;p&gt;This is article 4 of 8 in my Oracle Database Skills series.&lt;/p&gt;

&lt;p&gt;Key Takeaways&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed MCP moves the action surface into the database itself. Tools run under real database identities with existing network controls, VPD policies, and audit trails already in force — no separate trust stack to build.&lt;/li&gt;
&lt;li&gt;Custom tools are database objects. You define the logic in PL/SQL and register it with DBMS_CLOUD_AI_AGENT.CREATE_TOOL, so governance travels with the tool definition rather than depending on each caller to do the right thing.&lt;/li&gt;
&lt;li&gt;The five questions security teams ask — who acted, under which identity, from what network path, against which tool, and where is the audit record — are answerable by design when the endpoint is managed by the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams begin where Article 3 ended: a single developer running a local MCP (Model Context Protocol) server to prove out tools and workflows. That’s perfect for a solo experiment and brittle the moment work becomes shared. As soon as you put an IDE on a shared sandbox or add a second teammate, you need identity that isn’t “whoever is at the laptop,” network boundaries that aren’t home Wi‑Fi, and an audit trail your security team can actually review. Autonomous AI Database’s managed MCP server gives you those primitives without rebuilding your trust stack. Each database exposes its own HTTP MCP endpoint. Clients authenticate as a database user. Tools are defined and governed inside the database. Existing controls—roles, Access Control Lists (ACLs) or Private Endpoint reachability, Virtual Private Database (VPD)/redaction, and Unified Auditing—stay in the path for every tool call.&lt;/p&gt;

&lt;p&gt;If you liked the local model—small, named tools; least‑privilege credentials; proof after the fact—you keep it. What changes is location and blast radius. The server runs with the database service. Calls execute with a database user’s roles. Network policy and auditing you already rely on continue to apply over streamable HTTP.&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.amazonaws.com%2Fuploads%2Farticles%2F1cnfq0myr5hotuestm84.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.amazonaws.com%2Fuploads%2Farticles%2F1cnfq0myr5hotuestm84.png" alt=" " width="800" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sources: consult the Autonomous Database MCP documentation for concepts, enablement, security, and troubleshooting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/about-mcp-server.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/about-mcp-server.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/use-mcp-server.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/use-mcp-server.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/mcp-server-concepts.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/mcp-server-concepts.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/security.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/security.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/troubleshoot-mcp-server.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/troubleshoot-mcp-server.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Version scope and assumptions
&lt;/h2&gt;

&lt;p&gt;This article focuses on Autonomous Database Serverless (Autonomous AI Database) with its managed, per‑database HTTP MCP endpoint and on custom tool registration with &lt;code&gt;DBMS_CLOUD_AI_AGENT&lt;/code&gt;. It does not cover on‑premises databases, self‑hosted proxies, or alternative deployment topologies. For authentication, follow the documented OAuth and short‑lived bearer token flows supported at publish time. The examples assume you can modify an Autonomous AI Database in Oracle Cloud Infrastructure (OCI) and create PL/SQL in your schema. Private Endpoint deployments require clients to run within, or be routed into, the VCN. Availability is documented as exclusive to Oracle Autonomous AI Database (versions 26ai and 19c) on the “About MCP Server” page; verify your environment against current docs before starting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you’ll need (prerequisites)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An Autonomous AI Database (Serverless) you can modify in OCI.&lt;/li&gt;
&lt;li&gt;Permission in OCI to update free‑form tags on that database (enablement uses a tag).&lt;/li&gt;
&lt;li&gt;A database user to authenticate to MCP (least‑privilege strongly recommended).&lt;/li&gt;
&lt;li&gt;Database privileges to create/compile PL/SQL in your schema and to execute &lt;code&gt;DBMS_CLOUD_AI_AGENT&lt;/code&gt; (DBA can grant &lt;code&gt;EXECUTE&lt;/code&gt; on the package).&lt;/li&gt;
&lt;li&gt;Network posture set appropriately:

&lt;ul&gt;
&lt;li&gt;Public endpoint constrained by ACLs to known IPs/CIDRs, or&lt;/li&gt;
&lt;li&gt;Private Endpoint with clients running inside or routed/peered into the VCN.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;An MCP‑aware client that supports streamable HTTP (e.g., Claude Desktop via &lt;code&gt;mcp-remote&lt;/code&gt;; VS Code with Cline). Ensure the client’s transport is set to streamable HTTP per its configuration schema.&lt;/li&gt;

&lt;li&gt;To view audit trails, privileges such as &lt;code&gt;AUDIT_VIEWER&lt;/code&gt; (or equivalent access to &lt;code&gt;UNIFIED_AUDIT_TRAIL&lt;/code&gt;) and any required unified audit policies per your security team.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why move from local to managed
&lt;/h2&gt;

&lt;p&gt;Local MCP gets you speed but leaves basic enterprise questions unanswered: Who ran this? Under which roles? From where? What policy filtered the result? Where’s the audit record? A managed MCP endpoint answers them by design. Identity is a database user, so tools run with that user’s roles and any VPD or redaction policies. Network is first‑class: public endpoints honor ACLs; Private Endpoint confines reachability to your VCN. Evidence lives with the data in Unified Auditing, and—if your organization uses it—Oracle Data Safe can centralize review. You don’t assemble a separate trust stack for assistants; you reuse the one already protecting your data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enable the per‑database MCP endpoint
&lt;/h2&gt;

&lt;p&gt;Enabling MCP is an OCI operation. You turn it on per database with a free‑form tag. After a brief delay, the database details page shows the MCP URL. Use that exact URL; Private Endpoint deployments will reflect your VCN in the hostname. The documented public endpoint pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://dataaccess.adb.{region-identifier}.oraclecloudapps.com/adb/mcp/v1/databases/{database-ocid}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Private Endpoint databases, the documented pattern uses the database Private Endpoint hostname prefix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://{hostname_prefix}.adb.{region-identifier}.oraclecloudapps.com/adb/mcp/v1/databases/{database-ocid}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the OCI Console, open your Autonomous AI Database (Serverless) and add this free‑form tag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;adb$feature&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Value: &lt;code&gt;{"name":"mcp_server","enable":true}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tighten network posture before you connect. For public endpoints, restrict inbound IPs with an ACL. For Private Endpoint, keep the MCP URL accessible only within your VCN; clients must run in or have routed/peered reachability to that network. The enablement and security pages in the docs provide step‑by‑step screens for both configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authenticate to the managed MCP endpoint
&lt;/h2&gt;

&lt;p&gt;The managed server accepts OAuth or short‑lived bearer tokens as documented. Tokens are issued per database and presented on every request as a bearer header over streamable HTTP.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token endpoint path (documented): &lt;code&gt;/adb/auth/v1/databases/{database-ocid}/token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Present the token in client requests as: &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tokens are typically valid for approximately one hour; confirm the current duration and request body in the Use MCP Server page before automating refresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Client configuration varies slightly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Desktop via &lt;code&gt;mcp-remote&lt;/code&gt;: configure a remote MCP server using your database’s MCP URL and add the &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; header in the bridge’s HTTP headers field. Set the transport to streamable HTTP as required by your client (for example, a setting named &lt;code&gt;streamable-http&lt;/code&gt; or &lt;code&gt;streamableHttp&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;VS Code with Cline: add a remote HTTP MCP server pointing to the MCP URL and set &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; in the request headers section. Ensure the transport is explicitly set to streamable HTTP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A minimal Cline-style configuration looks like this, with placeholders for your database URL and bearer token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"adb-managed-mcp"&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;"streamableHttp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dataaccess.adb.{region-identifier}.oraclecloudapps.com/adb/mcp/v1/databases/{database-ocid}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&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;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;token&amp;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;/div&gt;



&lt;p&gt;If your database uses a Private Endpoint, make sure the client host has network reachability into the VCN. Valid credentials against an unreachable hostname still fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish a custom tool the database can govern
&lt;/h2&gt;

&lt;p&gt;Unlike local MCP servers that host code beside the client, the managed server looks up tools defined in the database. You create small, purposeful functions in your schema and register them with &lt;code&gt;DBMS_CLOUD_AI_AGENT.CREATE_TOOL&lt;/code&gt;. That keeps control centralized: the definitions live in the database, metadata is queryable from views, and execution inherits database roles and policy.&lt;/p&gt;

&lt;p&gt;To keep the example easy to reason about, we’ll publish a read‑only tool that returns a paginated JSON array of objects in a given schema that are visible to the executing database user and are not in Oracle‑maintained schemas. This variant excludes Oracle‑maintained schemas using &lt;code&gt;ALL_USERS.ORACLE_MAINTAINED&lt;/code&gt;. The Oracle docs also include a sample that filters on &lt;code&gt;ALL_OBJECTS.ORACLE_MAINTAINED = 'N'&lt;/code&gt;; either approach works on Autonomous Database.&lt;/p&gt;

&lt;p&gt;First, create and compile the function:&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="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;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;list_objects_json&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;p_schema&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;p_offset&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;p_limit&lt;/span&gt;  &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;CLOB&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
  &lt;span class="n"&gt;v_json&lt;/span&gt;  &lt;span class="k"&gt;CLOB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="n"&gt;JSON_ARRAYAGG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
             &lt;span class="n"&gt;JSON_OBJECT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="s1"&gt;'SCHEMA_NAME'&lt;/span&gt; &lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="k"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="s1"&gt;'OBJECT_NAME'&lt;/span&gt; &lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="n"&gt;object_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="s1"&gt;'OBJECT_TYPE'&lt;/span&gt; &lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="n"&gt;object_type&lt;/span&gt;
             &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="k"&gt;CLOB&lt;/span&gt;
           &lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="s1"&gt;'[]'&lt;/span&gt;
         &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;v_json&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_type&lt;/span&gt;
      &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;all_objects&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
      &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;UPPER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p_schema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
               &lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;all_users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;
               &lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;owner&lt;/span&gt;
               &lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oracle_maintained&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'N'&lt;/span&gt;
             &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;ORDER&lt;/span&gt;  &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_name&lt;/span&gt;
      &lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="n"&gt;p_offset&lt;/span&gt; &lt;span class="k"&gt;ROWS&lt;/span&gt; &lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;NEXT&lt;/span&gt; &lt;span class="n"&gt;p_limit&lt;/span&gt; &lt;span class="k"&gt;ROWS&lt;/span&gt; &lt;span class="k"&gt;ONLY&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;v_json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check for compilation errors before registering a tool:&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="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;ERRORS&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;list_objects_json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Or:&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;user_errors&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt;  &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, register the function as an MCP tool. Use the attribute names exactly as shown in the documentation for &lt;code&gt;DBMS_CLOUD_AI_AGENT.CREATE_TOOL.attributes&lt;/code&gt;; mismatches can cause registration or invocation errors. Common keys include &lt;code&gt;instruction&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;, and &lt;code&gt;tool_inputs&lt;/code&gt;. For this example, rely on the PL/SQL defaults defined in the function and do not include unverified default values in the &lt;code&gt;tool_inputs&lt;/code&gt; JSON.&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="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="n"&gt;DBMS_CLOUD_AI_AGENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CREATE_TOOL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tool_name&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'LIST_OBJECTS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="s1"&gt;'~{
      "instruction": "Return a JSON array of objects visible to the executing database user for the given schema (excluding Oracle-maintained schemas). Always respect p_limit and p_offset.",
      "function": "LIST_OBJECTS_JSON",
      "tool_inputs": [
        { "name": "p_schema", "type": "string", "required": true,  "description": "Schema name (case-insensitive)" },
        { "name": "p_offset", "type": "number", "required": false, "description": "Row offset for pagination" },
        { "name": "p_limit",  "type": "number", "required": false, "description": "Max rows to return" }
      ]
    }~'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify that registration succeeded by querying the registry view. Column sets differ by version, so keep the check simple:&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="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;user_cloud_ai_agent_tools&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt;  &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see “insufficient privileges,” ask your DBA to grant &lt;code&gt;EXECUTE&lt;/code&gt; on &lt;code&gt;DBMS_CLOUD_AI_AGENT&lt;/code&gt; to your user and retry.&lt;/p&gt;

&lt;p&gt;Note: &lt;code&gt;DBMS_CLOUD_AI_AGENT&lt;/code&gt; supports both custom PL/SQL‑backed tools and built‑in tool types. For the current list of built‑in types and parameters, see the package reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/dbms-cloud-ai-agent-package.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/dbms-cloud-ai-agent-package.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also note: MLE JavaScript is not supported for MCP tools. Java can be used via PL/SQL calling Java stored procedures when &lt;code&gt;JAVAVM&lt;/code&gt; is enabled on the database (see the docs for details).&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect a client and try the tool
&lt;/h2&gt;

&lt;p&gt;Once authentication works and the tool is registered, connect an MCP‑aware client and ask it to use the tool. In Claude Desktop, add a remote MCP server that points to your database’s MCP URL, include the &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt; header, and set transport to streamable HTTP per the client’s schema. In a fresh chat, prompt the assistant: “Use the LIST_OBJECTS tool to list 5 objects in the HR schema.” You should see the assistant invoke the tool and stream back JSON. In VS Code with Cline, add the same MCP URL in the extension’s settings, supply the same header, and ensure the streamable HTTP transport is selected; then request &lt;code&gt;LIST_OBJECTS&lt;/code&gt; with &lt;code&gt;p_schema=HR&lt;/code&gt; and &lt;code&gt;p_limit=5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A representative response from the tool looks like this (truncated):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"SCHEMA_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"OBJECT_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"COUNTRIES"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"OBJECT_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;"TABLE"&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;"SCHEMA_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"OBJECT_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EMPLOYEES"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"OBJECT_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;"TABLE"&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;"SCHEMA_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"OBJECT_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JOBS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"OBJECT_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;"TABLE"&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;/div&gt;



&lt;p&gt;On Private Endpoint databases, run those clients from a host inside the VCN or with routed/peered access. Lack of reachability is the most common reason a seemingly correct configuration fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observe the audit trail (roles permitting)
&lt;/h2&gt;

&lt;p&gt;Unified Auditing on Autonomous Database records activity under your database user. Exact fields and event names depend on your version and your organization’s audit policy. With appropriate privileges (for example, &lt;code&gt;AUDIT_VIEWER&lt;/code&gt; or equivalent access to &lt;code&gt;UNIFIED_AUDIT_TRAIL&lt;/code&gt;), you can review a time‑bounded window of recent activity:&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="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;event_timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dbusername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj_privilege&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unified_audit_policies&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;unified_audit_trail&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;event_timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;SYSTIMESTAMP&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="s1"&gt;'15'&lt;/span&gt; &lt;span class="k"&gt;MINUTE&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt;    &lt;span class="k"&gt;UPPER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dbusername&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;UPPER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt;  &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;event_timestamp&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;FIRST&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="k"&gt;ROWS&lt;/span&gt; &lt;span class="k"&gt;ONLY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Autonomous Database retains unified audit data for about 14 days by default; if you need longer retention or centralized reporting, integrate Oracle Data Safe. When you author VPD or audit policies for MCP, do not rely on &lt;code&gt;SESSION_USER&lt;/code&gt;. Use MCP context attributes instead—for example, &lt;code&gt;sys_context('MCP_SERVER_ACCESS_CONTEXT','USER_IDENTITY')&lt;/code&gt; as shown in the Security docs. Some concept pages may refer to the MCP context container using slightly different naming in prose; follow the exact string in the Security examples. Your security team may also enable additional unified audit policies to capture MCP‑specific attributes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operate safely and clean up
&lt;/h2&gt;

&lt;p&gt;Treat tools as product surface area. Keep them small and read‑heavy at first; add write paths only when you can articulate least privilege and validate inputs. Prefer schemas you own to avoid accidental privilege sprawl. Version tool registrations as code and require review before deployment.&lt;/p&gt;

&lt;p&gt;When a tool is no longer needed, remove both the registration and the underlying function:&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="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="n"&gt;DBMS_CLOUD_AI_AGENT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DROP_TOOL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'LIST_OBJECTS'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;list_objects_json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you expand usage, periodically re‑check ACLs on public endpoints and confirm Private Endpoint posture remains correct, especially after network changes. Rate limiting is enforced by the managed service; consult current release notes for behavior and limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Most issues fall into a few buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compilation and registration: fix PL/SQL errors (&lt;code&gt;SHOW ERRORS&lt;/code&gt;, &lt;code&gt;USER_ERRORS&lt;/code&gt;) before registering. Ensure your user has &lt;code&gt;EXECUTE&lt;/code&gt; on &lt;code&gt;DBMS_CLOUD_AI_AGENT&lt;/code&gt;. If registry queries fail with unknown columns, select only &lt;code&gt;tool_name&lt;/code&gt; and consult versioned docs for metadata.&lt;/li&gt;
&lt;li&gt;Connectivity: verify you’re using the MCP URL exactly as shown in the console. For public endpoints, confirm your IP/CIDR is in the database ACL. For Private Endpoint, confirm the client host has routed/peered access to the VCN.&lt;/li&gt;
&lt;li&gt;Authentication: obtain tokens from &lt;code&gt;/adb/auth/v1/databases/{database-ocid}/token&lt;/code&gt; and present them as &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;. Copy the exact request body and lifetime from the current docs. Place headers where your client expects them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a client claims to connect but tool calls fail, double-check that attribute keys in &lt;code&gt;CREATE_TOOL&lt;/code&gt; match the documentation exactly; case mismatches cause registration or invocation errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;With a per-database MCP endpoint, one governed tool, and a way to verify activity in Unified Auditing, you can expand safely. Start with a small set of read-heavy tools your team actually needs. Introduce narrow write paths with explicit inputs and clear privileges. Treat tool definitions like code: review them, version them, and track changes.&lt;/p&gt;

&lt;p&gt;The next article moves from action surfaces to reasoning scope: Select AI and AI Profiles. That is where you decide what natural-language-to-SQL should be allowed to see, how generated SQL should be inspected, and how to keep an assistant’s query generation inside a deliberate profile instead of a broad database connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freshness note
&lt;/h2&gt;

&lt;p&gt;Content validated against the Autonomous Database MCP documentation on 2026-05-08. Re-check the Use MCP Server and Security pages for any changes to endpoint paths, JSON key names, token lifetimes, and audit details before publishing or automating.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>mcp</category>
      <category>security</category>
    </item>
    <item>
      <title>Controlled Oracle Actions with SQLcl MCP</title>
      <dc:creator>Mark Nelson</dc:creator>
      <pubDate>Tue, 19 May 2026 12:07:51 +0000</pubDate>
      <link>https://forem.com/oracledevs/controlled-oracle-actions-with-sqlcl-mcp-120e</link>
      <guid>https://forem.com/oracledevs/controlled-oracle-actions-with-sqlcl-mcp-120e</guid>
      <description>&lt;p&gt;This is article 3 of 8 in my Oracle Database Skills series.&lt;/p&gt;

&lt;p&gt;Kay Takeaways&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The assistant connects using a saved connection name, not a pasted password. Credentials stay in the SQLcl store and out of prompts, so the model sees the name but never the secret.&lt;/li&gt;
&lt;li&gt;Restrict levels define the tool surface at runtime. Starting at the most restrictive setting limits what the assistant can do; you widen the surface deliberately as the use case earns it.&lt;/li&gt;
&lt;li&gt;Session tagging and the MCP activity log give a DBA verifiable proof of what ran. Evidence comes from the database, not the chat transcript — that distinction matters when someone asks what the assistant actually did.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the last piece, you routed Oracle prompts through db/SKILL.md to keep intent explicit (see &lt;a href="https://blogs.oracle.com/developers/ai-agents-know-sql-oracle-database-skills-teach-them-oracle" rel="noopener noreferrer"&gt;Article 1&lt;/a&gt; and &lt;a href="https://blogs.oracle.com/developers/route-dont-flood-using-db-skill-md-to-steer-oracle%e2%80%91aware-assistants" rel="noopener noreferrer"&gt;Article 2&lt;/a&gt; in this series). Now it’s time to act—locally, with guardrails, and with an evidence trail your DBA can verify. SQLcl MCP gives you that posture. You launch it as a local process (&lt;code&gt;sql -mcp&lt;/code&gt;); it exposes a small catalog of named tools over stdio; it connects through saved connections you control; it starts in a highly restricted mode by default; and it leaves database‑native traces you can query later. That’s the right shape for early assistant experiments on a developer machine.&lt;/p&gt;

&lt;p&gt;Citations for versioned behavior are in Oracle’s SQLcl documentation (for example, “Using SQLcl MCP Server,” “SQLcl MCP Server tools,” “Starting and managing SQLcl MCP Server,” “Restrict Levels,” “Preparing your environment,” and “Saving connections” in the 25.4 and 26.1 editions). Treat any version‑sensitive claim here as “verify against your installed docs.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need before you start
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SQLcl 25.2.0 or newer with MCP support&lt;/li&gt;
&lt;li&gt;Java 17 or 21 available to SQLcl (per “Preparing your environment”)&lt;/li&gt;
&lt;li&gt;A non‑production Oracle Database (19c+ suffices for this demo)&lt;/li&gt;
&lt;li&gt;A least‑privilege, read‑only database user for testing&lt;/li&gt;
&lt;li&gt;A saved SQLcl connection that includes a stored password, created with &lt;code&gt;-save&lt;/code&gt; and &lt;code&gt;-savepwd&lt;/code&gt; (required for non‑interactive MCP connects)&lt;/li&gt;
&lt;li&gt;Permission to query &lt;code&gt;V$SESSION&lt;/code&gt; for evidence, or access to an equivalent DBA‑provided view that exposes &lt;code&gt;MODULE&lt;/code&gt; and &lt;code&gt;ACTION&lt;/code&gt; for your sessions&lt;/li&gt;
&lt;li&gt;If you use TNS aliases, configure Oracle Net as usual (for example, set &lt;code&gt;TNS_ADMIN&lt;/code&gt; to your &lt;code&gt;tnsnames.ora&lt;/code&gt; directory). If your MCP client launches &lt;code&gt;sql -mcp&lt;/code&gt; with a custom environment, pass &lt;code&gt;TNS_ADMIN&lt;/code&gt; there as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security note: Storing passwords is a prerequisite for non‑interactive MCP connects. Keep this to a sandbox, use a read‑only account, and lock down your local SQLcl store (commonly under &lt;code&gt;~/.dbtools&lt;/code&gt;) per your organization’s secrets policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SQLcl MCP is the right local action layer
&lt;/h2&gt;

&lt;p&gt;A tempting shortcut is to paste credentials into a prompt and let a model “try something.” That’s exactly what you want to avoid. SQLcl MCP flips the pattern: you launch &lt;code&gt;sql -mcp&lt;/code&gt; locally and expose a small set of structured tools. Your client can list saved connections, connect by name, run SQL, and disconnect. The MCP connect path uses saved/named connections; the tool does not accept raw credentials in the call. For non‑interactive use, the password must be saved (&lt;code&gt;-savepwd&lt;/code&gt;). You decide which saved connections exist and what privileges they carry.&lt;/p&gt;

&lt;p&gt;Restrict levels are SQLcl’s runtime safety gates that limit which features and commands are allowed. In MCP mode the server defaults to restrict level 4 (most restrictive) unless you override it with &lt;code&gt;-R&lt;/code&gt;, so the surface stays small until you intentionally broaden it. That’s a posture you can explain to a DBA and adjust deliberately as you earn trust.&lt;/p&gt;

&lt;p&gt;References: SQLcl MCP overview and startup; Saved connections; Restrict levels (25.4/26.1 docs).&lt;/p&gt;

&lt;h2&gt;
  
  
  How the server behaves under the hood
&lt;/h2&gt;

&lt;p&gt;When your client launches &lt;code&gt;sql -mcp&lt;/code&gt;, SQLcl starts a small server over stdio and advertises a catalog of named tools. Message envelopes vary by client, but tool names and arguments follow the SQLcl MCP documentation. As of the 26.1 docs, commonly listed tools include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list-connections&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disconnect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run-sql&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run-sqlcl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some builds also include &lt;code&gt;schema-information&lt;/code&gt;. Tool availability and argument shapes can vary by version/build; verify against your installed docs.&lt;/p&gt;

&lt;p&gt;Connections are discovered from your local SQLcl store (for example, &lt;code&gt;~/.dbtools&lt;/code&gt;). To make a connection usable without a prompt, save it with a stored password. Oracle documents this as a prerequisite for hands‑off connection by name.&lt;/p&gt;

&lt;p&gt;Restrict levels shape what the process can do. In MCP mode, the server defaults to restrict level 4 (most restrictive) unless you override it with &lt;code&gt;-R&lt;/code&gt;. Outside MCP, generic SQLcl defaults to restrict level 0 (unrestricted) unless you pass &lt;code&gt;-R&lt;/code&gt;; always verify the “Restrict Levels” page for your exact build.&lt;/p&gt;

&lt;p&gt;References: SQLcl MCP tools; Saved connections; Restrict levels and &lt;code&gt;-R&lt;/code&gt; flag (25.4/26.1 docs).&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.amazonaws.com%2Fuploads%2Farticles%2Fd6ad104v03cpgapuc7ht.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.amazonaws.com%2Fuploads%2Farticles%2Fd6ad104v03cpgapuc7ht.png" alt="MCP Restrict Levels" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Traceability you can prove (monitoring and governance)
&lt;/h2&gt;

&lt;p&gt;Before you run anything, plan how you’ll show what happened. The most portable approach is to tag your session with &lt;code&gt;DBMS_APPLICATION_INFO&lt;/code&gt; and then confirm it in &lt;code&gt;V$SESSION&lt;/code&gt;. The tag appears in performance tooling and helps a DBA correlate what ran and why. By default, SQLcl MCP records the execution history of requests in &lt;code&gt;DBTOOLS$MCP_LOG&lt;/code&gt; (per Oracle docs). Access, owner/schema, and privileges vary by environment, so confirm presence and permissions with your DBA.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tagging mechanism: &lt;code&gt;DBMS_APPLICATION_INFO.SET_MODULE&lt;/code&gt; and &lt;code&gt;SET_ACTION&lt;/code&gt; (documented in Oracle Database PL/SQL packages)&lt;/li&gt;
&lt;li&gt;Evidence view: &lt;code&gt;V$SESSION&lt;/code&gt; (privilege‑gated; ask a DBA for a scoped alternative if you lack access)&lt;/li&gt;
&lt;li&gt;Logs: &lt;code&gt;DBTOOLS$MCP_LOG&lt;/code&gt; records requests by default; access and retention are environment‑specific&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;References: &lt;code&gt;DBMS_APPLICATION_INFO&lt;/code&gt;; &lt;code&gt;V$SESSION&lt;/code&gt;; SQLcl MCP monitoring/logging pages (25.4/26.1 docs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Version scope and environment notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep SQLcl at 25.2.0+ for MCP features and run it with Java 17 or 21 (per “Preparing your environment”).&lt;/li&gt;
&lt;li&gt;The tool catalog and defaults can evolve; the 25.4 and 26.1 guides capture current behavior, but verify against your installed version.&lt;/li&gt;
&lt;li&gt;The demo assumes Oracle Database 19c or later and avoids database features tied to 26ai.&lt;/li&gt;
&lt;li&gt;Some clients (for example, SQL Developer for VS Code) can launch and manage the MCP server for you; follow your client’s documentation for its configuration format and capabilities, which can change by version.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A small, traceable demo you can run today
&lt;/h2&gt;

&lt;p&gt;This walkthrough saves a single read‑only connection, launches the MCP server, validates that the connection is discoverable, connects by name, tags its session, runs one read‑only discovery query, and disconnects. Each step includes copy‑paste commands and why the step matters.&lt;/p&gt;

&lt;p&gt;1) Save a named connection for a read‑only sandbox user&lt;/p&gt;

&lt;p&gt;Open SQLcl, connect once interactively, and persist the connection with a stored password so MCP can use it without a prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sql /nolog
&lt;span class="c"&gt;# If you connect by service name:&lt;/span&gt;
conn demo_ro@//host:1521/service &lt;span class="nt"&gt;-save&lt;/span&gt; demo_ro &lt;span class="nt"&gt;-savepwd&lt;/span&gt;
&lt;span class="c"&gt;# If you connect by TNS alias (ensure Oracle Net is configured and tnsnames.ora is discoverable):&lt;/span&gt;
&lt;span class="c"&gt;# conn demo_ro@ALIAS -save demo_ro -savepwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted, enter the password interactively. The &lt;code&gt;-save&lt;/code&gt; and &lt;code&gt;-savepwd&lt;/code&gt; flags persist the named connection (commonly in &lt;code&gt;~/.dbtools&lt;/code&gt;) with a stored password so MCP can use it non‑interactively. Use a sandbox‑only, least‑privilege account and follow your org’s secrets policy for local credential storage.&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.amazonaws.com%2Fuploads%2Farticles%2Fe3pdi777ir9vojfm7mmd.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.amazonaws.com%2Fuploads%2Farticles%2Fe3pdi777ir9vojfm7mmd.png" alt="Saved Connection Handshake" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) Start the MCP server (keep the default restrict level)&lt;/p&gt;

&lt;p&gt;Launch SQLcl in MCP mode and leave the terminal open. Unless your client does this for you, this process is the local server your MCP‑aware client will talk to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sql &lt;span class="nt"&gt;-mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, restrict level 4 applies. If you ever see broader capability than expected, confirm that the process was not started with a lower restrict level (for example, &lt;code&gt;-R 0&lt;/code&gt;). For early experiments, stick with the default level 4.&lt;/p&gt;

&lt;p&gt;3) Point your MCP‑aware client at SQLcl&lt;/p&gt;

&lt;p&gt;Configure your client to launch &lt;code&gt;sql -mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Representative MCP server configuration for a desktop client. Field names and file locations vary by client; follow your client’s documentation for the exact schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&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;"sqlcl"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"TNS_ADMIN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/network/admin"&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;/div&gt;



&lt;p&gt;4) Verify that the saved connection is discoverable&lt;/p&gt;

&lt;p&gt;Before you connect, ask the server to list saved connections. Seeing &lt;code&gt;demo_ro&lt;/code&gt; here confirms that the server can use it non‑interactively.&lt;/p&gt;

&lt;p&gt;Representative MCP tool call; adapt to your client’s message envelope (for example, a surrounding &lt;code&gt;"type": "call_tool"&lt;/code&gt;), server name, and argument key names as defined by your client and the SQLcl MCP tools page for your installed version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list-connections"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;/div&gt;



&lt;p&gt;If &lt;code&gt;demo_ro&lt;/code&gt; does not appear, revisit the &lt;code&gt;conn ... -save -savepwd&lt;/code&gt; step and make sure you created the connection under the same OS user/profile that SQLcl is using.&lt;/p&gt;

&lt;p&gt;5) Connect by name and tag the session&lt;/p&gt;

&lt;p&gt;Connect using the saved name, then tag the session with &lt;code&gt;MODULE&lt;/code&gt; and &lt;code&gt;ACTION&lt;/code&gt; so you can find it later in performance views and, if accessible, MCP logs.&lt;/p&gt;

&lt;p&gt;Representative MCP tool call; adapt to your client’s envelope and argument names. Note: some clients use &lt;code&gt;name&lt;/code&gt;, others &lt;code&gt;connectionName&lt;/code&gt; or &lt;code&gt;connection_name&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"connect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo_ro"&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="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"run-sql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BEGIN DBMS_APPLICATION_INFO.SET_MODULE('sqlcl-mcp','schema-discovery'); END;"&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;/div&gt;



&lt;p&gt;Tagging is optional but strongly recommended. It creates a human‑readable breadcrumb for exactly this experiment.&lt;/p&gt;

&lt;p&gt;6) Run one read‑only discovery query&lt;/p&gt;

&lt;p&gt;To keep the example universal, start with a query against objects you own:&lt;/p&gt;

&lt;p&gt;Representative MCP tool call; adapt to your client’s envelope and argument names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"run-sql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SELECT table_name FROM user_tables ORDER BY table_name FETCH FIRST 5 ROWS ONLY"&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;/div&gt;



&lt;p&gt;If your account has cross‑schema visibility, you can adjust the query to &lt;code&gt;ALL_TABLES&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Representative MCP tool call; adapt to your client’s envelope and argument names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"run-sql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SELECT owner, table_name FROM all_tables WHERE owner = UPPER('&amp;lt;YOUR_SCHEMA&amp;gt;') ORDER BY table_name FETCH FIRST 5 ROWS ONLY"&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;/div&gt;



&lt;p&gt;Keep the action read‑only while you learn the surface and review the evidence with a DBA partner.&lt;/p&gt;

&lt;p&gt;Optional: Some clients also expose &lt;code&gt;run-sqlcl&lt;/code&gt; for SQLcl console commands (for example, &lt;code&gt;DESC&lt;/code&gt;). At restrict level 4, many SQLcl commands are disabled; simple describe operations may work depending on your build—verify in your environment. If enabled in your version and posture, a representative call looks like:&lt;/p&gt;

&lt;p&gt;Representative MCP tool call; adapt to your client’s envelope and argument names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"run-sqlcl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DESC USER_TABLES"&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;/div&gt;



&lt;p&gt;Treat this as optional; the minimal surface for early tests is &lt;code&gt;run-sql&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;7) Disconnect when you are done&lt;/p&gt;

&lt;p&gt;Disconnecting is good hygiene and makes your test’s boundaries clear.&lt;/p&gt;

&lt;p&gt;Representative MCP tool call; adapt to your client’s envelope and argument names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"disconnect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;/div&gt;



&lt;h2&gt;
  
  
  Prove what happened
&lt;/h2&gt;

&lt;p&gt;Evidence checks depend on privileges. If your account cannot query performance views, ask your DBA for a scoped alternative that exposes &lt;code&gt;MODULE&lt;/code&gt; and &lt;code&gt;ACTION&lt;/code&gt; for your sessions.&lt;/p&gt;

&lt;p&gt;See the tag in a live session view:&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="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;machine&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="k"&gt;session&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'sqlcl-mcp'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, SQLcl MCP records requests in &lt;code&gt;DBTOOLS$MCP_LOG&lt;/code&gt;. You can review recent entries there as well. Presence is standard per the docs, but owner/schema and access vary by setup; in some environments the table resides under a DBA‑owned schema. Treat the query below as an example and ask your DBA for the owner or a scoped view if needed.&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="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mcp_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_point_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_point_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log_message&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;DBTOOLS&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;MCP_LOG&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt;  &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;FETCH&lt;/span&gt;  &lt;span class="k"&gt;FIRST&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;ROWS&lt;/span&gt; &lt;span class="k"&gt;ONLY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If neither view is available to you directly, a DBA can run the checks or provide a narrow view limited to your test user.&lt;/p&gt;

&lt;h2&gt;
  
  
  When something goes wrong
&lt;/h2&gt;

&lt;p&gt;If the client prompts for a password, the saved connection likely lacks a stored secret. Recreate it with both &lt;code&gt;-save&lt;/code&gt; and &lt;code&gt;-savepwd&lt;/code&gt; so MCP can connect non‑interactively. When the tool catalog looks unfamiliar or is missing entries, you may be on a different SQLcl version; check the MCP tools page for your installed build (the 25.4 and 26.1 docs capture current behavior). If you don’t see your session tag in &lt;code&gt;V$SESSION&lt;/code&gt;, it’s probably a privilege boundary rather than a failure to tag; ask for a scoped view or a one‑time verification. If the server shows more capability than your risk posture allows, confirm the restrict level and restart without any &lt;code&gt;-R&lt;/code&gt; override so the default restrictive posture applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this posture earns DBA trust
&lt;/h2&gt;

&lt;p&gt;DBAs reasonably resist assistants that can write to production. SQLcl MCP avoids that leap of faith. You connect through named entries you control. You default to a restrictive mode. You tag your sessions with &lt;code&gt;MODULE&lt;/code&gt; and &lt;code&gt;ACTION&lt;/code&gt; so activity shows up cleanly in performance tooling. And, where available, MCP logs give an after‑the‑fact record. The point is not speed; it’s reversibility and evidence. In a world where models sometimes propose creative fixes, that’s the currency that gets you permission to try again tomorrow.&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.amazonaws.com%2Fuploads%2Farticles%2Fsbuc74iqyrd98sluda8d.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.amazonaws.com%2Fuploads%2Farticles%2Fsbuc74iqyrd98sluda8d.png" alt="Local SQLcl MCP Evidence Trail" width="719" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s intentionally out of scope here
&lt;/h2&gt;

&lt;p&gt;This article focuses on local SQLcl MCP on a developer workstation, read‑only sandboxes, and minimal evidence checks. It does not cover managed or remote MCP hosting, enterprise audit/policy, advanced reasoning patterns (for example, Select AI or AI Profiles), vector‑native RAG, or change‑management workflows. Those topics are addressed next when we move beyond a single machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this leaves you next
&lt;/h2&gt;

&lt;p&gt;You now have a local, developer‑friendly path for safe, traceable Oracle actions. Previously in this series: Article 1 (routing) and Article 2 (route‑to‑action bridge). Next up: Article 4, where we carry these guardrails into a managed path with audit, policy, and team controls so you can scale without losing the evidence and restraint you established here.&lt;/p&gt;

&lt;p&gt;Freshness Note: Version‑sensitive behavior (tool catalog, defaults, restrict levels) should be verified against your installed SQLcl documentation (notably the 25.4 and 26.1 editions).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>mcp</category>
      <category>security</category>
    </item>
    <item>
      <title>Route, Don’t Flood: Using db/SKILL.md to Steer Oracle‑Aware Assistants</title>
      <dc:creator>Mark Nelson</dc:creator>
      <pubDate>Fri, 15 May 2026 12:21:32 +0000</pubDate>
      <link>https://forem.com/oracledevs/route-dont-flood-using-dbskillmd-to-steer-oracle-aware-assistants-4el0</link>
      <guid>https://forem.com/oracledevs/route-dont-flood-using-dbskillmd-to-steer-oracle-aware-assistants-4el0</guid>
      <description>&lt;p&gt;If you’ve tried to make an assistant “Oracle‑aware,” you’ve likely hit the same wall: you paste a stack of links, the model blends vendor‑neutral habits with stale Oracle guidance, and the answers get vague when you need precision. The fix isn’t more context—it’s better routing. One Oracle skill at a time, in the right order, so every next move follows Oracle’s own sequence.&lt;/p&gt;

&lt;p&gt;In Article 1 we outlined an operating model for AI on Oracle Database: route → act → trust. This piece goes deep on the first verb. It shows how to use &lt;code&gt;db/SKILL.md&lt;/code&gt; in the public Oracle Database Skills repository as your front door; how to route by persona or by task; and how to enforce progressive discovery so your assistant loads exactly one file at a time. This is a no‑execution article; we stay in the routing lane and leave tools to Article 3 (SQLcl MCP). Prerequisite: you only need to browse &lt;a href="https://github.com/oracle/skills" rel="noopener noreferrer"&gt;https://github.com/oracle/skills&lt;/a&gt; in a web browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why routing beats context dumping
&lt;/h2&gt;

&lt;p&gt;Dumping a pile of links into a prompt feels thorough, but it blurs version lines and lets generic “SQL” patterns overrule Oracle‑specific guidance. It also bloats token budgets without improving the next decision. &lt;code&gt;db/SKILL.md&lt;/code&gt; fixes this by providing a maintained map of Oracle Database skills, pointing you to the right starting file for common jobs, and encoding short, opinionated sequences for multi‑step workflows. The goal is not to read everything; it’s to pick the next file, digest it, and decide whether one more file is warranted. When you’re actually ready to execute a command, you’ve left routing and entered “act” (Article 3 covers SQLcl MCP).&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat db/SKILL.md as the front door
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;db/SKILL.md&lt;/code&gt; is the router for the Database domain. It opens with a routing table and guidance to keep context tight—begin at the table, then read only the specific file or category you need.&lt;/p&gt;

&lt;p&gt;It also shows the shape of the Database skills, including these directories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;db/agent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/features&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/frameworks&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/performance&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/security&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/devops&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/migrations&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;db/sqlcl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two parts matter most on your first pass. First, the file highlights concrete entry points for real jobs—where performance triage begins, where SQLcl basics and MCP server entries sit (setup is deferred to Article 3), how to approach schema migrations, and which agent behaviors (like schema discovery) must be understood before you write anything. Second, it outlines common sequences that act as guardrails. Examples include RAG (skills under &lt;code&gt;db/features&lt;/code&gt;: ai‑profiles → vector‑search → dbms‑vector), slow‑query diagnosis (skills under &lt;code&gt;db/performance&lt;/code&gt;: explain‑plan → wait‑events → optimizer‑stats → awr‑reports), and agent‑safe schema change (skills under &lt;code&gt;db/agent&lt;/code&gt; and &lt;code&gt;db/migrations&lt;/code&gt;: schema‑discovery → destructive‑op‑guards → idempotency‑patterns → schema‑migrations). There’s also an MCP setup path you’ll use later when you move from routing to action: sqlcl‑basics → a least‑privilege/privilege‑management skill in &lt;code&gt;db/security&lt;/code&gt; → sqlcl‑mcp‑server.&lt;/p&gt;

&lt;p&gt;Starting here changes how your assistant behaves. Instead of grabbing whatever looks related on the internet, it asks, “What’s the next Oracle‑authored file?” The result is fewer wrong turns and shorter, more reviewable prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route by persona when you’re scoping a project
&lt;/h2&gt;

&lt;p&gt;When you’re defining scope rather than responding to a ticket, match your role and load one file. Don’t skim the whole repository first—route, read, and decide.&lt;/p&gt;

&lt;h3&gt;
  
  
  App developer
&lt;/h3&gt;

&lt;p&gt;If you’re wiring a service to Oracle, start with frameworks and then layer on application‑specific skills. The &lt;code&gt;db/frameworks&lt;/code&gt; directory anchors guidance for stacks such as Spring, Django, and SQLAlchemy: connection configuration, driver/dialect selection, data type mapping, and recommended connection patterns. Once the framework is set, dip into app‑dev skills for JSON, Spatial, Text, or pooling nuances you actually need. Doing it in this order avoids needless trial and error—you adopt the Oracle‑tested path before you customize.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI engineer
&lt;/h3&gt;

&lt;p&gt;Begin in &lt;code&gt;db/agent&lt;/code&gt; and &lt;code&gt;db/features&lt;/code&gt;. The agent skills cover behaviors that matter when a model touches a database: discover schema before DML, guard against destructive operations, make steps idempotent so retries don’t double‑apply, and identify clients for traceability. The features skills introduce Oracle’s AI‑native building blocks—Select AI and AI Profiles for governed NL2SQL, and AI Vector Search/&lt;code&gt;DBMS_VECTOR&lt;/code&gt; for retrieval and RAG. Version gate: check each feature’s documentation. &lt;code&gt;DBMS_VECTOR&lt;/code&gt; and many Select AI/AI Profiles examples are documented for 26ai; several AI capabilities are also available in Autonomous Database. Do not assume 19c availability unless a skill or doc explicitly states it.&lt;/p&gt;

&lt;h3&gt;
  
  
  DBA
&lt;/h3&gt;

&lt;p&gt;The fastest way to get Oracle‑native outcomes from an assistant is to route through &lt;code&gt;db/performance&lt;/code&gt; and then &lt;code&gt;db/security&lt;/code&gt;. Performance skills teach the assistant to obtain and read the plan that actually executed (for example, via &lt;code&gt;DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST')&lt;/code&gt;), interpret row sources and cardinality, and pivot at the right moment from plan reading to wait events and then, if warranted, to AWR. Security skills ground privilege design, auditing, and encryption in Oracle’s vocabulary so “least privilege” becomes an actionable design rather than a slogan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migration lead
&lt;/h3&gt;

&lt;p&gt;Treat &lt;code&gt;db/migrations&lt;/code&gt; and &lt;code&gt;db/devops&lt;/code&gt; as two halves of one job. Migration skills help with assessment and translation; devops skills handle delivery mechanics such as schema change workflows, online operations, Edition‑Based Redefinition, and testing. Loading one file at a time keeps heterogeneous estates from collapsing into generic, lowest‑common‑denominator advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route by task when you’re on the clock
&lt;/h2&gt;

&lt;p&gt;When a ticket arrives with a single job, follow the ordered sequences in the repository. Oracle’s diagnostics and defaults are opinionated for a reason; ignoring their order usually costs time.&lt;/p&gt;

&lt;h3&gt;
  
  
  RAG on Oracle Database
&lt;/h3&gt;

&lt;p&gt;Start with AI Profiles, because that’s where you choose a provider and model and, crucially, define which database objects the model may see. Only after scope and governance are set should you learn retrieval patterns in vector‑search and then orchestrate pipelines with &lt;code&gt;DBMS_VECTOR&lt;/code&gt;. The payoff is a governed RAG flow that can be inspected (&lt;code&gt;SHOW SQL&lt;/code&gt;) and tightened (&lt;code&gt;OBJECT_LIST&lt;/code&gt; and data access controls), rather than a bag of embeddings taped onto a database.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route (skills under &lt;code&gt;db/features&lt;/code&gt;): ai‑profiles → vector‑search → dbms‑vector&lt;/li&gt;
&lt;li&gt;Reference: Select AI examples (&lt;code&gt;SHOW SQL&lt;/code&gt;, &lt;code&gt;OBJECT_LIST&lt;/code&gt;, and data access controls): &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/selai/examples-using-select-ai.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/database/oracle/oracle-database/26/selai/examples-using-select-ai.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Version note: Follow the feature docs. &lt;code&gt;DBMS_VECTOR&lt;/code&gt; and many Select AI/AI Profiles examples are documented for 26ai; several AI capabilities are also available in Autonomous Database. Do not assume 19c availability unless a skill or doc explicitly states it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Slow‑query diagnosis
&lt;/h3&gt;

&lt;p&gt;Begin by reading the plan that actually ran. In Oracle that means capturing the executed plan from the cursor (for example, &lt;code&gt;DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST')&lt;/code&gt;), not relying solely on an EXPLAIN PLAN estimate. If the plan looks sane but runtime stalls, pivot to wait events. If rows and joins are misestimated, fix statistics and cardinality before widening the window with AWR.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route (skills under &lt;code&gt;db/performance&lt;/code&gt;): explain‑plan → wait‑events → optimizer‑stats → awr‑reports&lt;/li&gt;
&lt;li&gt;Availability note: AWR/ASH access depends on environment and licensing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent‑safe schema change
&lt;/h3&gt;

&lt;p&gt;Discover what exists before you propose change, add loss‑prevention so a single bad predicate can’t harm a table, and make each step idempotent so a retry won’t double‑apply. Only then move into an audited migration workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route (skills under &lt;code&gt;db/agent&lt;/code&gt; and &lt;code&gt;db/migrations&lt;/code&gt;): schema‑discovery → destructive‑op‑guards → idempotency‑patterns → schema‑migrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A compact prompt that enforces progressive discovery
&lt;/h2&gt;

&lt;p&gt;A small prompt can prevent freelancing by enforcing a loop: route, read one file, summarize, decide. That discipline keeps the context precise and affordable.&lt;/p&gt;

&lt;p&gt;Prompt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open db/SKILL.md. I’m [persona or task].
Which single skill file should I load next, and why?
Summarize that file in 5 bullets, then propose the next decision (read another file or stop).
Do not execute any actions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Progressive routing loop&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.amazonaws.com%2Fuploads%2Farticles%2Ftmfmmwuxt6yaw7o2aawr.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.amazonaws.com%2Fuploads%2Farticles%2Ftmfmmwuxt6yaw7o2aawr.png" alt="Progressive disclosure loop" width="800" height="787"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mini demos (no DB access, no execution)
&lt;/h2&gt;

&lt;p&gt;These prompts validate routing behavior before you connect any tools. They’re deliberately constrained to “read and decide.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo A: Persona‑first route for a Spring app developer
&lt;/h3&gt;

&lt;p&gt;Prompt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open db/SKILL.md. I’m wiring a Spring Boot service to Oracle.
Which single frameworks/appdev skill should I load next, and why?
Summarize that file in 5 bullets, then propose the next decision.
Do not execute any actions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example assistant response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next file: A Spring Data JPA with Oracle skill under db/frameworks/.
Why: It covers Oracle-specific connection configuration, driver/dialect selection, pooling, and type mapping.

Summary:
- Recommended Oracle JDBC URL formats and service naming for Spring Boot
- Dialect/driver selection and common DataSource pitfalls
- Transaction, batching, and fetch-size options tuned for Oracle
- LOB, DATE/TIMESTAMP, and NUMBER mapping considerations
- Starter checks and links to follow-up appdev skills

Next decision:
- If you need pooling/retry/circuit specifics, read a connection/pooling skill next.
- Otherwise, stop and apply these configuration steps before proceeding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Demo B: Task‑first route for diagnosing a slow query
&lt;/h3&gt;

&lt;p&gt;Prompt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Starting from db/SKILL.md, list the ordered skill files for slow-query triage.
Load only the first file, summarize it in 5 bullets, then recommend whether to read the next file or stop.
Do not execute any actions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example assistant response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ordered files:
1) The explain-plan skill in db/performance/
2) The wait-events skill in db/performance/
3) The optimizer-stats skill in db/performance/
4) The awr-reports skill in db/performance/

Loaded: explain-plan

Summary:
- Obtain the executed plan from the cursor (vs. EXPLAIN PLAN estimates) and where to find it
- Read row sources and cardinality; spot misestimates and join-order issues
- Recognize anti-patterns (forced full scans, skewed histograms, implicit conversions)
- Interpret plan notes for adaptive features and parallel decisions
- Decide when to pivot from plan analysis to wait-event inspection

Recommendation:
- Read wait-events next if the plan looks reasonable but runtime stalls.
- If the plan is clearly wrong, stop and fix plan issues before proceeding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The “explain‑plan” skill in this route teaches capturing and reading the actual cursor plan, not just the EXPLAIN PLAN estimate.&lt;/li&gt;
&lt;li&gt;AWR/ASH may not be available in all environments and may require licensing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Version scope and context‑budget discipline
&lt;/h2&gt;

&lt;p&gt;Assume Oracle Database 19c as the baseline unless a skill states a higher requirement. For AI features, check per‑feature documentation: &lt;code&gt;DBMS_VECTOR&lt;/code&gt; and many Select AI/AI Profiles examples are documented for 26ai; several AI capabilities are also available in Autonomous Database. Do not assume 19c availability unless a skill or doc explicitly states it. Label those steps clearly when you route.&lt;/p&gt;

&lt;p&gt;Two habits keep assistants accurate and affordable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load one file or short index at a time, then summarize in five bullets.&lt;/li&gt;
&lt;li&gt;Decide whether to stop, read one more, or hand off to action (SQLcl MCP in Article 3). Don’t blur routing with execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why “route, don’t flood” holds up under pressure
&lt;/h2&gt;

&lt;p&gt;Teams tend to bulk‑load context when deadlines loom. Ironically, progressive discovery pays off most when time is tight. &lt;code&gt;db/SKILL.md&lt;/code&gt; compresses Oracle experience into short routes you can trust: read the executed plan before hunting waits, scope an AI Profile before experimenting with retrieval, and prove discovery and guards before you accept any schema change. Staying inside those lanes doesn’t slow you down; it eliminates the detours that burn days.&lt;/p&gt;

&lt;p&gt;Make the front door easy to reach. The simplest path is to browse the repository in a web browser and open &lt;code&gt;db/SKILL.md&lt;/code&gt;. If you prefer a local copy, install the Database domain directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add oracle/skills/db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This puts the domain files in your working directory so you can open &lt;code&gt;db/SKILL.md&lt;/code&gt; immediately. Then set your assistant’s “Oracle Database” system prompt to begin with “Open db/SKILL.md,” and keep the progressive‑discovery loop in place until the next decision is truly to act.&lt;/p&gt;

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

&lt;p&gt;Oracle Database Skills is not a PDF dump for models. It’s an operating method that starts with routing. Use &lt;code&gt;db/SKILL.md&lt;/code&gt; as your first touch, load one file at a time, and stop before you wander into execution. In Article 3, we’ll introduce SQLcl MCP as the bounded action surface that pairs naturally with this approach. Until then: route → read one → summarize → decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Oracle Database Skills repository root: &lt;a href="https://github.com/oracle/skills" rel="noopener noreferrer"&gt;https://github.com/oracle/skills&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Database router (&lt;code&gt;db/SKILL.md&lt;/code&gt;): &lt;a href="https://github.com/oracle/skills/blob/main/db/SKILL.md" rel="noopener noreferrer"&gt;https://github.com/oracle/skills/blob/main/db/SKILL.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Frameworks directory: &lt;a href="https://github.com/oracle/skills/tree/main/db/frameworks" rel="noopener noreferrer"&gt;https://github.com/oracle/skills/tree/main/db/frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Performance directory: &lt;a href="https://github.com/oracle/skills/tree/main/db/performance" rel="noopener noreferrer"&gt;https://github.com/oracle/skills/tree/main/db/performance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select AI examples (&lt;code&gt;SHOW SQL&lt;/code&gt;, &lt;code&gt;OBJECT_LIST&lt;/code&gt;, and data access controls): &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/selai/examples-using-select-ai.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/database/oracle/oracle-database/26/selai/examples-using-select-ai.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DBMS_XPLAN.DISPLAY_CURSOR&lt;/code&gt; (19c): &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_XPLAN.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_XPLAN.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Licensing Information User Manual (AWR/ASH availability/licensing): &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/index.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/index.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DBMS_VECTOR&lt;/code&gt; (26ai): &lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/26/arpls/DBMS_VECTOR.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/database/oracle/oracle-database/26/arpls/DBMS_VECTOR.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>database</category>
      <category>llm</category>
    </item>
    <item>
      <title>AI agents know SQL. Oracle Database Skills teach them Oracle</title>
      <dc:creator>Mark Nelson</dc:creator>
      <pubDate>Wed, 13 May 2026 14:02:12 +0000</pubDate>
      <link>https://forem.com/oracledevs/ai-agents-know-sql-oracle-database-skills-teach-them-oracle-n5m</link>
      <guid>https://forem.com/oracledevs/ai-agents-know-sql-oracle-database-skills-teach-them-oracle-n5m</guid>
      <description>&lt;p&gt;This is article 1 of 8 in my Oracle Database Skills series.&lt;/p&gt;

&lt;p&gt;Most assistants can write SQL. That’s not the same as knowing Oracle Database. The difference shows up in production. A model that learned generic patterns can assume another vendor’s isolation semantics, borrow date arithmetic that silently miscounts in Oracle, rely on hints that “fix” one plan but fight the optimizer elsewhere, or forget Edition‑Based Redefinition (EBR) during a migration. Give that assistant a live connection and those differences turn into risk.&lt;/p&gt;

&lt;p&gt;Oracle Database Skills change the operating model. Instead of hoping a generalist remembers every Oracle rule, you route it—one decision at a time—to Oracle‑authored, source‑backed instructions. When action is appropriate, you expose only small, named tools via Oracle MCP servers (MCP = Model Context Protocol), never a blank connection string. And you keep Oracle’s governance in the path so identity, scope, and evidence ride with every request. In short: route first, act through bounded tools, and let the database prove what happened.&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.amazonaws.com%2Fuploads%2Farticles%2Fwz7qk0eibiasgs9d28cq.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.amazonaws.com%2Fuploads%2Farticles%2Fwz7qk0eibiasgs9d28cq.png" alt=" " width="800" height="827"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why generic SQL knowledge fails on Oracle Database
&lt;/h2&gt;

&lt;p&gt;Large models generalize across vendors; your database does not. Oracle’s transaction semantics, time idioms, plan management, and governance are exactly where generic advice goes sideways.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Isolation and consistency are different in Oracle. Many public answers treat isolation levels as dials that change write visibility. Oracle’s multi‑version read consistency gives readers a clean snapshot but doesn’t use the same language or behavior as those engines. Ask a generalist assistant to “make this serializable” and you can get a non‑Oracle explanation—or an irrelevant fix. See Oracle Database Concepts on consistent reads for details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Time math bites hard. DATE/TIMESTAMP/INTERVAL semantics and NLS/time zone interactions vary by vendor; Oracle requires vendor‑specific idioms. Skills provide tested patterns for Oracle SQL and PL/SQL so an assistant doesn’t have to guess which expression respects your NLS settings, time zones, and interval choices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plan stability demands a different order of operations. Oracle recommends maintaining accurate optimizer statistics and using SQL Plan Management (baselines) for stability; avoid over‑reliance on ad‑hoc hints in application code. Skills teach that progression so the assistant recommends fixes that survive the next gather‑stats job.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Governance cannot be an afterthought. “Connect and run” examples usually ignore Virtual Private Dat&lt;br&gt;
abase (VPD), Unified Auditing, Fine‑Grained Auditing, Data Redaction, Transparent Data Encryption (TDE), and network ACLs/private endpoints. In Oracle, those are how you make AI access presentable to a DBA, a security reviewer, or an auditor. If you want to ship, keep those controls in the path.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Route first with Oracle Database Skills (progressive discovery)
&lt;/h2&gt;

&lt;p&gt;The oracle/skills repository is not a doc dump. It’s installable operating instructions, loaded sparingly—one file at a time—so assistants (and humans) can make the next decision correctly without carrying 200 pages of context. The Database domain (oracle/skills/db) is organized the way you work: agent safety; features like Select AI, AI Profiles, and Vector Search; app frameworks; performance; DevOps and migrations; SQLcl; and security. The front door is a routing file: db/SKILL.md.&lt;/p&gt;

&lt;p&gt;Progressive discovery narrows the model’s attention to what moves the work forward, preserves version truth, and leaves a clean review trail. Because the assistant reads only the next skill, it doesn’t mix versions or unrelated features. Skills mark Oracle Database 19c as the baseline and flag when you need Autonomous Database (Serverless) or Oracle Database 23ai/26ai features. Teams can see which Oracle sources the assistant consulted, in what order, and why.&lt;/p&gt;

&lt;p&gt;A concrete path makes this real. Suppose you’re building retrieval‑augmented generation on Oracle. The route in db/SKILL.md steers you through Select AI profiles (to set provider and scope), then Vector Search basics (to choose the right data model and index), then DBMS_VECTOR (to make retrieval programmable). You don’t need AWR or EBR on day one. The route keeps you focused until you do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Act through bounded tools: Oracle’s MCP surfaces
&lt;/h2&gt;

&lt;p&gt;Sometimes the assistant must do more than explain. It needs to run a read‑only query, inspect a schema, or check a plan. That’s where Oracle’s MCP servers help: they expose small, named capabilities rather than hand the assistant a general‑purpose connection.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Local development: SQLcl MCP server. Built into SQLcl, it exposes a concise set of named tools—for example, to list saved connections, connect using a saved connection, and run SQL—and supports configurable “restrict levels,” with higher numbers enforcing tighter limits. As of SQLcl 25.4, the MCP server defaults to restrict level 4 (most restrictive). Confirm your version and configuration. Teams can set the most restrictive mode for local experiments. SQLcl MCP can also leave evidence when configured: it can log activity (for example, to a DBTOOLS$MCP_LOG table), set V$SESSION.MODULE and V$SESSION.ACTION to identifiable values (such as the MCP client and a client‑provided model/agent label), and tag LLM‑generated statements with a comment. See the SQLcl MCP docs linked below for version‑specific details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Managed, governed execution: Autonomous Database (Serverless) MCP server. Enable it on a specific Autonomous Database (via an OCI free‑form tag) and you get a per‑database HTTP endpoint and authentication that serve built‑in tools or custom tools you define with DBMS_CLOUD_AI_AGENT.CREATE_TOOL. Identity and roles apply as usual. So do network ACLs and private endpoints, VPD policies, and Unified Auditing and Fine‑Grained Auditing when configured. If your team wants a controlled tool surface without hosting anything, this is the right shape: the database remains the control plane for what tools exist and who can use them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shared property is restraint. In both cases, the assistant gets the minimum set of named actions appropriate for the task, and Oracle‑native controls keep doing their job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep Oracle governance in the path (trust and evidence)
&lt;/h2&gt;

&lt;p&gt;Oracle’s governance features aren’t an appendix; they are the safety net that lets you ship. Roles and least privilege define what an assistant can reach. Network ACLs and private endpoints restrict egress. VPD enforces row‑level policies you already rely on. Unified Auditing and Fine‑Grained Auditing can be configured to record the activity you care about. Data Redaction and TDE protect sensitive data at query time and at rest. These controls are available and can be configured; they are not enabled by default in every environment.&lt;/p&gt;

&lt;p&gt;The benefit for AI work is simple once you see it: your proof is in the database. When actions go through SQLcl MCP or the Autonomous Database (Serverless) MCP server, the same identity, scoping, and auditing options that protect your applications also protect your assistant. The question becomes less “Can we trust the agent?” and more “Show me the database evidence.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Mini demo: install skills and open the routing door
&lt;/h2&gt;

&lt;p&gt;Begin without touching a database or setting up MCP. Fetch the Database Skills domain and open the routing file. From there, pick the path that matches your role and objective.&lt;/p&gt;

&lt;p&gt;You only need internet access, Node.js installed, and a text editor. This step does not connect to a database, handle credentials or secrets, or change any MCP restrict levels.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx skills add oracle/skills/db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs the Database domain into your working directory. Open db/SKILL.md in your editor. If you’re an app developer wiring a Spring app, follow the frameworks route. If you’re an AI engineer, start with the agent and features routes (Select AI, AI Profiles, Vector) before you let any assistant write SQL. If you’re a DBA, begin with performance and security so the assistant speaks AWR/ASH/optimizer and respects governance. Keep the habit: load only the next file you need, then stop. That discipline keeps model context clean and your review surface small.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to find this in Oracle docs and repos
&lt;/h2&gt;

&lt;p&gt;The instruction layer is the skills repo itself, with db/SKILL.md acting as the router. The controlled action layer is documented for both entry points: SQLcl MCP (restrict levels, tool catalog examples, saved connections, monitoring, activity logging and tagging) and the Autonomous Database (Serverless) MCP server (enablement via OCI free‑form tag, per‑database endpoint and authentication, custom tool publication, and governance integration). The trust layer is the familiar security stack: roles and privileges; network ACLs and private endpoints; VPD; Unified Auditing and Fine‑Grained Auditing when configured; Data Redaction; encryption. Each is a first‑class Oracle feature you can point to in docs and verify in your environment.&lt;/p&gt;

&lt;p&gt;Source links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skills repo and routing (start at db/SKILL.md)&lt;/li&gt;
&lt;li&gt;SQLcl MCP (using the server; logging/tagging; restrict levels)&lt;/li&gt;
&lt;li&gt;Autonomous Database (Serverless) MCP server (enable and use)&lt;/li&gt;
&lt;li&gt;Oracle Database Concepts — Consistent Reads/MVRC&lt;/li&gt;
&lt;li&gt;Oracle SQL Language Reference — Data Types (DATE/TIMESTAMP/INTERVAL and NLS)&lt;/li&gt;
&lt;li&gt;Optimizer statistics and SQL Plan Management&lt;/li&gt;
&lt;li&gt;Oracle Database Security Guide (19c baseline)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Version scope and environment notes
&lt;/h2&gt;

&lt;p&gt;Most skills target Oracle Database 19c as the baseline. Files that require features from Autonomous Database (Serverless) or newer Oracle Database 23ai/26ai releases—such as Select AI, AI Profiles, Vector Search, or the Autonomous Database (Serverless) MCP server—are labeled in the repo. If you work in a mixed‑version estate, treat those labels as gates and route accordingly. For hands‑on tries in this opener, you need only a local machine with git and a text editor. MCP client steps and database connectivity come later, when action is appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s out of scope (in this opener)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enabling or configuring the Autonomous Database (Serverless) MCP server&lt;/li&gt;
&lt;li&gt;Connecting to any database or handling credentials&lt;/li&gt;
&lt;li&gt;Changing SQLcl MCP restrict levels&lt;/li&gt;
&lt;li&gt;Configuring Unified Auditing or Fine‑Grained Auditing&lt;/li&gt;
&lt;li&gt;Demonstrating Select AI or Vector Search live&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A short story from the field
&lt;/h2&gt;

&lt;p&gt;A team asked an assistant to “optimize a daily sales query.” The first answer added an index and a couple of hints that looked fine in isolation. The skills route would have sent it somewhere else: read the explain-plan and optimizer-stats files first; check cardinalities and stale stats; consider a plan baseline if volatility is the real problem. That path took longer but avoided chasing a hint that didn’t survive the next gather‑stats job. The difference wasn’t model IQ—it was having Oracle‑specific operating instructions and the habit of loading only what came next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this series goes from here
&lt;/h2&gt;

&lt;p&gt;Everything you need to begin is in your editor: the skills repo, the routing file, and the mental model—route, act, trust. We’ll build outward from that front door, showing how local and managed MCP surfaces work when action is warranted, and how Select AI and Vector Search improve reasoning close to your data. Expect short, source‑backed posts that follow the same grammar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route: pick a path in db/SKILL.md for your role and task.&lt;/li&gt;
&lt;li&gt;Act: use SQLcl MCP locally or the Autonomous Database (Serverless) MCP server when you need controlled actions.&lt;/li&gt;
&lt;li&gt;Guardrail: keep roles, ACLs/private endpoints, VPD, and auditing in‑path for evidence and scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The eight posts are organized into four groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foundation
1 — this post; 2 — Route, Don’t Flood
Mental model and &lt;code&gt;db/SKILL.md&lt;/code&gt; as routing layer&lt;/li&gt;
&lt;li&gt;Action
3 — SQLcl MCP; 4 — Managed MCP in Autonomous AI Database
Local and remote bounded action surfaces&lt;/li&gt;
&lt;li&gt;Intelligence
5 — Select AI and AI Profiles; 6 — Vector‑Native RAG
NL2SQL reasoning quality and in‑database retrieval&lt;/li&gt;
&lt;li&gt;Rollout
7 — Agent‑Safe Change Delivery; 8 — The Trust Layer
Safe change workflows and enterprise governance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion: a safer default for Oracle‑backed AI
&lt;/h2&gt;

&lt;p&gt;If your assistant can touch Oracle Database, “just let it connect” isn’t an acceptable plan. Put the skills repo between the model and the problem so it learns to work the Oracle way. When execution is appropriate, send it through SQLcl MCP or the Autonomous Database (Serverless) MCP server so actions are small, named, and governed. Keep Oracle’s controls—roles, ACLs, VPD, auditing, redaction, encryption—in the path so every action is scoped and traceable.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>database</category>
      <category>sql</category>
    </item>
  </channel>
</rss>
