<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xslt"?>
<document>
  <header>
    <title>OpenLink AI Layer (OPAL) Cloud Edition Installation Guide: Google Cloud</title>
    <image alt="Architecture|690x363" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data//gifs/opal-architecture-overview-4.gif" />
  </header>
  <section title="Introduction">
    <paragraph>This comprehensive guide walks you through installing and launching the cloud edition of <link href="https://opal.openlinksw.com/">OpenLink AI Layer</link> (OPAL) on Google—empowering you to quickly unlock seamless AI and data integration capabilities that drive real business impact.</paragraph>
    <paragraph>To give you a head start, check out this quick screencast overview demonstrating what OPAL can do right after installation, showcasing its powerful AI agent orchestration and data connectivity features.</paragraph>
  </section>
  <section title="Table of Contents">
    <ordered-list>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-prerequisites-3">Prerequisites</link></item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-installation-use-4">Installation &amp; Use</link></item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-additional-components-5">Additional Components</link>
        <unordered-list>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-important-vad-package-examples-6">Important VAD Package Examples</link></item>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-supported-llms-7">Supported LLMs</link></item>
        </unordered-list>
      </item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-attribute-based-access-controls-abac-8">Attribute-based Access Controls (ABAC)</link>
        <unordered-list>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-create-login-authorization-for-opal-via-chat-endpoint-9">Create Login Authorization for OPAL via /chat endpoint</link></item>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-create-login-authorization-for-opal-via-assist-metal-endpoint-10">Create Login Authorization for OPAL via /assist-metal endpoint</link></item>
        </unordered-list>
      </item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-system-wide-llm-api-key-registration-11">System-wide LLM API Key Registration</link></item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-large-language-models-registration-use-12">Large Language Models Registration &amp; Use</link>
        <unordered-list>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-listing-bound-llms-13">Listing Bound LLMs</link></item>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-system-wide-llm-api-key-registration-14">System-Wide LLM API Key Registration</link></item>
        </unordered-list>
      </item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-application-programming-interface-api-access-16">Application Programming Interface (API) Access</link>
        <unordered-list>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-claude-desktop-20">Claude Desktop Configuration</link></item>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-model-context-protocol-mcp-usage-17">Model Context Protocol (MCP) Usage</link></item>
          <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-agent-2-agent-a2a-protocol-usage-23">Agent-2-Agent (A2A) Protocol Usage</link></item>
        </unordered-list>
      </item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-faq-26">FAQ</link></item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-glossary-of-terms-31">Glossary of Terms</link></item>
      <item><link href="https://community.openlinksw.com/t/openlink-ai-layer-opal-cloud-edition-installation-guide-google-cloud/5083#p-19322-related-32">Related</link></item>
    </ordered-list>
  </section>
  <section title="Prerequisites">
    <unordered-list>
      <item>A <link href="https://console.cloud.google.com/">Google Cloud subscription</link> account</item>
    </unordered-list>
  </section>
  <section title="Installation &amp; Use">
    <ordered-list>
      <item>Go to the <link href="https://console.cloud.google.com/marketplace/browse?q=OpenLink%20AI%20Layer%20(OPAL)&amp;filter=category:database">OpenLink AI Layer Google Cloud Offer</link> MarketPlace page.</item>
      <item>Select the `Get Started` button to launch an instance</item>
      <item><image alt="Screenshot 2025-07-11 at 09.46.41|690x357" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-1.png" /></item>
      <item>
        <blockquote>
          <paragraph><strong>Note:</strong></paragraph>
          <paragraph>Ensure when launching the offer it is assigned a `Public IP` address</paragraph>
        </blockquote>
      </item>
      <item>Make a `ssh` connection to the virtual machine instance.</item>
      <item><image alt="Screenshot 2025-07-11 at 11.14.27|690x216" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-2.png" /></item>
      <item>Retrieve the default Virtuoso `dba` users password for your instance, with the command</item>
      <item>
        <code language="bash">sudo cat /opt/virtuoso/database/.initial-password</code>
      </item>
      <item>Open your browser and navigate to:</item>
      <item>
        <code>https://{your-instance-public-ip-or-domain}/chat</code>
      </item>
      <item>Log in with the default username `dba` and the password retrieved in Step 4. When prompted, enter your preferred <strong>Large Language Model (LLM)</strong> provider’s <strong>API key</strong>.</item>
    </ordered-list>
    <subsection title="Additional Components">
      <paragraph>Once your OPAL instance is up and running, you can optionally install additional components using the Virtuoso Application Distribution (VAD) installer—available via the Virtuoso Conductor UI or the `isql` command-line tool.</paragraph>
      <subsubsection title="Important VAD Package Examples">
        <ordered-list>
          <item><strong>Assistant-Metal UI</strong> (<link href="https://shop.openlinksw.com/c/3dSPdUZbFQ">VAD Package Link</link>) A user-friendly interface for interacting with OpenAI’s Assistants API. This component enables you to create, test, deploy, and manage AI Agents/Assistants using natural language prompts written in Markdown.</item>
          <item><strong>Linked Data Cartridges</strong> (<link href="https://shop.openlinksw.com/c/uSPC2Bbyb">VAD Package Link</link>) A powerful suite of data transformation tools that enhance data crawling across local and public HTTP networks (e.g., the Web). These transformations can be triggered by:</item>
          <item>
            <unordered-list>
              <item>SQL or SPARQL queries</item>
              <item>Briefcase folders</item>
              <item>Virtuoso’s built-in web crawlerThis package also includes a <strong>Meta Cartridge</strong> that integrates LLM-based batch processing. For example, given the URL of an HTML document, the system can:</item>
              <item>Trigger a batch task (executed asynchronously by the selected LLM)</item>
              <item>Transform content into RDF-based Knowledge Graphs</item>
              <item>Upload the resulting Knowledge Graph into Virtuoso’s native RDF store for Entity Relationship Graphs</item>
            </unordered-list>
          </item>
          <item>These VAD packages significantly expand your OPAL instance’s capabilities—enabling advanced data workflows driven by entity relationship types defined in ontologies and enhanced through loosely coupled LLM integrations.</item>
        </ordered-list>
      </subsubsection>
      <subsubsection title="Supported LLMs">
        <paragraph>The following LLM providers and model families are currently supported:</paragraph>
        <unordered-list>
          <item><link href="https://openai.com/">OpenAI</link> — GPT family</item>
          <item><link href="https://deepmind.google/technologies/gemini/">Google</link> — Gemini and Gemma families</item>
          <item><link href="https://www.anthropic.com/">Anthropic</link> — Claude family</item>
          <item><link href="https://azure.microsoft.com/en-us/products/cognitive-services/openai-service">Microsoft</link> — GPT, Grok, and Phi families</item>
          <item><link href="https://www.perplexity.ai/">Perplexity</link> — Sonar</item>
          <item><link href="https://x.ai/">xAI</link> — Grok family</item>
          <item><link href="https://mistral.ai/">Mistral</link> — Mistral family</item>
          <item><link href="https://www.alibabacloud.com/blog/alibaba-clouds-open-source-llm-qwen_600452">Alibaba</link> — Qwen family</item>
          <item><link href="https://www.deepseek.com/">DeepSeek</link> — DeepSeek R family</item>
          <item><link href="https://ai.meta.com/llama/">Meta</link> — Llama family (via <link href="https://groq.com/">Groq</link> or <link href="https://www.cerebras.net/">Cerebras</link>)</item>
        </unordered-list>
        <blockquote>
          <paragraph><strong>Note:</strong> Other hosted or local LLMs that support OpenAI’s Tools API for external function call integration are also supported.</paragraph>
        </blockquote>
      </subsubsection>
    </subsection>
  </section>
  <section title="Attribute-based Access Controls (ABAC)">
    <paragraph>At this point, you need to secure your OPAL and LLM integrated environment by using fine-grained access controls to determine who is allowed to log into your assistant and under what constraints (restrictions). You achieve this by executing the following commands (using the Conductor or ISQL command-line interfaces) that set up these powerful access controls.</paragraph>
    <paragraph>Fine-grained access controls use entity relationship graphs comprising relationships, authorizations, restrictions, groups, and agents (people or bots) that are named unambiguously using standardized identifiers (e.g., Internationalized Resource Identifiers [IRIs]) with terms from ontologies such as: W3C’s <link href="http://www.w3.org/ns/auth/acl#">Access Control Ontology</link> (`http://www.w3.org/ns/auth/acl#`), <link href="http://www.openlinksw.com/ontology/acl#">OpenLink Software’s Access Control Ontology</link>(`http://www.openlinksw.com/ontology/acl#`), <link href="http://www.openlinksw.com/ontology/restrictions#">OpenLink Software’s Restrictions Ontology</link>(`http://www.openlinksw.com/ontology/restrictions#`), and the <link href="http://xmlns.com/foaf/0.1/">Friend Of A Friend [FOAF]</link>(`http://xmlns.com/foaf/0.1/`).</paragraph>
    <subsection title="Create Login Authorization for OPAL via /chat endpoint">
      <image alt="Screenshot 2025-06-05 at 7.36.53 AM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-3.png" />
      <paragraph>OPAL is denoted by the system identifier `urn:oai:chat`, which makes it possible to construct an authorization for logins that belong to a designated group or list of users. In this case, we simply want to set the authorization scope to the DBA user denoted by the identifier `http://localhost/dataspace/person/dba#this` as follows:</paragraph>
      <code language="sparql">
