Introducing an agent database skill for Multilingual Engine

Oracle recently published a curated list of > 100 agent skills on GitHub for use with your favourite coding agent. The topic of AI-assisted development and why you really should pay attention to it has been covered in far greater detail elsewhere, there is no need to bore you with the 42nd iteration.

Oracle Skills

As per the readme, Oracle Skills is the repository for Oracle-wide skills, organized by domain. The goal is to provide a single source of truth for practical Oracle skills across products and platforms. And it should help you get started quickly.

There are quite a few skills in the db/appdev category, this post covers the one helping you write server-side JavaScript.

Feel free to explore the repository, there is a lot to discover ๐Ÿ˜Š

What about an example…

The first step is to install the skills. It’s up to you if you want to install them in your local project directory, or globally. The article assumes you already installed the skills.

You can see the conversation with a coding agent (codex) in this example. It features on of the recurring themes in the MLE/JavaScript world: email validation made easy. validator.js has previously featured on this blog, and it will do so again.

This time however, instead of writing the code manually, the combination of codex and gpt-5.5 is responsible for the majority of the work.

$ codex
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ >_ OpenAI Codex (v0.125.0) โ”‚
โ”‚ โ”‚
โ”‚ model: gpt-5.5 medium /model to change โ”‚
โ”‚ directory: ~/devel/ai/blogpost โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
Tip: New Build faster with the Codex App. Run 'codex app' or visit
https://chatgpt.com/codex?app-landing-page=true
โ€บ I need your help in creating a plan for validating email addresses in Oracle AI Database 26ai. I
want to use MLE/JavaScript to validate email addresses based on this open source project: valida
tor.js (https://github.com/validatorjs/validator.js)
I want you to come up with the steps required to implement a function that accepts a string as
the first input parameter. It also accepts a JavaScript object to override default options. The
function returns true if validator's isEmail is true, false otherwise.
โ€ข Iโ€™ll ground the plan in the local Oracle skill guidance and the current validator.js API shape,
then keep it implementation-oriented for MLE/JavaScript in 26ai.
โ€ข Explored
โ”” Read SKILL.md (oracle-db-skills skill)
Search MLE|JavaScript|Multilingual|module in skills
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ€ข The local skill set has a dedicated MLE guide, so Iโ€™m using that path and then checking
validator.js directly for the relevant isEmail surface.
โ€ข Explored
โ”” Read mle-javascript-in-database.md
โ€ข Searching the web
โ€ข Searched validator.js isEmail options GitHub README isEmail
โ€ข Searching the web
โ€ข Searched Oracle Database 26ai JavaScript Developer's Guide MLE modules call specifications PURE
โ€ข Searching the web
โ€ข Searched Oracle AI Database 26ai MLE JavaScript type mapping JSON PL/SQL JSON object parameter
โ€ข Searching the web
โ€ข Searched validator.js package license MIT GitHub validatorjs
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ€ข I used the fresh Oracle MLE skill guidance and checked the current validator.js README/API.
Plan
1. Define the database-facing API
Use a module-backed MLE function, not inline JavaScript, because validator.js is a third-party
dependency.
Proposed SQL surface:
FUNCTION is_email(
p_email IN VARCHAR2,
p_options IN JSON
) RETURN BOOLEAN
JavaScript export:
export function isEmailAddress(email, options = {}) {
...
}
Oracle MLE call specification should map JSON options to JavaScript any, because Oracle docume
nts SQL JSON arguments as usable with MLE JavaScript and maps them to MLE ANY in call signatur
es. (docs.oracle.com
(https://docs.oracle.com/en/database/oracle/oracle-database/26/mlejs/working-json-data.html?utm_source=openai))
2. Decide option semantics
Use validator.js defaults unless p_options overrides them. validator.js isEmail(str [,
options]) defaults include:
{
allow_display_name: false,
require_display_name: false,
allow_utf8_local_part: true,
require_tld: true,
allow_ip_domain: false,
allow_underscores: false,
domain_specific_validation: false,
blacklisted_chars: '',
host_blacklist: []
}
Current validator.js also documents ignore_max_length, host_whitelist, and that host_blacklist
/ host_whitelist can contain strings or regular expressions. JSON cannot represent JavaScript
RegExp, so the database API should support only JSON-representable option values unless you add
a second API for regex construction. (github.com
(https://github.com/validatorjs/validator.js?utm_source=openai))
3. Implement a thin JavaScript wrapper
The wrapper should:
- Return false for null / undefined email input.
- Ensure the email value passed to validator.js is a string.
- Treat null / missing options as {}.
- Merge options with defaults.
- Call validator.js isEmail(email, mergedOptions).
- Return only true or false.
- Catch validator.js input/type errors and return false, unless you want invalid options to
raise an exception.
validator.js validates strings only and says non-string input causes an error, so this wrapper
is the right boundary for defensive conversion or rejection. (github.com
(https://github.com/validatorjs/validator.js/?utm_source=openai))
4. Bundle validator.js for MLE
Install the npm package named validator, not validatorjs.
Use an ESM-friendly import such as:
import isEmail from 'validator/es/lib/isEmail.js';
Then bundle with esbuild or similar into a single ECMAScript module suitable for CREATE MLE MO
DULE. Oracleโ€™s MLE guidance favors persistent modules plus call specifications for reusable AP
Is, and third-party dependency trees should be resolved with a bundler. (docs.oracle.com
(https://docs.oracle.com/en/database/oracle/oracle-database/26/mlejs/oracle-database-javascript-developers-guide.pdf?utm_source=openai))
5. Create the MLE module
Load the bundled file into Oracle AI Database 26ai as an MLE JavaScript module, for example:
CREATE OR REPLACE MLE MODULE email_validator_mod
LANGUAGE JAVASCRIPT AS
...
/
In practice, use SQLclโ€™s MLE module loading workflow rather than embedding a large bundle
directly in SQL.
6. Create a PURE MLE environment if possible
Email validation is deterministic computation and should not need database state. Use PURE so
the function cannot access stateful database APIs. Oracle 26ai documentation describes PURE re
stricted execution contexts for MLE environments and inline call specs. (docs.oracle.com
(https://docs.oracle.com/en/database/oracle/oracle-database/26/mlejs/changes-this-release-oracle-javascript-developers-guide.html?utm_source=openai))
7. Expose it through a call specification
Example shape:
CREATE OR REPLACE FUNCTION is_email(
p_email VARCHAR2,
p_options JSON
) RETURN BOOLEAN
AS MLE MODULE email_validator_mod
SIGNATURE 'isEmailAddress(string, any)';
/
If you want callers to omit options, add a PL/SQL wrapper or overload that passes JSON '{}',
because call specification defaults are awkward and should stay minimal.
8. Add tests before loading into the database
Use Vitest against the wrapper module with cases for:
- user@example.com returns true
- malformed emails return false
- NULL-like inputs return false
- require_tld: false accepts user@localhost
- allow_display_name: true accepts Jane Doe <jane@example.com>
- default options reject display names
- unsupported option shapes are handled consistently
9. Add database validation tests
Use SQLcl MCP against localhost_emily_1521 to verify:
SELECT is_email('user@example.com', JSON '{}');
SELECT is_email('user@localhost', JSON '{"require_tld": false}');
SELECT is_email('Jane <jane@example.com>',
JSON '{"allow_display_name": true}');
10. Document constraints
Document that this function validates syntax only. It does not prove mailbox existence, deliverab
ility, MX records, or ownership. Also document the exact validator.js version bundled, because fu
ture validator.js option behavior can change. The project is MIT licensed, so keep the license no
tice with the bundled dependency. (github.com
(https://github.com/validatorjs/validator.js/?utm_source=openai))

This turned out to have worked really well. The most important bits to notice are

  • The LLM retrieved the list of skills
  • It figured out that there is a skill specifically written for MLE/JavaScript (and Typescript by the way)
  • The suggested plan looks reasonable, you could tell codex to implement it and at most require a few corrections
  • Codex even understood that no database interaction is required and suggested the use of a PURE execution context. In other words, one that “turned all database access off”.

Summary

The curated list of Oracle skills on GitHub gets you started with tech tech stack in almost no time. Skills exist for many subject areas, including MLE/JavaScript (+ Typescript). Using these skills should provide productivity benefits to anyone willing to give them a go.

The usual warning applies: agents can do damage, even very severely so, if not kept in check. Be vigilant and apply all best practices around security and auditing. Make sure your Oracle database has resource plans in place and doesn’t allow the agent to allocate your entire CPU capacity There are malicious skills out there in the wild that can easily compromise your environment, deny service, or even wipe it out. It’s better to be safe than sorry. And always as your security team for advice and/or permission.