cubrid-mcp-server
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., "@cubrid-mcp-servershow me the schema for the orders table"
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.
cubrid-mcp-server
A Model Context Protocol server for CUBRID, enabling LLMs to safely inspect schemas and execute read-only queries via pycubrid.
Features
Tool | Description |
| List every user table in the database |
| Substring search over table names |
| Column types, nullability, defaults, and primary key info |
| Full metadata: columns, primary key, and indexes in one call |
| Indexes for a table with key columns and flags |
| Execution plan/trace for a |
|
|
| CUBRID |
| CUBRID |
| Run read-only SQL with automatic output truncation |
| Verify database connectivity on demand |
| Run a single |
Resources
Schema metadata is also exposed as read-only MCP Resources, so clients can discover and read schema context without a tool call. Resources reuse the same read-only catalog queries as the tools — no additional data access or write surface.
Resource URI | Description |
| CUBRID agent guide: dialect, types, performance |
| 4 topic guides: sql-dialect, types, performance, collections |
| Whole-schema index: every user table with its per-table resource URI |
| Per-table metadata (columns, primary key, indexes) — mirrors |
Both return application/json. Table names in {table} are percent-decoded by URI-template matching; an unknown or system table produces a resource-read error, matching the describe_table tool.
Related MCP server: MCP MySQL Server
Prompts
The server also exposes a small set of MCP Prompt templates — reusable, guided
starting points for common inspection tasks. Prompts are guidance-only: each one
returns text that tells the client which of the existing read-only tools to call and
in what order. They never touch the database, execute SQL, or add any new data-access
surface, and any argument you pass is fenced and treated strictly as untrusted data.
The prompts are advisory templates only — the actual read-only enforcement remains in
the underlying tools (execute_query/explain_query via safety.py).
Prompt | Arguments | Description |
|
| Describe a table, then sample it with a bounded read-only query |
|
| Obtain and interpret a |
| (none) | Build a high-level overview of the whole schema from the read-only tools |
|
| Review a table's index coverage for potential review areas |
Quick Start
Configure
Set the required environment variables:
export CUBRID_HOST=localhost
export CUBRID_PORT=33000 # optional, default: 33000
export CUBRID_USER=readonly_user # a CUBRID user with SELECT-only grants (see Security)
export CUBRID_PASSWORD=secret
export CUBRID_DATABASE=mydbOptional settings:
Variable | Default | Description |
|
| Enforce read-only SQL whitelist |
|
| Max characters in query output |
|
| Max rows returned by |
|
| Max length (characters) of a submitted SQL statement |
|
| Per-statement socket read timeout in seconds. If the server sends no data within this window the query is aborted and the connection is reset. This is a socket read timeout, not a true server-side statement timeout. |
|
| Opt-in audit logging. When enabled, emits one redaction-safe JSON record per executed statement ( |
|
| Opt-in write mode. When enabled ( |
Multiple connections
By default the bare CUBRID_* variables define a single connection named default.
You can serve additional CUBRID databases from the same process by listing extra
connection names in CUBRID_CONNECTIONS (comma-separated) and providing
CUBRID_<NAME>_* variables for each. Every tool accepts an optional connection
argument selecting which connection to target; omitting it (or passing default)
uses the bare-variable connection, so existing single-database setups are unchanged.
# Default connection (unchanged)
export CUBRID_HOST=localhost
export CUBRID_USER=readonly_user
export CUBRID_PASSWORD=secret
export CUBRID_DATABASE=mydb
# Additional named connections
export CUBRID_CONNECTIONS=reporting,analytics
export CUBRID_REPORTING_HOST=reporting-db
export CUBRID_REPORTING_USER=readonly_user
export CUBRID_REPORTING_PASSWORD=secret
export CUBRID_REPORTING_DATABASE=reports
export CUBRID_REPORTING_MCP_MAX_ROWS=500 # optional per-connection tuning
export CUBRID_ANALYTICS_HOST=analytics-db
export CUBRID_ANALYTICS_USER=readonly_user
export CUBRID_ANALYTICS_PASSWORD=secret
export CUBRID_ANALYTICS_DATABASE=analyticsNotes:
Connection names must match
[A-Za-z0-9_]+and are matched case-insensitively.defaultis reserved (it always comes from the bareCUBRID_*variables) and cannot appear inCUBRID_CONNECTIONS.For a named connection
<NAME>, connection fields live atCUBRID_<NAME>_HOSTetc. and the optional MCP tuning knobs atCUBRID_<NAME>_MCP_*(same suffixes as the global ones). Named connections do not inherit values from the bare vars.Selecting an unknown connection returns a clear error listing the available names.
Each connection has its own read-only enforcement, so a named connection can set
CUBRID_<NAME>_MCP_READONLYindependently of the default.
Run
Run from PyPI
Use uvx to run directly from PyPI:
uvx cubrid-mcp-serverOr with pipx:
pipx run cubrid-mcp-serverRun from source
git clone https://github.com/cubrid-lab/cubrid-mcp-server.git
cd cubrid-mcp-server
python -m venv .venv && source .venv/bin/activate
pip install -e .
cubrid-mcp-serverMCP Client Integration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"cubrid": {
"command": "uvx",
"args": ["cubrid-mcp-server"],
"env": {
"CUBRID_HOST": "localhost",
"CUBRID_USER": "readonly_user",
"CUBRID_PASSWORD": "secret",
"CUBRID_DATABASE": "mydb"
}
}
}
}Claude Code
Add to .mcp.json in your project root:
{
"mcpServers": {
"cubrid": {
"command": "uvx",
"args": ["cubrid-mcp-server"],
"env": {
"CUBRID_HOST": "localhost",
"CUBRID_USER": "readonly_user",
"CUBRID_PASSWORD": "secret",
"CUBRID_DATABASE": "mydb"
}
}
}
}Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"cubrid": {
"command": "uvx",
"args": ["cubrid-mcp-server"],
"env": {
"CUBRID_HOST": "localhost",
"CUBRID_USER": "readonly_user",
"CUBRID_PASSWORD": "secret",
"CUBRID_DATABASE": "mydb"
}
}
}
}Security
The server is read-only by default. A code-level SQL whitelist allows only SELECT, SHOW, DESC, DESCRIBE, EXPLAIN, and WITH statements. Multi-statement queries are rejected.
The SQL whitelist is defense-in-depth, not a security boundary. It is a non-validating parser-based guardrail against obvious mistakes. The real enforcement layer is the database itself: always run the server as a CUBRID user that has only
SELECTgrants on the tables the model may read. SeeSECURITY.md.
For production use, also configure a read-only database user. See SECURITY.md for the recommended setup.
Write mode (opt-in)
Write access is disabled by default. Setting CUBRID_MCP_WRITE=1 registers an additional execute_write tool that accepts a single INSERT, UPDATE, or DELETE statement and runs it in an explicit transaction (commit on success, rollback on any error). When write mode is off the tool is not registered at all, so no write path is exposed in MCP capability discovery. With multiple connections configured, the tool is registered when any connection enables writes (via CUBRID_MCP_WRITE or CUBRID_<NAME>_MCP_WRITE).
Constraints and rationale:
Single-statement DML only. Standalone reads, DDL (
CREATE/ALTER/DROP/TRUNCATE), transaction-control, and multi-statement input are rejected. (A single DML statement may still legally contain subqueries, e.g.INSERT ... SELECT.)DDL is intentionally unsupported. CUBRID auto-commits DDL, which defeats the rollback guarantee, so it is excluded from write mode.
Write mode is per-connection.
execute_writeaccepts the same optionalconnectionargument as the read tools and runs against that connection; a connection whoseCUBRID_<NAME>_MCP_WRITEis off refuses the write even when another connection enables it.execute_queryremains read-only regardless of the write-mode flag.Enforcement is defense-in-depth; still run the server as a CUBRID user granted only the privileges it needs. See
SECURITY.md.
Logging
The server speaks the MCP stdio transport, where stdout carries the JSON-RPC protocol stream. Anything written to stdout by the server or its dependencies will corrupt that stream and break the client connection. For this reason all logging is routed to stderr, and you should keep it that way: when adding custom logging or diagnostics, never print() to stdout — use the standard logging module (which is configured to emit on stderr) or write to stderr explicitly. The log level defaults to INFO.
Errors surfaced back to the LLM client are sanitized: only the exception category (e.g. query failed: OperationalError) is returned, while the full exception detail is logged to stderr for operators. This keeps schema details, hostnames, SQL fragments, and configuration values out of client-visible messages.
Audit logging (opt-in)
Set CUBRID_MCP_AUDIT_LOG=1 to record every executed statement (execute_query, explain_query, and execute_write) as a single structured JSON line on stderr. It is off by default and honoured per connection — a named connection sets CUBRID_<NAME>_MCP_AUDIT_LOG independently of the default. Each record is redaction-safe and contains only:
Field | Description |
| The MCP tool that ran the statement ( |
|
|
| The leading SQL keyword only (e.g. |
| Table names extracted after |
| Length of the submitted SQL, in characters. |
| Result size and whether output was truncated (success only). |
| Wall-clock duration of the call, in integer milliseconds. |
| On failure, the exception class name only (via the same sanitization as client-facing errors). |
The raw SQL text, bound parameters, and literal values are never logged, so secrets embedded in a query (e.g. WHERE token = '...') do not reach the audit stream. Records go to stderr only and never to stdout.
Development
git clone https://github.com/cubrid-lab/cubrid-mcp-server.git
cd cubrid-mcp-server
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
# Lint & type check
ruff check .
mypy cubrid_mcp_server
# Unit tests
pytest -m "not integration"
# Integration tests (requires running CUBRID)
export CUBRID_HOST=localhost CUBRID_USER=dba CUBRID_PASSWORD="" CUBRID_DATABASE=demodb
pytest -m integrationRelated Projects
pycubrid — Pure-Python DB-API 2.0 driver this server is built on
sqlalchemy-cubrid — SQLAlchemy 2.0–2.2 dialect for CUBRID
cubrid-cookbook-python — 68 runnable examples incl. one-command app templates that use this stack
Disclaimer
This project is part of CUBRID Lab, an independent open-source initiative for CUBRID developer tooling, and is not affiliated with, sponsored by, or endorsed by CUBRID Corporation or the official CUBRID project.
License
MIT (see LICENSE).
Available Tools
11 toolsall_table_namesAll Table NamesB
Return every user table in the connected CUBRID database.
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No |
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 full behavioral disclosure burden. It clearly signals a read-only operation with 'Return' and specifies user tables only. However, it does not mention potential performance implications of returning every table, or behavior when the connection parameter is null.
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 sentence that immediately states the operation and scope with zero filler. It is perfectly concise and front-loaded.
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 is simple, one optional parameter, and an output schema exists, the description covers the primary purpose. However, it omits any guidance on the connection parameter or prerequisites, leaving a small but relevant gap for correct 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?
The input schema has 0% description coverage for the only parameter, 'connection', and the description only mentions 'the connected database' without explaining how the parameter is used, its default behavior, or what happens if null. The description fails to compensate for the parameter's missing schema 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?
The description states a specific verb ('Return'), a specific resource ('every user table'), and a clear scope ('the connected CUBRID database'). This distinguishes the tool from siblings like filter_table_names, which implies a filtered subset, and schema_definitions, which covers table structure.
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 tool is used when you need the full list of user tables, but it does not explicitly state when to prefer it over alternatives like filter_table_names or schema_definitions. No exclusions or alternative conditions are provided; usage is inferred rather than directly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableDescribe TableA
Return full metadata for table_name: columns, primary key, and indexes.
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No | ||
| table_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It implies a read-only operation by saying 'Return full metadata', which suggests no side effects. However, it does not disclose potential errors (e.g., missing table), permission requirements, or performance implications. The description is simple and likely safe, but lacks explicit safety statements.
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 that front-loads the action and specifies the exact metadata returned. No filler or redundant phrasing.
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 an output schema exists (so return format is defined), the description is largely complete for a metadata-retrieval tool. It specifies the key output elements (columns, primary key, indexes). The main gap is lack of guidance on the 'connection' parameter and any error conditions, but these are secondary given the tool's simplicity.
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 clarifies that table_name is the target table, adding meaning beyond the bare schema. However, the optional 'connection' parameter is not explained at all, and with schema coverage at 0% (meaning no parameter descriptions in the schema), the description only partially compensates. It gives context for one of two parameters but leaves the other 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 specific verb ('Return'), a resource ('metadata for table_name'), and enumerates the exact content (columns, primary key, indexes). This clearly distinguishes it from siblings like list_indexes (which only returns indexes) and schema_definitions (which likely covers broader schema).
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 no guidance on when to use this tool versus its siblings. It does not mention alternatives, exclusions, or conditions that would make this the preferred choice. The reader must infer that full metadata is desired, but no explicit routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_queryExecute QueryA
Execute a read-only SQL statement and return rows, truncated if large.
CUBRID SQL notes: prefer LIMIT n OFFSET m (comma form also works); no RETURNING clause; collection types (SET, MULTISET, SEQUENCE) may appear in results — see cubrid://guide/types for interpretation.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| connection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden and does so well: it explicitly says read-only, warns that rows are truncated if large, and discloses CUBRID dialect constraints such as LIMIT/OFFSET preference, no RETURNING, and possible collection types. This goes beyond what the structured schema provides.
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 compact: one front-loaded sentence stating behavior, followed by a concise block of CUBRID caveats. Every sentence adds practical information and there is no padding.
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?
An output schema exists, so return values need no prose, and the description covers read-only semantics, truncation, and dialect quirks. It is slightly incomplete because the connection parameter and the exact truncation threshold are left undefined, and it does not route the agent between query execution and query explanation.
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. It adds meaningful dialect detail for the sql parameter, but it does not explain the connection parameter or how truncation interacts with returned rows. The compensation is partial rather than complete.
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 opening sentence names a specific action and resource: execute a read-only SQL statement and return rows. This clearly distinguishes the tool from the sibling metadata and explain utilities, even though no sibling names are mentioned.
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 tool is for read-only, free-form SQL querying and provides CUBRID-specific syntax guidance, but it never states when to prefer this over explain_query or the metadata tools. No explicit exclusions or alternative routing are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_queryExplain QueryA
Return CUBRID's execution plan/trace for a SELECT or WITH statement.
CUBRID uses SHOW TRACE (not standard EXPLAIN). Look for SEQ SCAN in the output — it indicates a full table scan that may benefit from an index. See cubrid://guide/performance for interpretation tips.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| connection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden. It usefully discloses that CUBRID uses SHOW TRACE rather than standard EXPLAIN and explains the significance of SEQ SCAN in the output. It could go further by explicitly stating whether the statement is actually executed or whether any side effects occur, but the SELECT/WITH restriction implies a read-only plan/trace operation.
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 compact and front-loaded, with three sentences that each add value: the core purpose, the CUBRID-specific SHOW TRACE caveat, and a practical output interpretation tip. There is no filler or repetition of schema details.
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?
The description covers the tool's core purpose, supported statement types, CUBRID's nonstandard behavior, output interpretation, and a pointer to further interpretation guidance. Given the output schema exists and parameters are simple, this is mostly complete, though the connection parameter lacks explanation and read-only/safety behavior is only implied.
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 for the parameters. It adds a meaningful semantic constraint on "sql" by requiring a SELECT or WITH statement, but it does not explain the optional "connection" parameter at all, leaving some ambiguity about its purpose and behavior.
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 opens with a specific verb and resource: "Return CUBRID's execution plan/trace" for a SELECT or WITH statement. This clearly identifies what the tool does and distinguishes it from siblings like execute_query by focusing on plans rather than execution results.
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 for use: it is for SELECT or WITH statements and for inspecting execution plans, with guidance to look for SEQ SCAN as a potential index opportunity. It does not explicitly mention which sibling tools to use instead, so it stops short of a full when-to-use/when-not-to-use guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_table_namesFilter Table NamesA
Return user tables whose name contains substring (case-insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| substring | Yes | ||
| connection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 behavioral disclosure. It clearly conveys a read-only return operation, substring matching, and case-insensitivity. It omits edge cases like empty results or connection behavior, but for a simple read-only filter this is largely sufficient.
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, tightly scoped sentence with no filler or redundant phrasing. The core action and filtering rule are front-loaded, and every word contributes to the tool's meaning.
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 low parameter count and presence of an output schema, the description covers the essential call contract well. The main gaps are the lack of explicit routing guidance versus all_table_names and no explanation of connection, but these are minor given the tool's simplicity.
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 add meaning to the parameters. It does explain substring semantics (contains, case-insensitive), but it says nothing about the connection parameter, leaving one of the two parameters without additional explanation beyond the schema types.
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 ('Return'), names the resource ('user tables'), and states the exact filtering criterion (name contains substring, case-insensitive). This clearly distinguishes it from siblings like all_table_names, which presumably return all tables without filtering.
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 the tool—when a filtered subset of table names is needed—but it does not explicitly compare against alternatives such as all_table_names or state when not to use it. An agent can infer the usage context, but the guidance is not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkHealth CheckB
Check database connectivity on demand and report server status.
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 only says 'on demand' and 'report server status', but does not state whether the tool modifies anything, requires special permissions, makes network calls, or what side effects (if any) occur. For a diagnostic tool, lack of explicit read-only or safety disclosure is a 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 efficient and to the point, with no wasted words. It front-loads the core purpose. However, it could be slightly more structured by explaining the parameter, but as a standalone sentence it is concise and clear.
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 has one optional parameter and no annotations, the description should at least explain the 'connection' parameter and whether the tool is read-only or has side effects. The description covers the overall function but is incomplete for a tool that has an output schema (which we don't see) and needs behavioral context. An agent might not know how to provide the connection or what to expect.
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%, meaning the input schema provides no descriptions. The description does not mention the 'connection' parameter at all, leaving its purpose and format unexplained. With low coverage, the description should compensate, but it fails to add any parameter semantics.
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 clearly states a specific verb (check) and resource (database connectivity) and also adds reporting server status. This distinguishes it from sibling tools that deal with tables, schemas, queries, etc. It's unambiguous and immediately understandable.
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 purpose implies when to use it (for connectivity/status checks), but there is no explicit guidance on when not to use it or how it compares to alternatives. The description does not mention any sibling tools or exclusions, leaving usage mostly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_class_hierarchyList Class HierarchyC
Return CUBRID CLASS inheritance relationships (all classes or one class).
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No | ||
| table_name | No |
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 full responsibility for disclosing behavior. It only says 'Return', implying a read operation, but does not mention whether a connection is required, any error conditions, or the nature of the output (even though an output schema exists). No side effects or performance traits are disclosed.
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 with no redundant words. It front-loads the core purpose. However, it is perhaps too brief, sacrificing necessary detail for 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 no annotations, zero schema description coverage, and an output schema that exists, the description should provide more context. It lacks explanation of what 'class' means in CUBRID, what the output looks like, and any usage scenarios. An agent without domain expertise would struggle to invoke it correctly.
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 explain the parameters. It indirectly clarifies table_name (all vs. one class) but gives no explanation for connection. It does not state that both parameters are optional or provide any syntax or type details. The added value is minimal.
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 clearly states the action (Return) and the resource (CUBRID CLASS inheritance relationships), and distinguishes scope ('all classes or one class'). While it does not explicitly name sibling tools, the purpose is specific enough to differentiate from tools like describe_table or schema_definitions.
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 guidance is given on when to use this tool versus alternatives. The mention of 'all classes or one class' hints at the table_name parameter but does not provide context such as prerequisites or scenarios. There is no exclusion of 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.
list_indexesList IndexesC
Return indexes for table_name with their key columns and flags.
CUBRID supports index hints: USE INDEX (idx_name), FORCE INDEX, USING INDEX. See cubrid://guide/performance for hint usage.
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No | ||
| table_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states that indexes are returned with key columns and flags, but does not mention any side effects, permission requirements, error behavior, or whether it is a read-only operation. The hint usage note is not about the tool's behavior but about CUBRID SQL features.
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 core purpose is stated in one concise, front-loaded sentence. However, the second sentence about index hints and a guide link is tangential, diluting focus. It is not verbose, but the extra information is not directly relevant to the tool's primary function.
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 an output schema exists (which likely describes the return format), the description does not need to explain return values. However, it lacks any mention of the optional connection parameter, usage conditions, or edge cases. For a simple list operation it is minimally adequate, but not complete.
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. It explains 'table_name' by referencing it in the purpose, but the 'connection' parameter is entirely undocumented. With a 0% coverage baseline, leaving one of two parameters unexplained is a significant gap.
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 clearly states the action ('Return indexes'), the resource ('for ``table_name``'), and the output content ('key columns and flags'). It is specific and unambiguous, and the resource distinguishes it from sibling tools like describe_table and schema_definitions.
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 provides no guidance on when to use this tool versus alternatives. It does not mention any selection criteria, exclusions, or prerequisites. The mention of index hints and a performance guide is tangential and does not explain when to choose list_indexes over describe_table or explain_query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_serialsList SerialsC
Return CUBRID SERIAL sequences with current value, increment, and bounds.
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool 'returns' data, which implies a read operation, but it does not explicitly confirm read-only behavior, disclose any side effects, authorization requirements, or performance implications. The information is minimal and does not go beyond stating the output content.
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, focused sentence that immediately states the action and the returned data. It is front-loaded with the verb and resource, contains no filler or redundant phrasing, and is appropriately sized for the tool's simplicity.
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?
The tool is simple (one optional parameter, likely an output schema exists), but the description still fails to explain the sole parameter or any usage context. It does not mention how to specify the connection, what happens if it is omitted, or any prerequisites. The output schema may cover return values, but the parameter semantics and usage are left unexplained, making the description insufficient for correct 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% for the single 'connection' parameter, and the tool description does not mention it at all. An agent has no idea what value to provide for this parameter or whether it is required to specify a database connection. The description adds zero meaning beyond the bare type definition.
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 clearly states the tool returns CUBRID SERIAL sequences with specific attributes (current value, increment, bounds). This is a specific verb-resource combination that distinguishes it from sibling tools like list_indexes, describe_table, or table_row_counts, which deal with different database objects.
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 provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, exclusions, or situations where this tool is preferred over siblings like execute_query or schema_definitions. The agent is left to infer that it should be used when serial information is needed, but no explicit direction is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_definitionsSchema DefinitionsB
Return column metadata for table_name: name, type, nullability, default, PK flag.
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No | ||
| table_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It does disclose the output contract by listing the returned metadata fields, and 'Return' implies a read-only operation. However, it does not describe behavior for missing tables, connection handling, or whether results are live or cached.
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 that front-loads the action and resource, then lists the exact returned fields with no filler or redundant phrasing. Every word contributes useful information.
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 two-parameter metadata tool with an output schema, the basic call is understandable. But the optional connection parameter is left unexplained and there is no guidance for selecting this tool over the many schema-related siblings, so an agent could still misuse it or pick a sibling.
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. It gives meaning to table_name as the target table, but the connection parameter is completely unexplained in both the schema and the description. Only one of two parameters receives any semantic clarification.
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?
Describes a specific action ('Return column metadata for table_name') and enumerates the returned fields: name, type, nullability, default, PK flag. It is clear on its own but does not differentiate from schema-related siblings like describe_table or list_indexes.
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 guidance is given about when to use this tool versus describe_table, list_indexes, all_table_names, or other schema-related siblings. The intended usage is only implied by the description; no exclusions, prerequisites, or alternative routing are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
table_row_countsTable Row CountsA
Return COUNT(*) for each table (all user tables by default, capped).
| Name | Required | Description | Default |
|---|---|---|---|
| connection | No | ||
| table_names | No |
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 burden of behavioral disclosure. It states the operation, default target scope, and a cap. This gives useful transparency, though the exact meaning of 'capped' is left vague.
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. Every word contributes meaning.
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?
The core behavior is clear enough for a simple two-parameter tool with an output schema, but the connection parameter is entirely undocumented and the cap is unspecified. Missing these details leaves the agent with ambiguity about scope and limits.
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 for both parameters. It says 'all user tables by default,' which hints at the optional table_names behavior, but it does not explicitly explain table_names or connection at all. This is a significant gap.
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: return COUNT(*) for each table. It also clarifies the default scope (all user tables) and the cap, which distinguishes it from sibling tools like execute_query and describe_table.
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 purpose implies when to use this tool, but there is no explicit guidance about when not to use it or which sibling to prefer. Given the set of table inspection tools, the description does not help an agent route between them beyond the obvious row-count intent.
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.
11 tool updates
v0.1.0- First observed
all_table_names - First observed
describe_table - First observed
execute_query - First observed
explain_query - First observed
filter_table_names - First observed
health_check - First observed
list_class_hierarchy - First observed
list_indexes - First observed
list_serials - First observed
schema_definitions - First observed
table_row_counts
TDQS
Scored across 11 tools
Each tool has a distinct primary purpose, but schema_definitions and describe_table overlap on column metadata, and describe_table also overlaps with list_indexes on index information. Agents could initially confuse schema_definitions with describe_table, though the descriptions clarify the difference.
Names are readable and mostly snake_case, but conventions are mixed: verb-led names (filter_table_names, describe_table, list_indexes, execute_query) coexist with noun-led names (all_table_names, schema_definitions, table_row_counts, health_check). A uniform verb_noun pattern would improve predictability.
Eleven tools is well within the ideal range for a database introspection server. Each tool addresses a distinct need—discovery, schema, indexes, query planning, execution, and health—without feeling bloated or sparse.
The surface covers table discovery, schema/index metadata, row counts, serials, class hierarchy, query execution, and plan tracing—strong coverage for read-only CUBRID introspection. Minor gaps like foreign-key metadata or object-level DDL are absent but can be worked around via execute_query.
Maintenance
Related MCP Connectors
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Deterministic safety, correctness & cost gate that vets Postgres SQL before your AI agent runs it.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables LLMs to interact with MySQL databases by inspecting schemas and executing safe, read-only queries within transactions.6 npm10MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to safely query MySQL databases with read-only access by default, supporting table listing, structure inspection, and SQL queries with optional write operation control.16 npmMIT
- AlicenseAqualityCmaintenanceEnables AI assistants to inspect and query a MySQL database through safe, structured tools, including schema discovery and read-only queries.9130 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to safely interact with MySQL/MariaDB databases, supporting read-only queries by default with optional write operations and access control.8MIT