SPARQL
PREFIX acl: &lt;http://www.w3.org/ns/auth/acl#&gt;
PREFIX oplacl: &lt;http://www.openlinksw.com/ontology/acl#&gt;
PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt;
PREFIX oplres: &lt;http://www.openlinksw.com/ontology/restrictions#&gt;

WITH &lt;urn:virtuoso:val:default:rules&gt;
DELETE {
  &lt;#rulePublicChat&gt; ?p ?o .
} WHERE {
  &lt;#rulePublicChat&gt; a acl:Authorization ; ?p ?o .
}
INSERT {
  &lt;#rulePublicChat&gt; a acl:Authorization ;
            foaf:maker &lt;#dba&gt; ;
            oplacl:hasAccessMode oplacl:Read, oplacl:Write ;
            acl:accessTo &lt;urn:oai:chat&gt; ;
            acl:agent &lt;http://localhost/dataspace/person/dba#this&gt; ;
            oplacl:hasRealm oplacl:DefaultRealm ;
            oplacl:hasScope oplacl:Query .

} ;
      </code>
    </subsection>
    <subsection title="Create Login Authorization for OPAL via /assist-metal endpoint">
      <image alt="Screenshot 2025-06-05 at 7.33.28 AM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-4.png" />
      <paragraph>If you want to extend the login access to OPAL’s Assistants functionality via its `/assist-metal`endpoint, then execute the following to create a restriction on `urn:oai:assistants`(which is how this functionality realm is denoted):</paragraph>
      <code language="sparql">
