Forms26 MCP
Forms26 MCP is a read-only local MCP server for inspecting exported Oracle Forms XML and drafting APEX/ORDS/PLSQL migration artifacts.
List exported Forms XML files under a configured root.
Analyze Forms metadata, components, source code, heuristic complexity, and migration risks.
Retrieve original component source in character chunks; line numbers refer to full component source.
Plan draft APEX region/trigger mappings and acceptance criteria.
Generate PL/SQL stubs, unpublished ORDS definitions, and draft OpenAPI contracts; no SQL is executed.
Optionally inspect Oracle dictionary metadata for up to 20 objects in one configured schema.
Provide a reusable modernization workflow prompt/resource; it does not deploy APEX apps or complete migrations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Forms26 MCPassess migration risk for orders_fmb.xml and plan APEX regions"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Forms26 MCP
A working Python MCP server for developer-assisted Oracle Forms modernization to Oracle APEX and ORDS APIs on Oracle AI Database 26ai.
Export a Forms module to XML, connect this server to your coding assistant, inspect the original rules, verify database objects, and draft a shared PL/SQL service layer. APEX processes and REST handlers should call that same service layer.
This is an independent starter implementation inspired by the workflow in the Pretius article. It does not reproduce Pretius proprietary code, prompts, training data, estimation history, or accuracy claims.
What works now
Capability | Output |
XML inventory and parsing | Blocks, items, triggers, program units, LOVs, record groups, relations, menus, attached-library references |
Source inspection | Original code with component IDs, file SHA256 and chunked retrieval |
Migration assessment | Transparent complexity factors; optional illustrative hours using your team's rate |
Risk detection | Navigation, transactions, Forms session state, cross-form calls, desktop/report integrations, dynamic SQL and subclass references |
APEX planning | Region suggestions, trigger mappings and behavior-based acceptance criteria |
API scaffolding | PL/SQL package shell, unpublished ORDS handler and draft OpenAPI 3.1 contract |
Optional database verification | Fixed dictionary queries for objects, columns and constraints in one configured schema |
Host AI workflow | Reusable MCP prompt that asks your coding assistant to review and translate the actual source |
The server uses stdio and runs alongside your development tools. Oracle Database does not host this Python process. Your MCP client supplies the language model; this project has no model API keys, paid inference calls, or AI-provider dependency.
Version 0.2 adds an optional adapter for aoreshkov/oracle-forms-mcp: Forms26 can use its indexed Forms, menus, object libraries and PLD libraries as inputs to the migration tools. See upstream setup, public-example results and third-party attribution.
Version 0.3 connects satwikjambula/apx-testkit for post-development test generation from completed APEXlang exports. It delegates deterministic smoke-test generation, retains migration evidence and native quality/verification gaps, and records GENERATED_NOT_EXECUTED. See the QA setup and workflow.
Related MCP server: Oracle ADB AI Agent MCP Server
Run it
Requires Python 3.11 or later. From this directory:
python3 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/python -m forms26_mcp.server --root /absolute/path/to/exported-formsOn Windows, use .venv\Scripts\python.exe in place of .venv/bin/python.
A stdio MCP server waits for an MCP client's JSON-RPC requests; running it in a terminal does not open a web interface. Configure the client using examples/mcp-config.json, replacing both absolute paths. The example uses the common mcpServers shape; adapt the wrapper if your client requires a different configuration format. Set the client's command to the interpreter inside this virtual environment, where the project was installed.
Test without a database:
.venv/bin/python -m forms26_mcp.demo --root examples --path orders_fmb.xml --out demo-output.json
.venv/bin/python -m unittest discover -s tests -v
.venv/bin/python scripts/check_mcp.pyThe included XML is a synthetic order-entry form. The included examples/demo-output.json shows its actual analysis and scaffolds.
Export existing Forms modules
Use Oracle's Forms2XML utility in a licensed/authorized Forms development environment:
frmf2xml USE_PROPERTY_IDS=NO DUMP=ALL customers.fmb orders.fmbThe corresponding exports are normally named customers_fmb.xml and orders_fmb.xml. Oracle also documents Binary-to-XML conversion in Forms Builder. This server reads XML; it does not decode FMB binaries or install Oracle Forms.
Place exported modules beneath a dedicated allowed root. Attached PLL library bodies, inherited object definitions and external integration code must be supplied and reviewed separately; seeing a library reference does not resolve its implementation.
The export options and broader migration inputs are described in Oracle's APEX 5.0 Forms migration guide. Its metadata concepts inform our coverage and gap map. Historical APEX wizard and generation instructions are not promises about the installed target release. The optional upstream server handles PLL-to-PLD conversion and PLD inspection when configured; the local XML parser does not. Reports XML parsing remains unsupported.
Connect Oracle 26ai for schema checks
Install the optional driver:
.venv/bin/python -m pip install -e '.[oracle]'Set the following environment variables in the environment that launches the MCP process:
Variable | Purpose |
| Oracle connect string, e.g. |
| Dedicated account with the necessary dictionary visibility |
| Password provided through your local secret mechanism |
| One target owner, e.g. |
| Optional directory containing |
| Optional wallet directory for python-oracledb Thin mode |
| Optional wallet password |
The project does not load .env automatically. Have your shell, IDE or MCP launcher inject secrets; keep them out of source control and chat prompts. The sample MCP configuration deliberately contains no credentials.
inspect_database_objects(["ORDERS", "ORDER_LINES"]) queries only ALL_OBJECTS, ALL_TAB_COLUMNS, ALL_CONSTRAINTS and ALL_CONS_COLUMNS, with owner/object names bound as values. It starts a read-only transaction and uses connection/call timeouts. There is no arbitrary SQL, PL/SQL execution or database write tool. Names are restricted to simple unquoted ASCII identifiers up to 30 characters for this MVP; quoted, qualified and longer identifiers need a later extension. Synonyms are reported as objects but are not resolved to their targets.
An absent object means it is absent from the configured account's view; it may exist with insufficient visibility. Dictionary checks do not inspect application rows, package bodies, grants, VPD behavior or installed APEX/ORDS compatibility. Use database privileges appropriate to a metadata reader; dictionary visibility alone does not make an overprivileged account safe.
Tools
Tool | Main arguments |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Connection, version and native tool schemas; no launch secrets |
|
|
|
|
|
|
| QA provider connection/version and native schemas |
|
|
| Completed export, fresh run name, development reference and explicit completion declaration; optional source/baseline evidence |
Resource: forms26://workflow. Prompt: modernize_form(path).
With upstream configured, use the same analysis/source/APEX/API tools with path: "upstream:ORDERS.fmb" or "upstream:UTILS.pll". Call upstream_fetch first. Native reads, including cross-module search and raw XML inspection, are available through upstream_read; get exact argument schemas from upstream_status. No read call automatically converts a module. Operator-owned launch configuration is never accepted as a tool argument.
Keep the file SHA256 with each review: component IDs are stable for unchanged XML traversal, but can change when an export changes. Consume every result page and source chunk before concluding that a module has been fully inspected. XML is capped at 32 MiB per module. Normal external DTD declarations are tolerated without fetching DTD content; XML entities are rejected.
Example instruction to your MCP-enabled assistant:
Modernize orders_fmb.xml for APEX and ORDS on Oracle 26ai. Use the modernize_form prompt. Read all relevant source, verify ORDERS and ORDER_LINES, and identify missing library logic. Propose a shared PL/SQL package, APEX mappings and an API contract. Show source evidence and unresolved assumptions. Prepare development changes for review and report exactly which checks ran.
What still needs implementation in a real migration
The API generator creates shells, not translated business rules. Its package deliberately raises -20001 until the actual rules are implemented; its ORDS module is NOT_PUBLISHED, and its response handler is incomplete. The OpenAPI document is explicitly a draft. No SQL returned by these tools is executed.
The APEX output is a design blueprint, not an importable application. A developer or host coding assistant must generate the application using a supported workflow for the installed APEX release, compile/test the service packages, configure ORDS authorization and response serialization, and verify behavior against the original Forms application. This project does not assume that an arbitrary APEX export format or undocumented internal package is stable.
The intended migration flow is:
Export and inventory modules and libraries.
Inspect metadata and source; resolve dependencies and subclassing.
Confirm database objects and document gaps.
Move reviewed business rules into shared PL/SQL services with explicit inputs.
Rebuild screens in APEX; expose selected operations through authenticated ORDS APIs.
Test validation parity, transaction boundaries, master/detail behavior, row authorization, concurrency, error handling and API retries in a development schema.
Plan phased cutover and rollback using the application's operational requirements.
The server is a backend for that workflow. It does not automatically deliver a completed migration, production REST service or deployed APEX app.
Estimation and limitations
Complexity points use the visible factors returned by analyze_form: base weight, blocks, groups of items, code units, nonblank code lines, risks, libraries and relations. These are uncalibrated planning heuristics. They are not Pretius estimates. Hours are returned only when you provide hours_per_point; the high end applies an explicit illustrative factor of 1.75. Calibrate against completed modules and add separate allowances for unresolved libraries, integration work, UAT, deployment and training.
Local parsing handles common Forms2XML attribute-based, namespaced and property-element representations. The upstream adapter additionally retains property classes, effective item DML, source ranges, inherited-body status and unresolved dependencies. It refuses automatic migration when the upstream index or block details are truncated; native inspection is still available. SQL/PLSQL scanning is lexical and deliberately ignores comments/string literals; it is not a compiler, complete dependency graph or Forms runtime emulator. Validate it against your own exports before portfolio-wide use. Review prompt injection and sensitive content in legacy files as project data; the host model controls what it sends to its AI provider.
Oracle AI Database 26ai is the intended target. The XML analysis does not need an Oracle connection. No live 26ai, APEX or ORDS environment was available for validation of this starter, so database compatibility, PL/SQL compilation and application imports have not been certified. Pinning the tested MCP v1 maintenance SDK avoids silently adopting the incompatible v2 API; upgrading should include a deliberate protocol regression check.
References
Oracle: APEX 5.0 Forms conversion guide — historical conversion inputs, metadata review and annotations; see the explicit coverage/gap map.
Pretius: Oracle Forms migration — inspiration for assessment, risk review and assisted modernization.
Oracle: Forms2XML conversion — source export procedure.
Oracle: MCP-assisted Forms modernization — source inspection, object verification and reusable database logic.
Oracle SQLcl MCP — optional companion for separately governed database development; this project does not enable it automatically.
ORDS PL/SQL reference — module, template and handler APIs.
Official MCP Python SDK v1 documentation — pinned stdio server implementation.
Suggested next increment
Use one actual Forms XML export and a development-schema metadata snapshot to validate the parser, implement one shared validation service, build one APEX page and one ORDS endpoint, and compare their behavior with the original form. A proven vertical slice is the basis for extending conversion coverage.
Contributing and license
Contributions are welcome; see CONTRIBUTING.md, the roadmap, and security reporting guidance. This is an alpha developer tool. Examples are synthetic; do not contribute customer exports, credentials, wallets, or proprietary code.
Released under the MIT License. Oracle, APEX and Pretius names identify external products and references; this project is independent and is not endorsed by those organizations. Oracle software, documentation and third-party dependencies retain their own licenses.
Available Tools
8 toolsanalyze_formCRead-onlyIdempotent
Summarize Forms metadata and heuristic complexity; optionally use a team-calibrated hourly rate.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| hours_per_point | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without description help. The description adds that complexity is heuristic and that a calibrated rate is optional, but it does not explain how complexity is computed or what the summary contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no wasted clauses, and the core purpose is front-loaded. The brevity is efficient but tips into under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, 0% parameter descriptions, and a required 'path' argument, the description must carry more weight than it does. It omits the expected path format, what the complexity score means, and what the summary returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely fails. 'path' — the required parameter — is never mentioned, and the 'hourly rate' phrasing does not clearly map to the 'hours_per_point' parameter, whose units and effect on output remain undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource: 'Summarize Forms metadata and heuristic complexity.' An agent can tell this is an analysis/summary tool rather than a raw fetch like get_source or an enumeration like list_forms. However, 'heuristic complexity' is unexplained jargon, so the exact output is somewhat opaque.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and none of the siblings (list_forms, migration_risks, plan_apex) are named as alternatives. The optional hourly-rate clause hints at cost/effort estimation but never states the scenario that should trigger this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_apiBRead-onlyIdempotent
Return PL/SQL stubs, unpublished ORDS definition and draft OpenAPI contract; no SQL is executed.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| block_name | Yes | ||
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false; the description adds the useful clarification that 'no SQL is executed', which tells the agent the tool only generates artifacts. It does not say whether the drafts are persisted anywhere, what happens to prior drafts, or what permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the outputs first and the safety caveat last; nothing is wasted. It is perhaps too terse given the parameter gap, but as structure it is clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and zero parameter documentation mean the description must carry the load, but it says nothing about the shape of the returned artifacts, where they are written, or how the three required identifiers are used. For a generator with three required inputs this leaves real ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (path, block_name, package_name) are required yet schema description coverage is 0%, and the description never mentions any of them. An agent gets no hint about format or meaning of 'path' versus 'block_name', so the description fails to compensate for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Return') and three concrete artifacts: PL/SQL stubs, an unpublished ORDS definition and a draft OpenAPI contract. That is far more specific than the name, though it does not relate itself to any sibling tool (the siblings are mostly inspection/planning tools, so differentiation is arguably irrelevant).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'draft' plus 'unpublished' implies this is for scaffolding an API before publishing it, but the description never states when to prefer it over other tools or what preconditions exist. Usage must be inferred from the artifact names rather than being stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sourceBRead-onlyIdempotent
Read original code in character chunks; risk line numbers refer to the complete component source.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| offset | No | ||
| component_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive behavior, so safety is covered. The description usefully adds that output is returned in character chunks (i.e., results may be truncated and require pagination) and clarifies a line-numbering convention against the full source, but it omits chunk size behavior and how to iterate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with two clauses, both of which carry information: the read mode and a caveat about line-number semantics. It is front-loaded and wastes no words, though the semicolon-joined caveat could be more clearly separated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter read tool with zero schema coverage and no output schema, the description does too little: an agent cannot tell what path means relative to component_id, nor how to page through chunks. The chunking hint is the only guidance offered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so all four parameters (path, component_id, limit, offset) arrive with bare titles and no meaning. 'Character chunks' indirectly implies that limit/offset are chunking controls, but the description never explains what path vs component_id represent or how they relate, leaving the required-parameter pair effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Read original code') plus a retrieval mode ('in character chunks'), which is clear enough to separate it from analysis-oriented siblings like analyze_form or migration_risks. It does not explicitly name or contrast with any sibling, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause about risk line numbers referring to the complete component source implies this tool is the follow-up to migration_risks, but the connection is only hinted at rather than spelled out. There is no explicit guidance on when to prefer this tool over analyze_form or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_database_objectsARead-onlyIdempotent
Read fixed Oracle dictionary queries for up to 20 objects in the server-configured schema.
| Name | Required | Description | Default |
|---|---|---|---|
| names | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive/openWorld, and the description adds genuinely new constraints: the queries are 'fixed' (no arbitrary SQL), results are capped at 20 objects, and scope is limited to the server-configured schema. It does not say what happens above the 20-object cap or what an unrecognized name returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the constraint (20 objects, fixed queries) arrives immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one param and no output schema, the description covers intent and scope but not the shape of results or error behavior for missing/overflow names, which an agent would want before relying on it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter at 0% schema coverage, so the description must carry it. It discloses the array is object names and the cap of 20, but leaves qualification/case sensitivity and item-level constraints unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Read) plus concrete resource (Oracle dictionary queries over database objects), with scope qualifiers (up to 20 objects, server-configured schema). An agent can tell this is a metadata-inspection tool rather than a form/Apex tool, though it never names a sibling to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to prefer this over get_source or list_components, no prerequisites, no exclusions. The agent must infer usage from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_componentsCRead-onlyIdempotent
List blocks/items/triggers/program units etc. Use exact kind, e.g. Trigger or Item; blank means all.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| path | Yes | ||
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered, but the description adds no behavioral context of its own: it does not say whether results are paginated (limit defaults to 100), what order they come in, or how deep the listing goes. With annotations carrying the full safety profile, the description contributes almost nothing beyond the safety story.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what is listed before the argument hint. Nothing is wasted, though the terseness edges toward under-specification rather than efficient density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A four-parameter tool with 0% schema coverage and no output schema needs the description to explain the required path, the component kinds, and pagination behavior. The description leaves the required parameter and the return shape entirely unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it only covers 'kind' (with example values Trigger/Item and the blank-means-all default). The required 'path' parameter is never explained, and limit/offset pagination semantics are left completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'List' plus the enumeration 'blocks/items/triggers/program units' conveys the resource, but the umbrella term 'components' is never defined and the description does not distinguish this tool from siblings like list_forms or inspect_database_objects, which plausibly overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is about the 'kind' argument ('Use exact kind... blank means all'), which is parameter syntax, not when-to-use. There is no statement of when to pick this tool over list_forms or inspect_database_objects, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_formsBRead-onlyIdempotent
List XML files within the configured Forms root, with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds only that results are paginated, with no note on ordering, total counts, or error conditions, so it adds modest value beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the scope and behavior stated up front and zero wasted words. Well sized for a simple read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial read-only listing tool this is close to adequate, and annotations cover safety. However, with no output schema and no description of what each returned form entry contains or how pagination terminates, an agent still lacks return-value context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% — neither the 'limit' nor 'offset' parameter has a description. The phrase 'with pagination' merely hints that limit/offset control paging without defining defaults (100/0), maximums, or behavior at the end of the list, so the gap is largely uncompensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List XML files') plus the scope ('within the configured Forms root'). It implicitly distinguishes the resource (forms) from the sibling list_components, but never explicitly contrasts the two, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus siblings like analyze_form, list_components, or get_source, and no prerequisites or exclusions. Usage is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
migration_risksCRead-onlyIdempotent
Find Forms navigation, session, integration, dynamic-SQL and transaction risks with source evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a read-only, idempotent, closed-world, non-destructive operation, so the safety profile is covered. The description adds that results come with 'source evidence', which is genuinely useful context about the response, but says nothing about pagination behavior or how risks are ranked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the risk categories front-loaded after the verb; nothing is redundant. It is compact to the point of omitting needed detail, but the brevity itself is well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no parameter descriptions, and no annotations explaining results, the description should say what 'source evidence' looks like (file/line references?) and how the path argument is interpreted. Neither is present, leaving the agent under-informed for a three-parameter invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all meaning for the three parameters and it carries none: 'path' (the only required argument) is never explained as a source root vs. a Form module, and limit/offset are only discoverable from the schema defaults. This is a significant gap for an otherwise scoped analysis tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find) and a concrete resource (Forms migration risks across navigation, session, integration, dynamic-SQL and transaction categories), with the notable output promise of 'source evidence'. The risk taxonomy makes it clearly distinguishable from siblings like analyze_form or plan_apex, though it does not name any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to run this versus analyze_form or plan_apex, no prerequisite (e.g. must the codebase be indexed first), and no exclusion criteria. An agent can only infer usage from the migration-testing framing of the sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_apexBRead-onlyIdempotent
Build a draft APEX region/trigger mapping and acceptance checklist. Does not create an APEX export.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and the description usefully reinforces that boundary by disclaiming export creation — an agent could otherwise assume 'build' produces artifacts. It still doesn't say whether the draft is returned as text or written somewhere, which matters for a non-destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no padding, with the purpose front-loaded and the exclusion immediately after. Efficient, though the extreme terseness is what leaves the gaps flagged elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should explain what a 'draft mapping and acceptance checklist' looks like or where it lands; it doesn't. Combined with the undocumented 'path' argument, an agent cannot confidently construct a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required 'path' parameter with 0% schema description coverage, and the description says nothing about it — path to an APEX app, a directory, a form definition? With low coverage the description must compensate and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb and artifact: builds a draft APEX region/trigger mapping plus an acceptance checklist. It is distinguishable from siblings like draft_api and migration_risks, though it never names them. Purpose is clear, sibling routing is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the negative scope 'Does not create an APEX export', which implies this is a pre-export planning step. There is no explicit guidance on when to call this versus analyze_form, migration_risks, or draft_api, nor any stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
analyze_form - First observed
draft_api - First observed
get_source - First observed
inspect_database_objects - First observed
list_components - First observed
list_forms - First observed
migration_risks - First observed
plan_apex
TDQS
Scored across 8 tools
Each tool targets a distinct migration-analysis step: listing forms, analyzing metadata, listing components, reading source, assessing risks, planning APEX mapping, drafting API artifacts, and inspecting DB objects. Overlap between analyze_form and migration_risks is limited because one summarizes complexity while the other surfaces specific risk evidence. An agent can select the right tool from the descriptions.
Most names follow a clear verb_noun snake_case pattern, e.g. list_forms, analyze_form, get_source, plan_apex, draft_api. The main deviation is migration_risks, which is a noun phrase rather than an action phrase, but it remains readable and consistent in casing.
Eight tools is a well-scoped set for an Oracle Forms analysis and migration-planning server. Each tool covers a distinct phase of discovery, inspection, risk assessment, or drafting, with no obvious filler tools.
The surface covers the main analysis workflow: discovering forms, inspecting components and source, assessing risks, planning APEX mappings, drafting API artifacts, and checking DB objects. The main limitation is that it intentionally stops at drafts and does not create APEX exports or execute SQL, but that appears to be a deliberate scope boundary rather than an accidental gap.
Maintenance
Related MCP Connectors
AI-native Day 0 modernization platform for PRDs, architecture, work orders, and code transformation.
An AI concierge that turns static forms into adaptive AI conversations. From any MCP client.
- FormyOAuthil.co.formy
Read your Formy forms and responses over OAuth. For Claude, ChatGPT, Cursor and VS Code.
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables integration with Oracle Database and Oracle APEX 20.2, allowing LLMs to execute SQL/PL/SQL, manage database objects, and inspect APEX application metadata. It supports full database CRUD operations, object dependency analysis, and detailed page-level inspection of APEX environments.3MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI-powered database operations on Oracle Autonomous Database via natural language, including SQL translation, schema exploration, and API orchestration.4-
- AlicenseBqualityFmaintenanceEnables AI assistants to build, inspect, and modify Oracle APEX 24.2 applications via natural language, providing 86 tools across 15 categories.10015MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to inspect and query Oracle Forms modules (blocks, triggers, program units, etc.) without Forms Builder, supporting reverse engineering, code review, and modernization.8Apache 2.0