ecommerce-oltp
Provides tools for triggering Databricks-based Ecommerce Genie Ontology workflows, including OLTP historical/realtime data generation, CDC ETL into the star schema, and fraud evidence pack runs.
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., "@ecommerce-oltpGenerate 5,000 realtime OLTP orders"
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.
Ecommerce Genie Ontology workflows
Programmatic version of the Northwind Retail Genie Ontology demo. The
reference notebooks in ../genie_ontology stay untouched.
This repo turns each of those .py files into a workflow task and runs them
through a local Python script or FastAPI (credentials from .env) instead of
importing the folder into Databricks by hand.
Layers depend inward only: api → workflows → adapter_databricks, with shared contracts in common. Databricks can be swapped by adding another adapter that implements the same interfaces.
Each of api, workflows, and adapter_databricks has an ObjectsFactory
that looks up named components and caches singleton instances.
src/ecommerce_genie_ontology/
api/ # FastAPI + CliApp
objects_factory.py # ApiObjectsFactory
workflows/
objects_factory.py # WorkflowsObjectsFactory
orchestrator.py # WorkflowRunner
provision|create_agents|invoke_agents|cleanup/
workflow.py
workspace_facade/{interface,impl}.py
tasks/
adapter_databricks/
objects_factory.py # AdapterDatabricksObjectsFactory
daos/ # SDK / REST
facades/ # SqlFacade, GenieFacade, GovernanceFacade, JobsFacade
common/
interfaces/ # Protocols used for DI
dtos/ constants/ utils/Workflow | Job name | Tasks |
provision |
|
|
create_agents |
|
|
invoke_agents |
| one task per sample question |
cleanup |
|
|
generate_historical |
| PySpark OLTP history ( |
generate_realtime |
| Append 100–10,000 new OLTP orders for CDC |
etl_historical |
| Overwrite star-schema dims/facts from OLTP |
etl_cdc |
| Apply Delta change feed into |
Default volume is 200 customers, 3 addresses each, 25,000 orders per customer per year, 3 years ending this month (about 15 million orders). That is per year, not per day. Dims/facts are rebuilt from those OLTP tables so they match.
Prerequisites
A Databricks workspace with Unity Catalog and a SQL warehouse
Permission to create a catalog/schema, metric views, and Genie agents
uv(this project does not use pip)
Related MCP server: MCP Restaurant Ordering API Server
Setup
cp .env.example .envFill in at least:
DATABRICKS_HOST=https://your-workspace.cloud.databricks.com
DATABRICKS_TOKEN=dapiXXXXXXXXDATABRICKS_WAREHOUSE_ID is optional. Catalog provision looks up warehouse ecommerce-genie-ontology by name. Genie uses the same host/token unless you set GENIE_HOST / GENIE_TOKEN.
uv syncGitHub Actions (no local CLI)
Use Actions → Run workflow. Create starts a 3-hour timer; a later Create cancels the previous timer. Destroy can be run by hand any time before that. Pipeline workflows are also manual (workflow_dispatch only).
Create Databricks stack — workspace, SQL warehouse, catalog
ecommerce_genie_ontologyGenerate Historical Data — OLTP tables for N customers / years
Run ETL Star Schema - Historical Data — overwrite dims/facts from OLTP
Generate Realtime Orders Data — 100 / 250 / 500 / 1,000 / 2,500 / 5,000 / 10,000 orders; window
latest/last_2/last_3/allRun ETL Star Schema - CDC Data — Delta CDF into
fact_salesPipeline Historical OLTP and Star Schema — steps 2 then 3
Pipeline Realtime Orders and CDC Star Schema — steps 4 then 5
Destroy Databricks stack in 3 hours — queued automatically after Create
Destroy Databricks stack — manual wipe (cancels the 3-hour timer)
Destroy drops the catalog, deletes the warehouse and workspace, then emails CLEANUP_NOTIFY_EMAIL that this codebase’s Databricks demo stack is gone and should not keep billing.
Repo Settings → Secrets and variables → Actions:
Secret | Purpose |
| Account API |
| OAuth M2M service principal |
| OAuth M2M secret |
| Users who can open the workspace UI |
| Inbox for the “stack cleaned” email |
| SMTP server (for example |
|
|
| SMTP login |
| SMTP password or app password |
| Optional From address; defaults to |
Optional: DATABRICKS_ACCOUNT_HOST, DATABRICKS_TOKEN, DATABRICKS_HOST, DATABRICKS_WORKSPACE_NAME, DATABRICKS_AWS_REGION, DATABRICKS_WAREHOUSE_NAME, DATABRICKS_CATALOG, DATABRICKS_SCHEMA, DATABRICKS_OLTP_SCHEMA.
Run locally (uses .env, talks to Databricks APIs)
uv run genie-ontology run provision
uv run genie-ontology run create_agents
uv run genie-ontology run invoke_agentsOr all three in order:
uv run genie-ontology run alluv run genie-ontology run invoke_agents --question "What was total revenue last quarter by product category?"
uv run genie-ontology run cleanup --confirm DELETE
uv run genie-ontology run truncate --confirm DELETECreate the Databricks workspace
Account-admin credentials in .env: DATABRICKS_ACCOUNT_ID plus DATABRICKS_TOKEN or OAuth client id/secret.
npm run ecommerce:workspace:databricks-setupEach ecommerce:*:databricks-setup command restarts local FastAPI so it always loads current code, then POSTs, then stops the server. No need to start ecommerce:api:run first or Ctrl+C afterward.
That calls POST /api/v1/ontology/provision-workspace and creates or reuses the serverless workspace named ecommerce-genie-ontology. Set DATABRICKS_WORKSPACE_ADMIN_EMAILS in .env (comma-separated) so those account users are assigned workspace ADMIN and can open the UI. The OAuth service principal is also assigned ADMIN; without a human email, only the SP can call APIs and you will see “You do not have permission to access this page”.
Create the SQL warehouse
After the workspace is RUNNING, create a serverless SQL warehouse (PRO + serverless compute, 2X-Small) named ecommerce-genie-ontology:
npm run ecommerce:warehouse:databricks-setupThat restarts FastAPI, POSTs WhReq to /api/v1/ontology/provision-warehouse, then stops the server. The warehouse is found later by name; copying warehouse_id into .env is optional.
Create the catalog, schema, and demo tables
This is the reference-repo provision workflow: CREATE CATALOG / CREATE SCHEMA, star-schema tables, metric views, tags, and pages. Catalog name defaults to ecommerce_genie_ontology (DATABRICKS_CATALOG / DATABRICKS_SCHEMA in .env).
npm run ecommerce:catalog:databricks-setupThat restarts FastAPI, POSTs WfReq { "workflow": "provision" } to /api/v1/ontology/workflows/run, then stops the server.
Drop the catalog
Runs as the service principal (so you do not need MANAGE in the SQL Editor). Drops DATABRICKS_CATALOG with CASCADE and trashes the Genie agent. Workspace, warehouse, and metastore stay.
npm run ecommerce:catalog:databricks-truncateThen recreate with npm run ecommerce:catalog:databricks-setup.
HTTP interface
npm run ecommerce:api:runGET /healthGET /api/v1/ontology/workflowsPOST /api/v1/ontology/workflows/runbody:WfReqPOST /api/v1/ontology/workflows/deploybody:DpReqPOST /api/v1/ontology/provision-workspacebody:PwReqPOST /api/v1/ontology/provision-warehousebody:WhReqPOST /api/v1/ontology/truncatebody:TcReq(confirmmust beDELETE)POST /api/v1/ontology/destroybody:DyReq(confirmmust beDELETE; drops catalog, warehouse, and workspace)POST /api/v1/ontology/oltp/historicalbody:OhReqPOST /api/v1/ontology/oltp/realtimebody:OdReq(count100–10000,year_windowlatest|last_2|last_3|all)POST /api/v1/ontology/etl/historicalbody:EhReqPOST /api/v1/ontology/etl/cdcbody:EcReqGET /api/v1/ontology/fraud/casesPOST /api/v1/ontology/fraud/runbody:FcReq(case_id01–15)GET /api/v1/ontology/fraud/agentsPOST /api/v1/ontology/chatbody:ChReq(backendlanggraph|google_adk|genie)
Historical generate and ETL should run as Databricks jobs (as_job: true, the default) because 15 million orders need Spark. The local process only triggers the job.
MCP: Genie vs this repo
Databricks already hosts MCP for analytics. Point an agent at the workspace Genie space for NL questions over certified dims, facts, and metric views:
{DATABRICKS_HOST}/api/2.0/mcp/genie/{GENIE_SPACE_ID}{DATABRICKS_HOST}/api/2.0/mcp/sql
Do not put generate/CDC tools inside Genie. This repo’s operational MCP is separate: it triggers OLTP generation, CDC ETL, and 15 fraud evidence packs (at most 50 SQL rows). It never loads fact tables into the model.
uv sync --extra mcp
uv run --extra mcp genie-ontology mcpCursor / Claude Desktop stdio config:
{
"mcpServers": {
"ecommerce-oltp": {
"command": "uv",
"args": ["run", "--extra", "mcp", "genie-ontology", "mcp"],
"cwd": "/path/to/Databricks-Genie-Ontology"
}
}
}Tools: list_fraud_cases, list_fraud_agents, run_fraud_case, run_fraud_agent_cases, generate_historical_oltp, generate_realtime_orders, etl_star_historical, etl_star_cdc, query_dataset.
Fraud agents (inside ecommerce_genie_ontology)
FastAPI never imports LangGraph or Google ADK. It calls a facade; the facade invokes that stack.
src/ecommerce_genie_ontology/
agents_langgraph/ # LgFacade → LangGraph StateGraph → MCP tools
facade.py graph.py
agents_google_adk/ # GaFacade → ADK root + 10 sub-agents → MCP tools
facade.py agent.py runtime.pyuv sync --extra agents
# or: uv sync --extra langgraph --extra google-adk --extra mcpPOST /api/v1/ontology/chat with "backend": "langgraph" or "google_adk" or "genie". The 10 Databricks Genie specialists are created by create_agents on the same OLTP + dims/facts.
Run all 15 fraud packs without an LLM:
uv run genie-ontology fraud-agent
uv run genie-ontology fraud-agent --cases 01,02,06
uv run genie-ontology run fraud --case-id 02Context management and graph databases
The agent never sees 15 million orders. Spark/SQL stay in Databricks. Each fraud case is a named query plus a small evidence pack. retail_oltp.entity_link stores 1–2 hop relationships (has_address, shared_address) so you do not need Neo4j for these 15 cases. Add a graph store later only if you need unbounded multi-hop traversal or a live investigation UI.
OLTP and CDC locally (uses .env, talks to Databricks Jobs)
uv run genie-ontology deploy
uv run genie-ontology run generate_historical --as-job --customers 200 --orders-per-year 25000 --years 3
uv run genie-ontology run etl_historical --as-job
uv run genie-ontology run generate_realtime --as-job --count 1000 --year-window latest
uv run genie-ontology run etl_cdc --as-jobRegister and run Databricks Jobs
uv run genie-ontology deploy
uv run genie-ontology run provision --as-job
uv run genie-ontology run create_agents --as-job
uv run genie-ontology run invoke_agents --as-jobdeploy uploads this package plus thin wrapper notebooks to
DATABRICKS_WORKSPACE_PATH and creates or updates the jobs (Genie provision plus OLTP/CDC Spark jobs).
Pages still have no documented public create API. Provision stores the same
content as 05_pages_content.py in <catalog>.<schema>._ontology_pages and
tries the Discover endpoints; publish in the UI if those APIs are unavailable.
Available Tools
9 toolsetl_star_cdcB
Apply Delta change feed from OLTP customer_order into fact_sales (append).
| Name | Required | Description | Default |
|---|---|---|---|
| as_job | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the disclosure burden. It does disclose the append behavior and source/target, but omits side effects, asynchronous job behavior, idempotency, or failure handling.
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?
The description is a single front-loaded sentence with no filler, efficiently conveying source, target, and append mode. It is concise, though this conciseness comes at the cost of behavioral and parameter detail.
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 an ETL write operation with no annotations or output schema, the description is too sparse. It does not explain the meaning of as_job, the relationship to etl_star_historical, or what happens on failures, empty change feeds, or duplicate data.
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 one parameter, as_job, with 0% schema description coverage. The description does not mention or explain this parameter, leaving the agent with only the parameter name and default value as hints.
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 names a specific verb ('Apply'), the exact data source ('Delta change feed from OLTP customer_order'), target ('fact_sales'), and mode ('append'). This clearly distinguishes it from siblings like etl_star_historical and generate_historical_oltp.
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 description implies this is for incremental CDC appends, but it does not explicitly name alternatives, state prerequisites, or describe when not to use it. Usage context is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
etl_star_historicalC
Rebuild star-schema dims and fact_sales from OLTP (overwrite).
| Name | Required | Description | Default |
|---|---|---|---|
| as_job | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose the key destructive trait 'overwrite', which is essential safety information for an agent. However, it omits consequences such as whether tables are dropped/recreated, whether the operation is transactional, and what happens to existing dependent objects.
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?
The description is a single efficient sentence with no filler and the core action front-loaded. It is concise, though the brevity leaves out details that are penalized in other dimensions.
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 destructive ETL tool with no annotations and no output schema, the description is too thin. It leaves the as_job parameter unexplained and does not state expected completion signals, side effects, or the relationship to etl_star_cdc, making confident invocation harder than necessary.
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?
The schema has one boolean parameter 'as_job' with 0% description coverage, and the description does not explain what it controls. The agent cannot know whether setting as_job to false changes execution mode, output, or behavior, so the description fails to compensate for the schema's silence.
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 uses a specific verb ('Rebuild') with a clear resource ('star-schema dims and fact_sales') and source ('from OLTP'), and flags 'overwrite' to signal a full replacement. It does not explicitly differentiate from sibling etl_star_cdc, though the word 'historical' and the rebuild/overwrite language weakly distinguish it as a full load.
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 explicit guidance is given about when to use this tool instead of etl_star_cdc, generate_historical_oltp, or other siblings. An agent must infer from the name and the words 'Rebuild'/'overwrite' that this is a full refresh, but there is no direct statement of intended use or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_historical_oltpC
Write customer, address, order, line, shipment, and entity_link tables.
| Name | Required | Description | Default |
|---|---|---|---|
| as_job | No | ||
| year_count | No | ||
| customer_count | No | ||
| orders_per_year | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It implies mutation via 'Write' but discloses nothing about whether existing data is overwritten, whether execution is synchronous or asynchronous (despite the as_job parameter hinting at job-based execution), or what side effects occur. For a tool that writes multiple tables, this is a significant gap.
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 wasted words - structurally clean. However, this is under-specification rather than effective conciseness: the description omits critical information about parameters and behavior, making it too brief for the tool's complexity.
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?
This is a 4-parameter mutation tool that writes six tables, with no annotations and no output schema. The description is far too thin - it doesn't explain parameter semantics, execution model, data implications, or any context an agent needs to invoke it correctly. Completely inadequate for a tool of this complexity.
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% and the description adds nothing about the 4 parameters. While year_count, customer_count, and orders_per_year are somewhat self-explanatory by name, as_job is ambiguous (job vs synchronous execution) and none of the parameters are explained or contextualized. The description fails to compensate for the complete lack of schema-level parameter documentation.
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 action ('Write') with an enumerated resource list (customer, address, order, line, shipment, entity_link tables). The purpose is clear and concrete. However, differentiation from siblings relies mostly on the tool name ('historical' vs generate_realtime_orders) rather than the description itself, and 'write' is a generic verb that doesn't clarify whether this creates, populates, or overwrites.
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?
Provides no guidance on when to use this tool versus alternatives. Siblings include generate_realtime_orders (similar generation, realtime) and etl_star_historical (ETL for historical data), yet the description gives no selection criteria, prerequisites, or exclusions. An agent must infer usage entirely 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.
generate_realtime_ordersC
Append 100-10000 new OLTP orders. year_window is latest | last_2 | last_3 | all.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| as_job | No | ||
| year_window | No | latest |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and only discloses that it appends orders within a count range and year-window choices. It does not state side effects, persistence, idempotency, what 'as_job' does, or what the caller should expect afterward.
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 deliver the core action, count bounds, and year-window options without wasted words. It loses a point only because omitting as_job is a meaningful structural gap, not because of verbosity.
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 tool with no annotations and no output schema, the description leaves out too much: return behavior, job semantics, prerequisite state, and how this append interacts with historical generation. An agent can make a default call but cannot fully reason about consequences.
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?
The description explains year_window values and indirectly maps '100-10000' to the count parameter, which helps. However, as_job is completely unexplained, and schema coverage is 0%, so the agent cannot derive its meaning from the schema either.
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 uses a specific verb ('Append'), identifies the resource ('new OLTP orders'), and gives a concrete count range, so an agent knows the core action. It does not explicitly contrast with generate_historical_oltp, but the 'realtime' name and year-window options make the intent reasonably distinguishable.
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 about when to use this tool versus generate_historical_oltp, etl_star_cdc, or other siblings. The 'append' semantics hint at real-time ingestion, but the description leaves the selection criteria implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fraud_agentsA
List the 10 Databricks Genie fraud specialists that share OLTP + dims/facts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description needs to convey safety and side effects. It states it returns a list of 10 specialists, which implies a read-only operation, but it doesn't explicitly say it doesn't modify anything. It also doesn't clarify if the list is cached or if it takes time, but since it's a simple list with no params, the behavior is fairly predictable. The description adds some value by noting the shared data model, which hints at the underlying structure.
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?
The description is a single, concise sentence that front-loads the action ('List the 10 Databricks Genie fraud specialists') and adds a relevant detail about their data model. There is no fluff; every word contributes to the meaning. This is an exemplary model of brevity.
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?
Given that there are no parameters and no annotations, the description is nearly complete: it explains what the tool does and provides a key detail about the output (the 10 specialists share OLTP + dims/facts). However, it doesn't describe the output schema (which exists), but since the description doesn't need to repeat what the output schema already holds, this is not a major gap. The description is adequate for a simple listing tool.
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?
The input schema has zero parameters, and the description confirms that by mentioning 'the 10'—the list size is fixed. Since there are no parameters, there's no additional semantic burden; the description fully covers the empty schema. This is a case where the description doesn't need to explain anything, so a high score is appropriate. However, it could be clearer that the list is fixed and no parameters are needed.
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 tells the agent exactly what this tool does: it lists the 10 Databricks Genie fraud specialists, which is a specific, concrete action. It includes the key detail that these specialists share a specific data model (OLTP + dims/facts), which adds useful context. However, it doesn't explicitly differentiate from sibling list_fraud_cases, though the nouns differ (agents vs cases), so the differentiation 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 description implies the use case—when you need an overview of the fraud agents available—but it doesn't explicitly say when to use this instead of list_fraud_cases or run_fraud_agent_cases. The tool has no parameters, so it's a simple listing operation, but no guidance is given on what actions to take with the results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fraud_casesA
List the 15 fraud detection cases. Each case is a named SQL evidence pack.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. 'List' communicates a non-mutating read operation and 'the 15' sets exact scope, but there is no stated behavior about output sorting, freshness, or side effects; this is adequate but minimal for a zero-parameter read 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 compact sentences with the main action front-loaded; every word earns its place and the second sentence adds useful conceptual context.
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 simple zero-parameter listing tool with an output schema present, the description gives the critical extra information: there are exactly 15 cases and each is a named SQL evidence pack. It does not explicitly connect to run_fraud_case for the next action, but that belongs to usage guidance and is not required for invoking this tool.
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?
The input schema is empty and fully covers all parameters (none), so there is no parameter gap for the description to fill. The 0-parameter baseline of 4 is appropriate.
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?
Uses a specific verb ('List') and resource ('fraud detection cases'), and adds the exact count and a definition ('named SQL evidence pack'). This clearly distinguishes it from siblings such as run_fraud_case (executes) and list_fraud_agents (different entity).
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 description implies that this tool is the discovery entry point for the fixed set of fraud cases, and the definition of a case hints that returned names can be used with run_fraud_case. However, it never explicitly states when to choose this tool over alternatives or when not to use it, so guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_datasetA
Run a SELECT against dims, facts, or OLTP. LIMIT 50. Never dumps full tables.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that only SELECT operations are run, that results are capped at 50 rows, and that full-table dumps are forbidden. This is meaningful behavioral context for a read-only query tool, though it does not mention auth, errors, or return shape.
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 with no filler. The key constraints are front-loaded and every word adds value. This is an efficient, well-structured description.
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 one-parameter query tool, the description is mostly complete: it states the operation, allowed data sources, row limit, and guarding behavior. It lacks an explicit statement about return format or output structure, but no output schema exists and the tool's purpose strongly implies a row result set.
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?
The input schema describes the single 'sql' parameter only by name and type, with 0% description coverage. The tool description compensates somewhat by clarifying that the SQL must be a SELECT and that the result set is limited to 50 rows. However, it does not explain SQL formatting, table qualification, or statement restrictions beyond SELECT.
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 specific verb and resource: 'Run a SELECT against dims, facts, or OLTP.' It also adds a concrete constraint, LIMIT 50, making the tool's purpose unmistakable. It clearly differentiates from the ETL/generation/fraud-case siblings by being the only direct query tool.
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 description gives clear context: this is for SELECT queries against dims, facts, or OLTP, with a 50-row limit. It does not explicitly name alternatives or state when not to use it, but the scope is clear enough for an agent to select it appropriately among the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_fraud_agent_casesC
Run every evidence pack owned by one of the 10 fraud specialists.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It says 'Run' without explaining whether this starts long-running jobs, writes data, returns results, or has side effects on the evidence packs. For an action-oriented tool, this is a significant transparency gap.
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?
The description is a single, front-loaded sentence. It uses no filler and every word contributes to describing what the tool does.
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 side-effecting 'run' tool with no annotations, no output schema, and minimal parameter explanation, the definition is incomplete. It communicates the high-level intent but lacks context about effects, output/return behavior, and how to discover the supported fraud specialist IDs.
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?
The schema provides no description for agent_id, and schema coverage is 0%, so the description must compensate. The phrase 'one of the 10 fraud specialists' gives some semantic meaning to agent_id, but it does not explain how to obtain valid IDs or connect this to list_fraud_agents.
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 uses a specific verb ('Run') and resource ('evidence pack'), and the plural 'every' distinguishes it from the sibling run_fraud_case, which implies a single case. The scope is clear: all evidence packs owned by one of the 10 fraud specialists. It lacks an explicit contrast with sibling tools, but the distinction is recoverable.
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 tool versus run_fraud_case, list_fraud_cases, or list_fraud_agents. The description implies a batch operation for a specialist, but it does not state prerequisites, exclusions, or how to choose among alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_fraud_caseB
Run one fraud case (ids 01-15). Returns at most 50 evidence rows.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing behavior. It does reveal a key behavioral trait: the tool returns at most 50 evidence rows, which is useful for setting agent expectations. However, it does not mention side effects (e.g., whether running a case performs writes or triggers external actions), which is a gap for a mutation-like 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?
The description is extremely concise—two short sentences, no filler. It front-loads the core action and then adds the crucial output limit. Every word earns its place.
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?
Given the tool's simplicity (single parameter, no output schema, no nested objects), the description is nearly sufficient but falls short in parameter guidance and side-effect disclosure. The 50-row limit is good context, but the lack of case_id explanation and any indication of write behavior leaves minor gaps.
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?
The input schema only has a case_id string with no description, and the schema description coverage is 0%. The description does not explain what case_id should be (e.g., the format, the allowed range 01-15, or how to obtain valid IDs). Since the schema provides no help, the description fails to compensate, leaving the agent guessing.
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 specific verb ('run') and resource ('fraud case'), and clarifies that it handles one case at a time (ids 01-15). This is clear enough to distinguish from sibling tools like list_fraud_cases, though it doesn't explicitly name them.
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 description implies when to use it: when you need to execute a specific fraud case. However, it does not explicitly say when not to use it or mention alternatives like list_fraud_cases for listing, or run_fraud_agent_cases for running multiple cases. The single-case scope is a mild hint but not a full routing guide.
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.
9 tool updates
v0.1.0- First observed
etl_star_cdc - First observed
etl_star_historical - First observed
generate_historical_oltp - First observed
generate_realtime_orders - First observed
list_fraud_agents - First observed
list_fraud_cases - First observed
query_dataset - First observed
run_fraud_agent_cases - First observed
run_fraud_case
TDQS
Scored across 9 tools
Most tools have clearly distinct roles: generation, ETL, fraud case listing/execution, and querying. The main ambiguity is between run_fraud_case and run_fraud_agent_cases, but their descriptions clarify single-case versus agent-owned case batches.
All tool names follow a consistent snake_case verb_noun pattern, with recognizable prefixes like run_, list_, generate_, etl_star_, and query_. This makes the tool surface predictable and easy to navigate.
Nine tools is a well-scoped size for this server's purpose. Each tool covers a distinct phase of the workflow—data generation, ETL, fraud case evaluation, and querying—without unnecessary redundancy.
The core lifecycle of generating OLTP data, building star-schema artifacts, running fraud cases, and querying results is well covered. Minor gaps include the lack of explicit schema/reset management or direct row-level CRUD, but agents can work around these using query_dataset and generation tools.
Maintenance
Related MCP Connectors
Your Databricks Lakehouse in natural language: run SQL on your SQL warehouses, track long-running qu
Inspect scheduled jobs, runs, durable workflows, and webhook health; run one confirmed job.
List reverse-ETL sources, destinations, models, syncs and runs; trigger syncs into SaaS tools.
Agentic commerce gateway: discovery, search, checkout across Shopify/Woo/Odoo/PrestaShop.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to explore and query a mock e-commerce store's data including customers, products, inventory, and orders through conversational interactions backed by PostgreSQL.-
- FlicenseNot gradedqualityDmaintenanceEnables simulating customer orders from a dummy restaurant menu and tracking their status in real-time via RESTful APIs.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to investigate and safely resolve commerce order exceptions, such as expired inventory reservations, by providing a workflow across synthetic order, payment, inventory, and fulfillment systems.-
- FlicenseNot gradedqualityCmaintenanceProvides deterministic mock customer health, product usage, and recommended playbook data via three MCP tools for a Customer Success Orchestrator demo.-