SPARQL
PREFIX    acl: &lt;http://www.w3.org/ns/auth/acl#&gt;
PREFIX   foaf: &lt;http://xmlns.com/foaf/0.1/&gt;
PREFIX oplacl: &lt;http://www.openlinksw.com/ontology/acl#&gt;
PREFIX oplres: &lt;http://www.openlinksw.com/ontology/restrictions#&gt;

WITH &lt;urn:virtuoso:val:default:rules&gt;
INSERT
{
  &lt;#assistantsAdmin&gt; a acl:Authorization ;
                    foaf:maker &lt;#dba&gt; ;
                    oplacl:hasAccessMode oplacl:Read, oplacl:Write ;
                    acl:accessTo &lt;urn:oai:assistants&gt; ;
                    acl:agent &lt;http://localhost/dataspace/person/dba#this&gt; ;
                    oplacl:hasRealm oplacl:DefaultRealm ;
                    oplacl:hasScope oplacl:Query .
} ;
      </code>
    </subsection>
  </section>
  <section title="System-wide LLM API Key Registration">
    <paragraph>Rather than repetitively entering LLM API Keys when you log in, it might be preferred to have those keys registered system-wide. To achieve this goal, you need to create a restriction for successfully logged-in users by executing the following:</paragraph>
    <code language="sparql">
SPARQL
PREFIX acl: &lt;http://www.w3.org/ns/auth/acl#&gt;
PREFIX oplacl: &lt;http://www.openlinksw.com/ontology/acl#&gt;
PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt;
PREFIX oplres: &lt;http://www.openlinksw.com/ontology/restrictions#&gt;

