apex-mcp
Enables AI assistants to build, inspect, and modify Oracle APEX 24.2 applications via natural language, providing 86 tools across 15 categories.
README
apex-mcp — Oracle APEX MCP Server
Build, inspect, and modify Oracle APEX 24.2 applications via natural language. Works with Claude, GPT, Gemini, Cursor, VS Code, and any MCP-compatible AI client.
Overview
apex-mcp is a Model Context Protocol (MCP) server
that exposes 86 tools for building Oracle APEX 24.2 applications through AI assistants.
Built on FastMCP 3.x and Python 3.11+, it connects to Oracle Autonomous Database via the
oracledb thin driver (mTLS wallet — no Oracle Instant Client required).
Instead of navigating the APEX App Builder UI, you describe what you want and the AI does the work: create apps, generate CRUD pages, add JET charts, configure auth schemes, export pages, generate REST endpoints, and more.
┌─────────────────────────────────────────────────────────────────┐
│ AI Client (Claude / GPT / Gemini / Cursor / VS Code) │
│ │
│ "Create a full HR app from the EMPLOYEES table" │
└────────────────────────────┬────────────────────────────────────┘
│ MCP (stdio or HTTP)
▼
┌─────────────────────────────────────────────────────────────────┐
│ apex-mcp server (FastMCP 3.x, Python 3.11+) │
│ 86 tools across 15 categories │
└────────────────────────────┬────────────────────────────────────┘
│ oracledb (mTLS)
▼
┌─────────────────────────────────────────────────────────────────┐
│ Oracle Autonomous Database 23ai │
│ wwv_flow_imp_page → APEX 24.2 App Builder │
└─────────────────────────────────────────────────────────────────┘
Supported AI Clients
| Client | Transport | Config File | Setup Guide |
|---|---|---|---|
| Claude Code | stdio | .mcp.json |
docs/setup-claude.md |
| Claude Desktop | stdio | claude_desktop_config.json |
docs/setup-claude.md |
| GPT / OpenAI Agents SDK | streamable-http | Python code | docs/setup-gpt.md |
| Google Gemini CLI | stdio | .gemini/settings.json |
docs/setup-gemini.md |
| Cursor IDE | stdio | .cursor/mcp.json |
docs/setup-cursor.md |
| VS Code / GitHub Copilot | stdio or http | .vscode/mcp.json |
docs/setup-vscode.md |
| ZAI (visual companion) | n/a | side-by-side | docs/setup-zai.md |
Quick Start
1. Install
git clone https://github.com/your-org/apex-mcp
cd apex-mcp
pip install -e .
2. Configure
Copy and edit the config file for your AI client:
Claude Code — create .mcp.json in your project root:
{
"mcpServers": {
"apex-mcp": {
"command": "python",
"args": ["-m", "apex_mcp"],
"cwd": "/path/to/apex-mcp",
"env": {
"ORACLE_DB_USER": "YOUR_SCHEMA",
"ORACLE_DB_PASS": "YOUR_PASSWORD",
"ORACLE_DSN": "YOUR_DSN",
"ORACLE_WALLET_DIR": "/path/to/wallet",
"ORACLE_WALLET_PASSWORD": "YOUR_WALLET_PW",
"APEX_WORKSPACE_ID": "YOUR_WORKSPACE_ID",
"APEX_SCHEMA": "YOUR_SCHEMA",
"APEX_WORKSPACE_NAME": "YOUR_WORKSPACE"
}
}
}
}
For other clients see Supported AI Clients above.
3. Verify
In Claude Code:
/mcp
You should see apex-mcp connected with 86 tools.
Then:
Connect to Oracle and list all APEX applications in the workspace.
Transport Modes
apex-mcp supports three transport modes, controlled via --transport flag or environment variables.
stdio (default — local clients)
python -m apex_mcp # default
python -m apex_mcp --transport stdio # explicit
apex-mcp # if installed via pip
Best for: Claude Code, Claude Desktop, Cursor, VS Code, Gemini CLI.
Streamable HTTP (remote / multi-client)
apex-mcp --transport streamable-http --port 8000
# Server available at: http://127.0.0.1:8000/mcp
Best for: OpenAI Agents SDK, Codespaces, remote setups, multiple clients.
SSE (Server-Sent Events)
apex-mcp --transport sse --port 9000
# Server available at: http://127.0.0.1:9000/sse
Best for: clients that specifically require SSE transport.
Environment Variables
All CLI flags have environment variable equivalents (lower priority than CLI args):
| Variable | CLI flag | Default |
|---|---|---|
MCP_TRANSPORT |
--transport |
stdio |
MCP_HOST |
--host |
127.0.0.1 |
MCP_PORT |
--port |
8000 |
MCP_PATH |
--path |
/mcp (http) or /sse |
Oracle Connection Variables
| Variable | Description |
|---|---|
ORACLE_DB_USER |
Oracle schema name |
ORACLE_DB_PASS |
Oracle schema password |
ORACLE_DSN |
TNS alias or connect string |
ORACLE_WALLET_DIR |
Directory containing wallet files (cwallet.sso, etc.) |
ORACLE_WALLET_PASSWORD |
Wallet encryption password |
APEX_WORKSPACE_ID |
Numeric APEX workspace ID |
APEX_SCHEMA |
Schema that owns APEX objects |
APEX_WORKSPACE_NAME |
APEX workspace name |
Tool Reference
86 tools across 15 categories.
Connection & SQL
| Tool | Description |
|---|---|
apex_connect |
Connect to Oracle ADB (mTLS wallet) |
apex_run_sql |
Execute any SELECT/DML/DDL statement |
apex_status |
Show connection status and session info |
Applications
| Tool | Description |
|---|---|
apex_create_app |
Create a new APEX application (starts import session) |
apex_finalize_app |
Finalize and commit the application |
apex_list_apps |
List all apps in the workspace |
apex_delete_app |
Delete an application |
apex_get_app_details |
Get full app configuration |
apex_validate_app |
Validate app structure (home page, orphan items, etc.) |
apex_dry_run_preview |
Toggle dry-run mode (log SQL without executing) |
apex_describe_page |
Describe a page's components in human-readable form |
Pages
| Tool | Description |
|---|---|
apex_add_page |
Add a new page to the app |
apex_list_pages |
List all pages |
apex_get_page_details |
Get full page details |
apex_update_page |
Update page properties |
apex_delete_page |
Delete a page |
apex_copy_page |
Copy a page to a new ID |
apex_diff_app |
Compare app structure before/after changes |
Regions & Components
| Tool | Description |
|---|---|
apex_add_region |
Add a region (HTML, IR, report, etc.) |
apex_list_regions |
List regions on a page |
apex_update_region |
Update region properties |
apex_delete_region |
Delete a region |
apex_add_interactive_grid |
Add an Interactive Grid region |
apex_add_master_detail |
Add a master-detail region pair |
apex_add_notification_region |
Add a notification/alert region |
apex_add_timeline |
Add a timeline region |
apex_add_breadcrumb |
Add a breadcrumb navigation region |
apex_add_faceted_search |
Add a faceted search region |
apex_add_file_upload |
Add a file upload component |
apex_add_search_bar |
Add a search bar component |
Items (Form Fields)
| Tool | Description |
|---|---|
apex_add_item |
Add a form item (text, select, date, etc.) |
apex_list_items |
List items on a page |
apex_update_item |
Update item properties |
apex_delete_item |
Delete an item |
apex_bulk_add_items |
Add multiple items in one call |
apex_add_item_validation |
Add server-side validation to an item |
apex_add_item_computation |
Add a computation to set item value |
Buttons & Processes
| Tool | Description |
|---|---|
apex_add_button |
Add a button to a page/region |
apex_delete_button |
Delete a button |
apex_add_process |
Add a page process (PL/SQL, DML, branch) |
apex_list_processes |
List page processes |
Dynamic Actions
| Tool | Description |
|---|---|
apex_add_dynamic_action |
Add a dynamic action (client-side event handler) |
apex_list_dynamic_actions |
List dynamic actions on a page |
Charts & Visualizations
| Tool | Description |
|---|---|
apex_add_jet_chart |
Add an Oracle JET chart (bar, line, pie, etc.) |
apex_add_gauge |
Add a gauge/dial chart |
apex_add_funnel |
Add a funnel chart |
apex_add_sparkline |
Add a sparkline chart |
apex_add_metric_cards |
Add metric/KPI cards with gradient styling |
apex_add_calendar |
Add a calendar region |
apex_add_chart_drilldown |
Add drill-down behavior to a chart |
Shared Components
| Tool | Description |
|---|---|
apex_add_lov |
Add a List of Values (static or dynamic) |
apex_list_lovs |
List all LOVs in the app |
apex_add_auth_scheme |
Add an authorization scheme |
apex_list_auth_schemes |
List authorization schemes |
apex_add_nav_item |
Add a navigation menu item |
apex_add_app_item |
Add an application-level item (global variable) |
apex_add_app_process |
Add an application-level process |
Schema Inspection
| Tool | Description |
|---|---|
apex_list_tables |
List Oracle tables/views in the schema |
apex_describe_table |
Describe columns, types, PKs, FKs (with cache) |
apex_detect_relationships |
Auto-detect FK relationships between tables |
Generators (High-Level)
| Tool | Description |
|---|---|
apex_generate_crud |
Generate full CRUD (list + form pages) for a table |
apex_generate_dashboard |
Generate a dashboard with charts |
apex_generate_login |
Generate a login page |
apex_generate_report_page |
Generate a formatted report page |
apex_generate_wizard |
Generate a multi-step wizard |
apex_generate_analytics_page |
Generate an analytics page with multiple charts |
apex_generate_from_schema |
Generate a full app from multiple tables |
apex_generate_modal_form |
Generate a modal form dialog |
apex_generate_rest_endpoints |
Generate ORDS REST endpoints for tables |
JavaScript
| Tool | Description |
|---|---|
apex_add_page_js |
Add page-level JavaScript |
apex_add_global_js |
Add app-level global JavaScript |
apex_add_global_css |
Add app-level CSS |
apex_add_page_css |
Add page-level CSS |
apex_generate_ajax_handler |
Generate an AJAX callback process |
DevOps & Batch
| Tool | Description |
|---|---|
apex_export_page |
Export a page as SQL (for version control) |
apex_generate_docs |
Generate Markdown documentation for an app |
apex_begin_batch |
Begin a batch operation (queue multiple SQL statements) |
apex_commit_batch |
Execute the batch queue in one round-trip |
apex_preview_page |
Preview page structure (without opening browser) |
Setup & Validation
| Tool | Description |
|---|---|
apex_setup_guide |
Get setup instructions for this workspace |
apex_check_requirements |
Verify all requirements are met |
apex_check_permissions |
Verify Oracle grants and APEX access |
apex_fix_permissions |
Auto-fix common permission issues |
Users
| Tool | Description |
|---|---|
apex_create_user |
Create an APEX workspace user |
apex_list_users |
List workspace users |
Code Examples
Example 1: Full app from schema (single command)
# Uses apex_generate_from_schema internally
# Prompt: "Generate a full app from tables EMPLOYEES, DEPARTMENTS, JOBS"
# Result: App with CRUD pages, dashboard, navigation — in ~10 seconds
Example 2: Incremental build
1. apex_connect()
2. apex_create_app(app_id=200, app_name="Inventory", home_page=1)
3. apex_add_page(page_id=1, page_name="Dashboard", page_mode="Normal")
4. apex_add_region(page_id=1, region_name="KPIs", region_type="STATIC")
5. apex_add_metric_cards(page_id=1, region_id=..., metrics=[...])
6. apex_generate_crud(table_name="PRODUCTS", start_page_id=10)
7. apex_add_nav_item("Dashboard", app_id=200, page_id=1, icon="fa-home")
8. apex_add_nav_item("Products", app_id=200, page_id=10, icon="fa-box")
9. apex_finalize_app()
Example 3: OpenAI Agents SDK
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
# apex-mcp must be running: apex-mcp --transport streamable-http
async with MCPServerStreamableHttp(url="http://127.0.0.1:8000/mcp") as apex:
agent = Agent(
name="APEX Developer",
instructions="Build Oracle APEX apps using apex-mcp tools.",
mcp_servers=[apex],
)
result = await Runner.run(
agent,
"Connect to Oracle and generate a CRUD app for the ORDERS table."
)
print(result.final_output)
asyncio.run(main())
Example 4: Batch operations
apex_begin_batch()
# ... add many regions, items, processes ...
apex_commit_batch(rollback_on_error=True)
# All statements execute in one round-trip; rolls back on any error
Example 5: Dry-run mode
apex_dry_run_preview(enabled=True)
apex_generate_crud(table_name="EMPLOYEES")
# Logs all SQL without executing — useful for review before committing
apex_dry_run_preview(enabled=False)
Architecture
apex_mcp/
├── server.py Entry point — FastMCP 3.x, argparse (stdio/http/sse)
├── __main__.py Enables `python -m apex_mcp`
├── __init__.py Version: 0.2.0
├── config.py Constants (APEX version, workspace ID, date format)
├── db.py ConnectionManager singleton — mTLS, retry, batch, dry-run
├── ids.py Sequential ID generator (base 8_900_000_000_000_000)
├── session.py ImportSession — tracks pages, regions, items, buttons
├── templates.py Hardcoded Universal Theme 42 template IDs
├── validators.py Input validation (page IDs, SQL, chart types, table names)
├── utils.py Shared helpers (_esc, _blk, _sql_to_varchar2)
└── tools/
├── sql_tools.py apex_connect, apex_run_sql, apex_status
├── app_tools.py apex_create_app, apex_finalize_app, ...
├── page_tools.py apex_add_page, apex_list_pages
├── component_tools.py apex_add_region, apex_add_item, apex_add_button, ...
├── shared_tools.py apex_add_lov, apex_add_auth_scheme, ...
├── schema_tools.py apex_list_tables, apex_describe_table, ...
├── generator_tools.py apex_generate_crud, apex_generate_dashboard, ...
├── js_tools.py apex_add_page_js, apex_add_global_js, ...
├── inspect_tools.py apex_get_app_details, apex_update_*, apex_delete_*, ...
├── user_tools.py apex_create_user, apex_list_users
├── setup_tools.py apex_setup_guide, apex_check_requirements, ...
├── validation_tools.py apex_add_item_validation, apex_add_item_computation
├── visual_tools.py apex_add_jet_chart, apex_add_gauge, ...
├── advanced_tools.py apex_generate_report_page, apex_generate_wizard, ...
└── devops_tools.py apex_generate_rest_endpoints, apex_export_page, ...
How APEX creation works
apex-mcp creates APEX applications by generating and executing wwv_flow_imp_page.*
PL/SQL calls directly against the Oracle database — the same mechanism used by APEX's
own import/export system. This bypasses the App Builder UI entirely and is fully
compatible with APEX 24.2.13 / Universal Theme 42.
HTTP transport note
When using --transport streamable-http or --transport sse, apex-mcp is a
single-user server: the ImportSession singleton means only one active import
session exists at a time. For multi-user scenarios, run separate server instances
on different ports.
Known Limitations
| Limitation | Details |
|---|---|
| Single import session | Only one apex_create_app → apex_finalize_app sequence at a time |
| No HTTP authentication | Bind HTTP transport to 127.0.0.1 (default); add a reverse proxy for remote access |
| APEX 24.2 only | wwv_flow_imp_page API is version-specific; not tested on APEX 23.x or 25.x |
| Oracle mTLS required | TLS direct connections are not supported (wallet required) |
| Licensed instrument content | TEA_QUESTOES / TEA_OPCOES_RESPOSTA tables are empty (content is licensed) |
Requirements
| Component | Version |
|---|---|
| Python | 3.11+ |
| FastMCP | 3.0.0+ |
| oracledb | 2.0.0+ |
| Oracle APEX | 24.2 (Universal Theme 42) |
| Oracle DB | 19c+ (tested on ADB 23ai) |
| Oracle Wallet | Required for mTLS connections |
No Oracle Instant Client required — the oracledb thin driver handles mTLS natively.
Troubleshooting
Connection issues
| Error | Cause | Solution |
|---|---|---|
ORA-12541: no listener |
Wrong DSN | Check ORACLE_DSN matches the TNS alias in tnsnames.ora |
ORA-28759: failure to open file |
Wrong wallet path | ORACLE_WALLET_DIR must contain cwallet.sso |
DPY-6005: cannot connect to database |
Wallet password wrong | Check ORACLE_WALLET_PASSWORD |
ModuleNotFoundError: apex_mcp |
Not installed | Run pip install -e . from apex-mcp directory |
APEX issues
| Error | Cause | Solution |
|---|---|---|
ORA-20987: APEX - Application not found |
Wrong app_id or workspace | Check APEX_WORKSPACE_ID and run apex_list_apps |
ORA-01403: no data found in item creation |
Missing p_attributes on DatePicker |
Fixed in v0.2.0 — update to latest |
PLS-00306: wrong number of arguments |
Wrong process parameter name | Use p_process_success_message not p_success_message |
| Buttons not showing on Standard pages | Wrong region position | Use content region positions (CLOSE/CREATE), not dialog footer |
HTTP transport issues
| Problem | Solution |
|---|---|
ConnectionRefusedError |
Start server with apex-mcp --transport streamable-http first |
404 Not Found at / |
Default path is /mcp; use curl http://127.0.0.1:8000/mcp |
| OpenAI SDK can't connect | Ensure MCPServerStreamableHttp URL matches --path setting |
Running Tests
cd apex-mcp
pip install -e ".[dev]"
# Unit tests (no database required)
pytest tests/ -v -m "not integration"
# All tests including integration (requires live Oracle connection)
pytest tests/ -v
The test suite has 51 unit tests covering tools, validators, and generators.
Demo Scripts
| Script | Description |
|---|---|
demos/build_app100.py |
TEA clinical assessment app (15 pages, 46 items) |
demos/build_app203.py |
Analytics dashboard with JET charts + metric cards |
demos/build_app204.py |
Backoffice from schema (8 tables, 17 pages, score 100/100) |
demos/build_app205.py |
Assessment wizard (4-step wizard, CRUD, dashboard, 9s build) |
demos/demo_rest_endpoints.py |
5 tables → 25 ORDS endpoints in 1 second |
demos/demo_generate_docs.py |
Auto-generate Markdown docs for an app |
Run any demo (requires live Oracle connection):
python demos/build_app205.py
Contributing
- Fork the repository
- Create a feature branch
- Add tests for new tools in
tests/ - Ensure
pytest tests/ -m "not integration"passes - Submit a pull request
Adding a new tool
- Add the function to the appropriate
tools/*.pymodule - Register it in
server.pywithmcp.tool()(function_name) - Add unit tests in
tests/ - Update the Tool Reference section in this README
License
MIT — see LICENSE for details.
pt-BR: Este servidor MCP foi construído para o projeto Plataforma Desfecho TEA (Unimed Nacional),
usando Oracle APEX 24.2 + Oracle ADB 23ai. Para configuração detalhada do ambiente de produção,
consulte o CLAUDE.md na raiz do projeto.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。