WITH &lt;urn:virtuoso:val:default:restrictions&gt;
DELETE { 
          ?s ?p ?o .
} 
WHERE {
        ?s a oplres:Restriction ;
          oplres:hasRestrictedResource &lt;urn:oai:chat&gt; ; ?p ?o .
        FILTER(?s = &lt;#restrictionAuthChatKey&gt;)
}
INSERT {
            &lt;#restrictionAuthChatKey&gt; a oplres:Restriction ;
                foaf:maker &lt;#dba&gt; ;
                rdfs:label "Allow Api Key" ;
                oplres:hasRestrictedResource &lt;urn:oai:chat&gt; ;
                oplres:hasRestrictedParameter &lt;urn:oai:chat:enable-api-keys&gt; ;
                oplres:hasRealm oplacl:DefaultRealm ;
                oplres:hasAgent &lt;http://localhost/dataspace/person/dba#this&gt; ; ### list of NetIds to have access for system key
                oplres:hasRestrictedValue "1"^^xsd:boolean .
} ;
    </code>
  </section>
  <section title="Large Language Models Registration &amp; Use">
    <paragraph>With your OPAL instance successfully initialized, you can now bind it to one or more LLMs from the list above. You achieve this via the following commands executed via the Conductor or iSQL interfaces.</paragraph>
    <subsection title="Listing Bound LLMs">
      <paragraph><em>Command Syntax</em></paragraph>
      <code>OAI.DBA.FILL_CHAT_MODELS('{Api Key}', '{llm-vendor-tag}');</code>
      <paragraph>Where llm-vendor-tags are as follows: alibaba, claude, deepseek, gemini, groq, mistral, openai, xai.</paragraph>
      <paragraph><em>Usage Examples</em></paragraph>
      <code>OAI.DBA.FILL_CHAT_MODELS('sk-xxxx', 'openai');
OAI.DBA.FILL_CHAT_MODELS('sk-ant-xxx', 'claude');</code>
      <paragraph>Google DeepMind’s Gemini does not currently offer an API for LLM listing, so you use: OAI.DBA.REGISTER_CHAT_MODEL(‘{llm-vendor-tag}’,‘{llm-name}’);</paragraph>
      <paragraph><em>Usage Example</em></paragraph>
      <code>OAI.DBA.REGISTER_CHAT_MODEL('gemini','gemini-2.5-flash-preview-05-20');</code>
      <paragraph>You can view the effects of this command via the Bound LLMs endpoint at: `https://{CNAME}/chat/admin/models.vsp`</paragraph>
      <image alt="Screenshot 2025-06-03 at 2.02.07 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-5.png" />
    </subsection>
    <subsection title="System-Wide LLM API Key Registration">
      <paragraph>To negate the need to present API Keys for bound LLMs at login time, you can register the API Keys for your chosen LLMs via the following command using the Conductor or ISQL command line interfaces:</paragraph>
      <paragraph><em>Command Syntax</em></paragraph>
      <code>OAI.DBA.SET_PROVIDER_KEY( '{llm-vendor-tag}', 'api-key')</code>
      <paragraph><em>Usage Examples</em></paragraph>
      <code>OAI.DBA.SET_PROVIDER_KEY('openai','sk-svcacct-xxx');
OAI.DBA.SET_PROVIDER_KEY('claude','sk-ant-api03-xxx');
OAI.DBA.SET_PROVIDER_KEY('gemini','AIxxxx');</code>
    </subsection>
  </section>
  <section title="Post-Installation Capabilities Demonstration">
    <subsection title="Application Programming Interface (API) Access">
      <paragraph>Your OPAL instance is also API-accessible, providing functionality for issuing and revoking credentials in the form of:</paragraph>
      <ordered-list>
        <item>Dynamically negotiated OAuth access tokens</item>
        <item>Issued OAuth Credentials and Bearer Tokens</item>
      </ordered-list>
      <paragraph>You obtain credentials using the `https://{CNAME}/oauth/applications.vsp` endpoint, which presents you with the following:</paragraph>
      <ordered-list>
        <item>Client Applications Landing Page</item>
        <item><image alt="Screenshot 2025-06-03 at 5.21.52 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-6.png" /></item>
        <item>Credentials Issue page</item>
        <item><image alt="Screenshot 2025-06-03 at 5.28.12 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-7.png" /></item>
        <item><image alt="Screenshot 2025-06-03 at 5.29.24 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-8.png" /></item>
      </ordered-list>
      <paragraph>Once your credentials have been generated and copied to a safe location, you are ready for API-based interaction with your instance using protocols such as the Model Context Protocol (MCP) and the Agent-2-Agent (A2A) Protocol.</paragraph>
    </subsection>
    <subsection title="Model Context Protocol (MCP) Usage">
      <paragraph>OPAL includes built-in support for the MCP protocol as both a client and a server, supporting the Server Sent Events (SSE) and Streamable HTTP transport options. This protocol offers direct access to AI Agents/Assistants created using natural language via Markdown with native stored procedures or external OpenAPI-accessible web services as the underlying tooling for executing operations.</paragraph>
      <paragraph>To enable use of this protocol, you will need to set up CORS access for your MCP client regarding the following virtual directories via the Conductor UI:</paragraph>
      <unordered-list>
        <item>/.well-known</item>
        <item>/OAuth2</item>
      </unordered-list>
      <paragraph>Here’s a screenshot sequence depicting how this task is performed for the /OAuth2 virtual directory.</paragraph>
      <paragraph><em>HTTP Server’s Virtual Domains</em></paragraph>
      <image alt="Screenshot 2025-06-04 at 11.02.28 AM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-9.png" />
      <paragraph><em>Virtual Directories Listing for the HTTPS Virtual Domain</em></paragraph>
      <image alt="Screenshot 2025-06-04 at 11.02.47 AM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-10.png" />
      <paragraph><em>CORS Accepted Client Origins Listing</em></paragraph>
      <image alt="Screenshot 2025-06-03 at 12.51.22 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-11.png" />
      <paragraph><strong>Note</strong>: Click “Finish” and then “Save Changes” for the CORS settings to take effect.</paragraph>
      <subsubsection title="MCP Server Endpoints">
        <paragraph>The following endpoints are automatically generated for your OPAL instance:</paragraph>
        <unordered-list>
          <item>https://{CNAME}/chat/mcp/messages – for the Streamable HTTP transport</item>
          <item>https://{CNAME}/chat/mcp/sse – for the Server Sent Events transport</item>
        </unordered-list>
      </subsubsection>
      <subsubsection title="Other MCP Interaction Options">
        <paragraph>The following MCP Servers also offer bridge-based access to your OPAL instance, courtesy of the stdio transport leveraging data access protocols such as ODBC (Open Database Connectivity) for JavaScript/TypeScript runtimes (e.g. node.js), JDBC (Java Database Connectivity) for Java runtimes, Python ODBC (pyODBC) for Python runtimes, and <link href="http://ado.net/">ADO.NET</link> for DotNet runtimes:</paragraph>
        <unordered-list>
          <item><link href="https://github.com/OpenLinkSoftware/mcp-odbc-server">OpenLink Generic MCP Server for ODBC</link></item>
          <item><link href="https://github.com/OpenLinkSoftware/mcp-jdbc-server">OpenLink Generic MCP Server for JDBC</link></item>
          <item><link href="https://github.com/OpenLinkSoftware/mcp-pyodbc-server">OpenLink Generic MCP Server for pyODBC</link></item>
          <item><link href="https://github.com/OpenLinkSoftware/mcp-adonet-server">OpenLink Virtuoso MCP Server for ADO.NET</link></item>
        </unordered-list>
      </subsubsection>
      <subsubsection title="Claude Desktop">
        <paragraph>Here’s the JSON-based MCP Server configuration template for Claude Desktop.</paragraph>
        <code language="json">
{
    "mcpServers": {
        "{Your-Designated-MCP-Server-Name-For-SSE}": {
            "command": "npx",
            "args": ["mcp-remote", "https://{CNAME}/chat/mcp/sse"]
        },
        "{Your-Designated-MCP-Server-Name-For-Streamable-HTTP}": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://{CNAME}/chat/mcp/messages"
            ]
        }
    }
}
        </code>
      </subsubsection>
      <subsubsection title="MCP Inspector">
        <paragraph>By default, your Google hosted OPAL instance uses an HTTPS configuration based on a self-signed certificate generated by Virtuoso. As a result, you need to set the following environment variable before starting your MCP inspector sessions:</paragraph>
        <code>export NODE_TLS_REJECT_UNAUTHORIZED=0</code>
        <blockquote>
          <paragraph>Naturally, if you reconfigure your instance to use your CA-signed certificate or leverage Virtuoso’s native support for the ACME protocol, you can work around this MCP inspector interaction limitation.</paragraph>
        </blockquote>
        <image alt="Screenshot 2025-06-03 at 1.24.14 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-12.png" />
      </subsubsection>
      <subsubsection title="Your OPAL instance as an MCP Client">
        <paragraph>As an MCP client, OPAL is able to bind to tools published by any MCP Server that provides a Streamable HTTP endpoint. For example, our public endpoints:</paragraph>
        <unordered-list>
          <item>&lt;https://demo.openlinksw.com/chat/mcp/messages&gt;</item>
          <item>&lt;https://linkeddata.uriburner.com/chat/mcp/messages&gt;</item>
        </unordered-list>
        <paragraph>You can test this capability using our public MCP endpoints via the following steps:</paragraph>
        <ordered-list>
          <item>Obtain Access Credentials in the form of an API Key</item>
          <item>Go to the following endpoint for your Google instance: https://{CNAME}/chat/admin/</item>
          <item><image alt="Screenshot 2025-06-03 at 1.16.27 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-13.png" /></item>
          <item>Click on the “Application Authentication” button, which presents an authentication dialog from which you can select the “API Key” tab for registering the API Key obtained in step 1</item>
          <item><image alt="Screenshot 2025-06-03 at 1.11.58 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-14.png" /></item>
          <item>Authenticate, and if successful you will be presented with a list of tools from the remote MCP server.</item>
          <item><image alt="Screenshot 2025-06-03 at 1.06.05 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-15.png" /></item>
          <item>Select a Tool of interest from the MCP Server e.g., `execute_sql_query` and then expand by clicking on the `expand` control to interact with the SQL capture interface.</item>
          <item><image alt="Screenshot 2025-06-03 at 1.06.58 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-16.png" /></item>
          <item><image alt="Screenshot 2025-06-03 at 1.07.15 PM" src="https://www.openlinksw.com/DAV/www2.openlinksw.com/data/screenshots/opal-google-cloud-docs-market-place-17.png" /></item>
        </ordered-list>
      </subsubsection>
    </subsection>
    <subsection title="Agent-2-Agent (A2A) Protocol Usage">
      <paragraph>A2A support provides access to AI Agents/Assistants created and deployed using your OPAL instance. It also enables their use in the construction of sophisticated Agentic workflows that route requests across these Agents. Agents are discoverable to all A2A client applications and services via an automatically generated JSON-based Agent Card situated at: https://{CNAME}/.well-known/agent.json. This file comprises the description of an Agent (named “OPAL Agent”) that’s equipped with a collection of skills, each of which is associated with an Agent/Assistant comprising MCP-accessible or directly-accessible tools that are mapped to operations based on native stored procedures, OpenAPI-compliant web services, or tools published by other MCP servers.</paragraph>
      <subsubsection title="Default Agent Card for OPAL instances">
        <code language="json">
{
    "name": "OPAL Agent",
    "description": "OpenLink AI Layer",
    "url": "https://ec2-100-26-216-125.compute-1.amazonaws.com/chat/api/a2a",
    "version": "1.0.0",
    "provider": {
        "organization": "OpenLink Software",
        "url": "https://www.openlinksw.com"
    },
    "authentication": {
        "schemes": [
            "OAuth2"
        ],
        "credentials": "{\"authorizationUrl\":\"https://ec2-100-26-216-125.compute-1.amazonaws.com/OAuth2/authorize\",\"tokenUrl\":\"https://ec2-100-26-216-125.compute-1.amazonaws.com/OAuth2/token\",\"scopes\":[\"openid\",\"profile\"]}"
    },
    "capabilities": {
        "streaming": true,
        "pushNotifications": false,
        "stateTransitionHistory": false
    },
    "defaultInputModes": [
        "text",
        "text/plain"
    ],
    "defaultOutputModes": [
        "text",
        "text/plain"
    ],
    "skills": [
        {
            "id": "system-data-twingler-config",
            "name": "OpenLink Data Twingler v2.0.4",
            "description": "OpenLink Data Twingler v2.0.4",
            "tags": []
        },
        {
            "id": "system-database-admin-config",
            "name": "Virtuoso DB Admin Assistant v1.0.0",
            "description": "Virtuoso DB Admin Assistant v1.0.0",
            "tags": []
        },
        {
            "id": "system-uda-support-assistant-config",
            "name": "OpenLink Support Agent for ODBC and JDBC v1.0.22",
            "description": "OpenLink Support Agent for ODBC and JDBC v1.0.22",
            "tags": []
        },
        {
            "id": "system-val-admin-config",
            "name": "Virtuoso Authentication Layer (VAL) Assistant v1.0.0",
            "description": "Virtuoso Authentication Layer (VAL) Assistant v1.0.0",
            "tags": []
        },
        {
            "id": "system-virtuoso-support-assistant-config",
            "name": "Virtuoso Support Agent v1.1.45",
            "description": "Virtuoso Support Agent v1.1.45",
            "tags": []
        }
    ]
}
        </code>
      </subsubsection>
      <subsubsection title="A2A Usage Example">
        <paragraph>Here’s a simple example from the <link href="https://github.com/OpenLinkSoftware/a2a-samples">A2A Samples Collection</link> from OpenLink’s fork of Google’s A2A repository on Github.</paragraph>
        <paragraph><em>Instructions take the form:</em> User: [Using] , perform .</paragraph>
        <blockquote>
          <paragraph>Where `[]` is optional and `&lt;&gt;` is mandatory.</paragraph>
        </blockquote>
        <paragraph>Here’s output captured from a session involving an A2A client and an OPAL Agent:</paragraph>
        <code>npx tsx src/cli.ts https://{CNAME} {OPAL-INSTANCE-API-KEY}</code>
        <code>
ENDPOINT {CNAME}/chat/api/a2a
✓ Agent Card Found:
  Name:        OPAL Agent
  Description: OpenLink AI Layer
  Version:     1.0.0
  Streaming:   Supported
No active task or context initially. Use '/new' to start a fresh session or send a message.
Enter messages, or use '/new' to start a new session. '/exit' to quit.
OPAL Agent &gt; You: 
        </code>
        <code>
OPAL Agent &gt; You: /new
✨ Starting new session. Task and Context IDs are cleared.
        </code>
        <code>
OPAL Agent &gt; You: Using the Data Twingler, execute: SPARQL SELECT ?s ?name WHERE { SERVICE &lt;https://dbpedia.org/sparql&gt; {SELECT DISTINCT * WHERE {?s a foaf:Person; foaf:name ?name.} LIMIT 5}}
Sending message...

OPAL Agent [10:45:58 AM]: ℹ️ Task Stream Event: ID: 7557962efbbb266b16198632ca925237, Context: 5bf8bc79a99845b8bc4900452d2d31fb, Status: submitted
   Task ID updated from N/A to 7557962efbbb266b16198632ca925237
   Context ID updated from N/A to 5bf8bc79a99845b8bc4900452d2d31fb

OPAL Agent [10:46:09 AM]: 📄 Artifact Received: (unnamed) (ID: a0c76a0c-4152-11f0-a842-9a642c1c243f, Task: 7557962efbbb266b16198632ca925237, Context: 5bf8bc79a99845b8bc4900452d2d31fb)
  Part 1: 📝 Text: Here are the results of your SPARQL query:

| s                                               | name               |
|-------------------------------------------------|--------------------|
| [CaMia Hopson](http://dbpedia.org/resource/CaMia_Hopson) | CaMia Jackson      |
| [Cab Calloway](http://dbpedia.org/resource/Cab_Calloway) | Cab Calloway       |
| [Cab Kaye](http://dbpedia.org/resource/Cab_Kaye) | Cab Kaye           |
| [Cabbrini Foncette](http://dbpedia.org/resource/Cabbrini_Foncette) | Cabbrini Foncette  |
| [Cabell Breckinridge](http://dbpedia.org/resource/Cabell_Breckinridge) | Cabell Breckinridge |

These are distinct individuals identified as persons with their names retrieved from the DBpedia SPARQL endpoint.

OPAL Agent [10:46:09 AM]: ✅ Status: completed (Task: 7557962efbbb266b16198632ca925237, Context: 5bf8bc79a99845b8bc4900452d2d31fb) [FINAL]
   Task 7557962efbbb266b16198632ca925237 is final. Clearing current task ID.
--- End of response stream for this input ---
        </code>
      </subsubsection>
    </subsection>
  </section>
  <section title="FAQ">
    <subsection title="General Questions">
      <paragraph><strong>Q: What is OPAL?</strong></paragraph>
      <paragraph>A: OPAL (OpenLink AI Layer) is an AI-powered platform that provides integration with multiple Large Language Models (LLMs) and supports advanced protocols like MCP and A2A for building AI assistants and agents.</paragraph>
      <paragraph><strong>Q: What are the prerequisites for installing OPAL on Google?</strong></paragraph>
      <paragraph>A: You need an active Google Web Services account to launch an OPAL AMI instance from the Google Marketplace.</paragraph>
      <paragraph><strong>Q: What is the default username and how do I get the password?</strong></paragraph>
      <paragraph>A: The default username is `dba`. To retrieve the password, SSH into your instance and run: `sudo cat /opt/virtuoso/database/.initial-password`</paragraph>
      <paragraph><strong>Q: Which LLM providers are supported?</strong></paragraph>
      <paragraph>A: OPAL supports OpenAI (GPT), Google (Gemini/Gemma), Anthropic (Claude), Microsoft (GPT/Grok/Phi), Perplexity (Sonar), xAI (Grok), Mistral, Alibaba (Qwen), DeepSeek, and Meta (Llama via Groq/Cerebras).</paragraph>
    </subsection>
    <subsection title="Configuration Questions">
      <paragraph><strong>Q: Do I need to enter API keys every time I log in?</strong></paragraph>
      <paragraph>A: No, you can register LLM API keys system-wide using the `OAI.DBA.SET_PROVIDER_KEY()`command to avoid repetitive entry.</paragraph>
      <paragraph><strong>Q: How do I secure my OPAL instance?</strong></paragraph>
      <paragraph>A: Use Attribute-based Access Controls (ABAC) by executing SPARQL commands to set up fine-grained access controls that determine who can log in and under what restrictions.</paragraph>
      <paragraph><strong>Q: What ports need to be open in my security group?</strong></paragraph>
      <paragraph>A: You need to allow HTTPS (port 443) from source `0.0.0.0/0` in your Google security group settings.</paragraph>
      <paragraph><strong>Q: Do I need a public IP address?</strong></paragraph>
      <paragraph>A: Yes, ensure your instance has a public IP address. If not, use the Elastic IP assignment feature in the EC2 console.</paragraph>
    </subsection>
    <subsection title="Protocol Questions">
      <paragraph><strong>Q: What is MCP?</strong></paragraph>
      <paragraph>A: Model Context Protocol (MCP) is a protocol that enables AI applications to securely connect to external data sources and tools, providing standardized access to resources.</paragraph>
      <paragraph><strong>Q: What is A2A?</strong></paragraph>
      <paragraph>A: Agent-2-Agent (A2A) Protocol enables communication and coordination between AI agents, allowing them to work together in sophisticated workflows.</paragraph>
      <paragraph><strong>Q: Can OPAL work as both an MCP client and server?</strong></paragraph>
      <paragraph>A: Yes, OPAL includes built-in support for MCP as both a client and server, supporting Server Sent Events (SSE) and Streamable HTTP transport options.</paragraph>
    </subsection>
    <subsection title="Technical Questions">
      <paragraph><strong>Q: How do I handle SSL certificate issues with MCP Inspector?</strong></paragraph>
      <paragraph>A: Set the environment variable `export NODE_TLS_REJECT_UNAUTHORIZED=0` before starting MCP inspector sessions, as OPAL uses self-signed certificates by default.</paragraph>
      <paragraph><strong>Q: What virtual directories need CORS access for MCP?</strong></paragraph>
      <paragraph>A: You need to set up CORS access for `/.well-known` and `/OAuth2` virtual directories via the Conductor UI.</paragraph>
      <paragraph><strong>Q: How do I register models for providers that don’t support API listing?</strong></paragraph>
      <paragraph>A: For providers like Google Gemini that don’t offer API listing, use: `OAI.DBA.REGISTER_CHAT_MODEL('{llm-vendor-tag}','{llm-name}');`</paragraph>
    </subsection>
  </section>
  <section title="Glossary of Terms">
    <paragraph><strong>A2A (Agent-2-Agent Protocol)</strong> - A communication protocol that enables AI agents to interact and coordinate with each other in sophisticated workflows.</paragraph>
    <paragraph><strong>ABAC (Attribute-based Access Control)</strong> - A security model that uses attributes, policies, and environmental conditions to control access to resources.</paragraph>
    <paragraph><strong>ACME Protocol</strong> - Automatic Certificate Management Environment, a protocol for automating domain certificate verification and creation.</paragraph>
    <paragraph><strong><link href="http://ado.net/">ADO.NET</link></strong> - A data access technology from Microsoft that provides connectivity between .NET applications and databases.</paragraph>
    <paragraph><strong>Agent Card</strong> - A JSON-based descriptor file that contains information about an AI agent’s capabilities, authentication requirements, and available skills.</paragraph>
    <paragraph><strong>AMI (Amazon Machine Image)</strong> - A pre-configured virtual machine image used to create instances in Amazon EC2.</paragraph>
    <paragraph><strong>API (Application Programming Interface)</strong> - A set of protocols and tools for building software applications and enabling communication between different systems.</paragraph>
    <paragraph><strong>Bearer Token</strong> - A security token used for authentication in HTTP requests, typically included in the Authorization header.</paragraph>
    <paragraph><strong>CNAME</strong> - Canonical Name record, a type of DNS record that maps an alias name to the true or canonical domain name.</paragraph>
    <paragraph><strong>CORS (Cross-Origin Resource Sharing)</strong> - A security feature that allows web applications running at one domain to access resources from another domain.</paragraph>
    <paragraph><strong>DBA</strong> - Database Administrator, also refers to the default administrative user account in Virtuoso.</paragraph>
    <paragraph><strong>FOAF (Friend of a Friend)</strong> - An RDF vocabulary for describing people, their activities, and relationships.</paragraph>
    <paragraph><strong>IRI (Internationalized Resource Identifier)</strong> - A generalization of URIs that allows characters from the Universal Character Set.</paragraph>
    <paragraph><strong>iSQL</strong> - Interactive SQL, a command-line interface for executing SQL commands in Virtuoso.</paragraph>
    <paragraph><strong>JDBC (Java Database Connectivity)</strong> - An API for connecting Java applications to databases.</paragraph>
    <paragraph><strong>LLM (Large Language Model)</strong> - AI models trained on large amounts of text data to understand and generate human-like text.</paragraph>
    <paragraph><strong>MCP (Model Context Protocol)</strong> - A protocol that enables AI applications to securely connect to external data sources and tools.</paragraph>
    <paragraph><strong>NetID</strong> - Network identifier used for user authentication and authorization.</paragraph>
    <paragraph><strong>OAuth</strong> - An open standard for access delegation commonly used for authorization.</paragraph>
    <paragraph><strong>ODBC (Open Database Connectivity)</strong> - A standard API for accessing database management systems.</paragraph>
    <paragraph><strong>OPAL (OpenLink AI Layer)</strong> - OpenLink Software’s AI platform that integrates multiple LLMs and supports advanced AI protocols.</paragraph>
    <paragraph><strong>OpenAPI</strong> - A specification for describing REST APIs, formerly known as Swagger.</paragraph>
    <paragraph><strong>pyODBC</strong> - A Python library for connecting to databases using ODBC.</paragraph>
    <paragraph><strong>RDF (Resource Description Framework)</strong> - A framework for representing information about resources on the web.</paragraph>
    <paragraph><strong>SPARQL</strong> - A query language and protocol for querying and manipulating RDF data.</paragraph>
    <paragraph><strong>SSE (Server-Sent Events)</strong> - A web standard that allows a server to push data to a web page in real-time.</paragraph>
    <paragraph><strong>SSL (Secure Sockets Layer)</strong> - A security protocol for establishing encrypted connections between clients and servers.</paragraph>
    <paragraph><strong>stdio</strong> - Standard input/output, referring to the default communication channels in computing systems.</paragraph>
    <paragraph><strong>URI (Uniform Resource Identifier)</strong> - A string that identifies a particular resource.</paragraph>
    <paragraph><strong>VAL (Virtuoso Authentication Layer)</strong> - Virtuoso’s authentication and authorization framework.</paragraph>
    <paragraph><strong>Virtuoso</strong> - OpenLink Software’s universal database management system that supports SQL, RDF, and other data models.</paragraph>
  </section>
  <section title="Related">
    <subsection title="Additional Guides">
      <unordered-list>
        <item>OPAL Admin FAQ</item>
      </unordered-list>
    </subsection>
    <subsection title="Usage Examples">
      <unordered-list>
        <item><link href="https://github.com/OpenLinkSoftware/Assistants">AI Agents/Assistants Samples Collection</link></item>
        <item><link href="https://github.com/OpenLinkSoftware/a2a-samples">A2A Samples Collection</link></item>
      </unordered-list>
    </subsection>
  </section>
</document>
