multi-monetdb-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., "@multi-monetdb-mcp-serverlist my MonetDB databases and show the schema of the analytics one"
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.
multi-monetdb-mcp-server
One MCP server for all your MonetDB databases.
A companion to multi-postgres-mcp-server, built for MonetDB column-store databases.
Documentation
Document | Audience | Contents |
AI agents & developers | Tool call sequences, decision flow, examples | |
Operators | Config file template | |
This README | Setup | Install, Cursor config, environment restriction |
Related MCP server: Database Auditor MCP
Features
One server for all MonetDB databases
Config file with named labels (
analytics,staging, …)Dynamic connect — user provides credentials at runtime via
mdb_connectHot reload — config changes apply within ~5 seconds, no restart
--labelfilter — expose only one database per Cursor project--no-dynamic— block runtimemdb_connectfor locked-down projectsRead-only by default — writes blocked unless
readOnly: false
Two connection modes
Always call mdb_list_databases first — it tells the AI which mode applies.
Mode | When | How |
A — Config label | DB defined in |
|
B — Dynamic | User gives credentials in chat |
|
See USAGE.md for full examples and AI workflow.
Quick Start
1. Install & build
cd multi-monetdb-mcp-server
npm install
npm run build2. Add to Cursor
Global or project .cursor/mcp.json:
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": ["C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js"]
}
}
}3. First use
Ask the AI to call mdb_list_databases. It will show config labels or guide you through mdb_connect.
Restricting access per project (Cursor)
When multiple environments exist (production, staging, dev), you can limit what the AI sees per Cursor project using .cursor/mcp.json in each project folder.
Option 1: --label (single database from shared config)
One global ~/.mcp-monetdb/config.json holds all environments. Each project exposes only its label:
~/.mcp-monetdb/config.json (shared):
{
"connections": [
{ "label": "production", "host": "prod.db.com", "port": 50000, "user": "ro", "password": "...", "database": "warehouse", "readOnly": true },
{ "label": "staging", "host": "stg.db.com", "port": 50000, "user": "dev", "password": "...", "database": "warehouse", "readOnly": true },
{ "label": "local", "host": "localhost", "port": 50000, "user": "monetdb", "password": "monetdb", "database": "demo", "readOnly": false }
]
}Project A — .cursor/mcp.json (production only):
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": [
"C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js",
"--label",
"production"
]
}
}
}Project B — .cursor/mcp.json (staging only):
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": [
"C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js",
"--label",
"staging"
]
}
}
}Effect:
mdb_list_databasesshows only the filtered labelAI cannot see other environment names
AI uses
database="production"(or"staging") on tool calls
Option 2: Project-specific config file
Each project has its own config with only the connections it needs:
Project A — .cursor/mcp.json:
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": [
"C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js",
"--config",
"C:/Projects/ProjectA/.cursor/monetdb.json"
]
}
}
}ProjectA/.cursor/monetdb.json:
{
"connections": [
{
"label": "production",
"host": "prod.db.com",
"port": 50000,
"user": "readonly",
"password": "secret",
"database": "warehouse",
"readOnly": true
}
]
}Effect:
Other environments are not in the file at all
No
--labelneeded — only one connection existsBest for strongest isolation between teams/projects
Option 3: --no-dynamic (block runtime credentials)
Prevent the AI from calling mdb_connect with arbitrary credentials. Use with --label or a project config:
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": [
"C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js",
"--label",
"production",
"--no-dynamic"
]
}
}
}Effect:
mdb_connectis rejected — config labels onlyUser cannot bypass restriction by pasting credentials in chat
Recommended for production-facing projects
Option 4: Combine all restrictions (recommended for production)
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": [
"C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js",
"--config",
"C:/Projects/MyApp/.cursor/monetdb.json",
"--label",
"production",
"--no-dynamic"
]
}
}
}Restriction summary
Flag / setting | What it restricts |
| Only one config label visible to AI |
| Which config file to load (project-specific) |
| Blocks |
| Blocks INSERT/UPDATE/DELETE/DROP in SQL |
| Hides a connection from shared config (soft disable) |
Custom config via environment variable
Alternative to --config in args:
{
"mcpServers": {
"monetdb": {
"command": "node",
"args": ["C:/Code/MCPServer/multi-monetdb-mcp-server/dist/index.js", "--label", "staging"],
"env": {
"MCP_MONETDB_CONFIG": "C:/Projects/MyApp/.cursor/monetdb.json"
}
}
}
}Default config path: ~/.mcp-monetdb/config.json
Config file reference
{
"connections": [
{
"label": "analytics",
"host": "db.example.com",
"port": 50000,
"user": "readonly_user",
"password": "secret",
"database": "analytics",
"enabled": true,
"readOnly": true
}
]
}Field | Default | Description |
| (required) | Name used as |
| — | MonetDB server hostname |
|
| MAPI port |
| — | Username |
|
| Password |
| — | Database name |
| — | Full MAPI URL (alternative to host/user/password/database) |
|
| Set |
|
| Block write queries |
|
| Connection timeout (ms) |
Environment variable substitution in config values:
{ "password": "${MONETDB_PASSWORD:-monetdb}" }Tools
Tool | Description |
| Start here. Labels, session status, connection guide |
| Runtime credentials (blocked when |
| Close dynamic session |
| Execute SQL |
| List tables |
| Column types |
| List schemas |
| Connectivity check |
| EXPLAIN plan |
Security
Read-only by default (
readOnly: true)Use
--no-dynamic+--labelin production Cursor projectsDynamic credentials never saved to config
Multi-statement queries rejected
Config passwords excluded from git via
.gitignore
Source layout
src/
index.ts Entry point
types.ts Shared types
config/ CLI, schemas, loader
connection/ Pool, dynamic session
sql/ Safety, query execution
guidance/ AI connection guide
tools/ MCP tool registrationsLicense
Available Tools
9 toolsmdb_connectA
Connect to MonetDB at runtime with user-provided credentials (NOT from config.json). Always call this first when the user gives you host/user/password/database directly. Runs a health check; on success all other mdb_* tools use this session — omit the database parameter on subsequent calls. Replaces any previous dynamic session.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full MAPI URL, e.g. mapi:monetdb://user:pass@host:50000/db | |
| host | No | MonetDB server hostname | |
| port | No | MAPI port (default: 50000) | |
| user | No | Username | |
| timeout | No | Connection timeout in ms (default: 10000) | |
| database | No | Database name | |
| password | No | Password | |
| readOnly | No | Block write queries when true (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: it runs a health check, establishes a session that all other mdb_* tools then reuse, and replaces any previous dynamic session (a state-destructive side effect). It does not say what happens on failed auth/timeout or whether credentials persist in memory, which are the remaining gaps for a credential-handling 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?
Four short sentences, front-loaded with the core action and the credential-source constraint, then sequencing, side effects, and the session-reuse rule. Every sentence adds a distinct operational fact with 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?
For an 8-parameter connection tool with no output schema, the description covers the essential context: credential source, when to call it, health check on success, and session precedence over prior sessions. It stops short of describing failure behavior or the outcome of readOnly defaults, but the schema already supplies the latter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all eight parameters and the baseline is 3. The description adds genuine meaning beyond the schema by explaining that the database can be omitted on subsequent calls because the session retains it, which is a parameter-interaction detail the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Connect to MonetDB') and immediately narrows scope ('with user-provided credentials, NOT from config.json'), which separates it from any config-driven path among the mdb_* siblings. An agent knows exactly what this tool does before opening the 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?
Gives an explicit trigger ('Always call this first when the user gives you host/user/password/database directly') plus a when-not ('NOT from config.json'), and adds a follow-on rule for subsequent calls. Nothing about sequencing relative to mdb_disconnect/mdb_health_check is left to inference beyond what is obvious from the names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_describe_tableB
Describe table columns and types. Omit database if dynamic session active; otherwise pass database="config_label".
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | No | Schema name (omit to search all non-system schemas) | |
| database | No | Config label from config.json (e.g. 'analytics'). Required when using pre-configured databases and no dynamic session is active. Omit entirely when mdb_connect has established a runtime session. |
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. It implicitly discloses the operation is a read-only introspection and hints at the return content ('columns and types'), plus the dynamic-session vs config-label behavior. It does not describe output format, permissions, or any failure modes.
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 tight sentences, action front-loaded, with the operational caveat second. No filler, though the embedded database="config_label" quoting is slightly awkward.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what the column listing looks like, and it only says 'columns and types' without format or breadth detail. It handles the trickiest parameter condition well, but return-value completeness for a 3-param introspection tool is thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters in detail. The description restates the database parameter's conditional requirement but adds nothing about 'table' or 'schema' beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Describe table columns and types'), which is clearly distinct from list-oriented siblings like mdb_list_tables or mdb_list_schemas. It does not explicitly name or contrast a sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional guidance for the database parameter ('Omit database if dynamic session active; otherwise pass database="config_label"'), which is genuinely useful. However, it never states when to reach for this tool over mdb_query/mdb_explain, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_disconnectA
Close the active dynamic connection set via mdb_connect. Config-based connections are unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the key behavioral trait: it tears down only connections established via mdb_connect and leaves config-based connections intact. It omits secondary traits such as idempotency, behavior when no connection exists, and any effect on in-flight queries.
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, zero filler, with the action and its scope front-loaded ahead of the scoping caveat. Every clause 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?
For a zero-parameter, single-action tool with no output schema, the description supplies enough to call it correctly and understand its blast radius. Only minor gaps remain (return value, no-op behavior) that an agent could reasonably infer.
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 tool takes zero parameters, so the baseline is 4 and there is nothing for the description to compensate for. No parameter-related detail is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Close) plus a precisely scoped resource (the active dynamic connection set created via mdb_connect), and it names the counterpart tool so an agent can pair the two. The dynamic-vs-config distinction further separates its scope from anything else in the mdb_* family.
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 reference to mdb_connect gives clear context for when this applies, and 'Config-based connections are unaffected' effectively tells the agent when calling it is pointless. There is no explicit 'when to call / when not to call' statement or mention of what happens if no dynamic connection is active.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_explainB
Run EXPLAIN on a query. Omit database if dynamic session active; otherwise pass database="config_label". Always rolled back.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | SQL query to analyze | |
| database | No | Config label from config.json (e.g. 'analytics'). Required when using pre-configured databases and no dynamic session is active. Omit entirely when mdb_connect has established a runtime session. |
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. It usefully discloses 'Always rolled back', telling the agent the statement has no lasting effect, but omits whether the query is actually executed for planning only, what the response contains, or any permission requirements. Modest but real added value.
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?
Three short sentences, front-loaded with the action and then the parameter condition. Every sentence carries information; only the quoting of config_label duplicates the schema.
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 tool with no output schema and no annotations, the description is roughly adequate, but it leaves the agent unsure of what a rolled-back EXPLAIN returns and whether it is a safe read-only operation. A sentence on the plan/return nature would close the gap.
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 100%, so the schema already documents both 'query' and 'database' including the same config-label and dynamic-session conditions. The description largely restates what the schema provides, adding no syntax or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run EXPLAIN on a query'), which clearly distinguishes it from the sibling mdb_query that would actually execute a query. It does not explicitly contrast itself with siblings, but the purpose is unambiguous.
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?
Gives conditional guidance on the database parameter ('Omit database if dynamic session active'), which implies this tool is normally used outside an active runtime session. However it never states when to choose EXPLAIN over mdb_query or any prerequisite workflow, so usage is only partially implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_health_checkA
Test connectivity and return MonetDB version. Omit database if dynamic session active; otherwise pass database="config_label".
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Config label from config.json (e.g. 'analytics'). Required when using pre-configured databases and no dynamic session is active. Omit entirely when mdb_connect has established a runtime session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the session-dependent branching, but says nothing about failure behavior, required permissions, latency, or what a successful versus failed health check looks like — meaningful gaps for a diagnostic tool with zero annotation coverage.
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 tight sentences with the core action front-loaded before the conditional. The quoted nested 'database="config_label"' is slightly awkward to parse but costs little.
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-optional-parameter diagnostic with no output schema and no annotations, the definition covers the essential decision (session vs config label). The only missing piece an agent might want is what happens on connectivity failure, which is minor for a health check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents the config-label format and the dynamic-session exception, so the description largely restates the schema. Baseline 3 is appropriate since the schema does the heavy lifting and the description adds no new syntax or edge-case detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Test connectivity') and a concrete outcome ('return MonetDB version'), so the agent knows exactly what the call does. It does not name mdb_connect or mdb_list_databases as the alternative for session setup vs discovery, so sibling differentiation is only implied.
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 second sentence gives a real conditional ('Omit database if dynamic session active; otherwise pass database="config_label"'), but that is parameter-selection guidance rather than when-to-call guidance. Nothing says when to prefer this over mdb_connect or mdb_list_databases, which an agent choosing among nine mdb_* siblings would want.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_list_databasesA
ALWAYS call this first to discover how to connect. Returns configured database labels from config.json, active dynamic session status, and step-by-step connection instructions for the AI.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It helpfully describes the returned content (config labels, session status, connection instructions), but does not explicitly state that the operation is read-only, whether it has side effects, or what happens on failure, leaving gaps in the safety profile.
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 sentences with zero waste, and the critical directive 'ALWAYS call this first' is front-loaded before the return details. Every sentence 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 zero-parameter schema, no annotations, and no output schema, the description is nearly complete: it establishes the call order, the data source, and the returned artifacts. It stops short of describing error behavior or how to interpret the connection instructions, but those are minor gaps for a discovery 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 tool takes zero parameters, so the baseline is 4 per the scoring rules. The description adds no parameter information because none is needed, and the empty schema fully covers the input contract.
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 (returns) and enumerates the exact resources returned: configured database labels from config.json, active dynamic session status, and connection instructions. It also positions the tool as the bootstrap step, which clearly distinguishes it from sibling tools like mdb_connect or mdb_query.
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 instruction 'ALWAYS call this first to discover how to connect' gives explicit when-to-use guidance and establishes the tool as a prerequisite. However, it does not name alternative tools or state when not to use this tool, leaving some routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_list_schemasA
List schemas. Omit database if dynamic session active; otherwise pass database="config_label".
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Config label from config.json (e.g. 'analytics'). Required when using pre-configured databases and no dynamic session is active. Omit entirely when mdb_connect has established a runtime session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does disclose the key operational precondition — this tool depends on session state established by mdb_connect and otherwise needs a config label. It says nothing about required connectivity, error behavior when neither is present, or what the returned schemas look like.
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, front-loaded sentences with no filler; the action comes first and the conditional follows. The quoted config_label value slightly duplicates the schema example, but the text is otherwise tight and earns its space.
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, read-only listing tool with full schema coverage and no output schema, the description covers the essential decision (session vs config label). Only edge cases — behavior when neither session nor database is supplied, and result shape — are left unstated.
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 100%, so the single parameter's meaning and conditional requirement are already fully documented. The description restates the same omit/pass rule, adding no syntax, format, or edge-case detail beyond the schema. Baseline 3 applies.
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?
"List schemas" is a clear verb+resource, and the resource (schemas) is naturally distinct from siblings like mdb_list_databases and mdb_list_tables, so an agent can route without ambiguity. It does not, however, explicitly name or contrast with those siblings.
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 a conditional for the database parameter (omit when a dynamic session is active, otherwise pass a config label), which is genuinely useful context. But it offers no guidance on when to choose this tool over mdb_list_databases or mdb_list_tables, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_list_tablesA
List tables in MonetDB. Omit database if dynamic session active; otherwise pass database="config_label". Call mdb_list_databases first if unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name (omit to list all non-system schemas) | |
| database | No | Config label from config.json (e.g. 'analytics'). Required when using pre-configured databases and no dynamic session is active. Omit entirely when mdb_connect has established a runtime session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral disclosure. It usefully exposes the session-state dependency (dynamic session vs pre-configured database), but says nothing about permissions, result format, or whether system schemas are included by default (that only appears in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action, followed by the one operational rule that matters. No filler.
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?
Complete enough for a zero-required-param list tool: it explains the session/config-label duality and the fallback sibling to consult. The only gap is return-shape expectations, which is minor for a listing operation with no output schema.
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 100%, so both parameters are already fully documented in the schema, including the session-vs-config-label rule. The description restates that rule rather than adding format examples or edge cases beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List tables in MonetDB'), which is clearly distinct from mdb_list_databases and mdb_list_schemas by resource type. It does not explicitly contrast itself with those siblings, but the resource naming makes the distinction inferable.
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?
Gives a concrete conditional rule for the optional parameter ('omit database if dynamic session active; otherwise pass database="config_label"') and a prerequisite ('call mdb_list_databases first if unsure'). This is strong when-to-use guidance, though it never names the sibling mdb_list_schemas as the alternative for schema-level listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mdb_queryA
Execute SQL against MonetDB. Connection: (1) active dynamic session from mdb_connect — omit database; (2) config label — pass database="label". Call mdb_list_databases first if unsure.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return (truncates results if exceeded) | |
| query | Yes | SQL query to execute | |
| database | No | Config label from config.json (e.g. 'analytics'). Required when using pre-configured databases and no dynamic session is active. Omit entirely when mdb_connect has established a runtime session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden but covers only connection-mode behavior. It never states whether DDL/DML (DROP, DELETE, UPDATE) is permitted or flagged, whether results are transactional, or how errors surface — material gaps for a raw SQL executor.
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?
Three short sentences, front-loaded with the core action before the connection caveats. The numbered connection list is slightly dense but every clause 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?
No output schema exists, yet the description says nothing about return shape or error behavior for an arbitrary SQL tool. Connection semantics are complete, but an agent still lacks the mutation-safety and result-format context this complexity warrants.
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 100%, so the schema already documents query, database, and limit (including truncation). The description only re-frames the database parameter's routing rule, adding little beyond structured data; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (execute SQL against MonetDB) and immediately scopes it by connection mode, referencing mdb_connect and mdb_list_databases. It does not, however, distinguish itself from mdb_explain, which is the closest sibling for executing SQL-flavored statements.
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?
Gives explicit routing rules: omit database when a dynamic session is active, pass database="label" for a config label, and call mdb_list_databases first if unsure. No when-not guidance (e.g. when to prefer mdb_explain or mdb_health_check) is offered.
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
v1.0.0- First observed
mdb_connect - First observed
mdb_describe_table - First observed
mdb_disconnect - First observed
mdb_explain - First observed
mdb_health_check - First observed
mdb_list_databases - First observed
mdb_list_schemas - First observed
mdb_list_tables - First observed
mdb_query
TDQS
Scored across 9 tools
Tools mostly target distinct operations (connect, disconnect, list metadata, query, explain, health check), but connection bootstrapping has slight overlap and conflicting guidance between mdb_connect and mdb_list_databases over which to call first. mdb_health_check also partially duplicates the health check performed by mdb_connect.
All tools share the mdb_ prefix and snake_case naming, with most following a predictable verb_noun pattern (mdb_list_tables, mdb_describe_table, mdb_query). mdb_health_check is a minor deviation as a noun phrase rather than verb_noun, but the set remains highly consistent overall.
Nine tools is well-scoped for a MonetDB MCP server, covering connection management, metadata discovery, query execution, and diagnostics without bloating the surface. Each tool earns its place and the count sits comfortably in the ideal 3–15 range.
The set covers core lifecycle operations: connect/disconnect, discover databases, schemas, tables, describe columns, run queries, explain plans, and health check. Minor gaps exist for dedicated DDL/DML or transaction helpers, though mdb_query can execute arbitrary SQL, and listing views/indexes is not directly supported.
Maintenance
Related MCP Connectors
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Query Postgres, MySQL, SQL Server, Oracle, BigQuery, ClickHouse and Redshift from your AI client.
Draxlr's remote MCP server connects AI assistants to your SQL databases and dashboards. Explore schemas, run read-only queries, manage saved queries and dashboards, and export results, all with row-level security so each user sees only their own data.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to safely explore and query databases across SQLite, PostgreSQL, MySQL, and MSSQL, with schema introspection, natural language queries, and data profiling.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to safely query PostgreSQL or SQLite databases read-only through AST-validated guardrails, schema introspection, and statistical table profiling. It returns results as Markdown tables, JSON audit reports, and database health checks.MIT
- AlicenseBqualityCmaintenanceEnables MCP clients to inspect and operate SQLite, PostgreSQL, MySQL/MariaDB, Oracle, SQL Server and MongoDB through 16 tools covering schema discovery, parameterized SQL reads and transactions, MongoDB document operations, and concurrent hybrid SQL/MongoDB queries. Runs locally over stdio or loopback HTTP with pooled connections, bounded concurrency, row and response limits, and read-only defaults.16MIT
- AlicenseAqualityAmaintenanceRead-only-by-default MySQL/MariaDB, PostgreSQL and SQLite access for AI agents: explore schemas and foreign keys, search, sample, query and EXPLAIN with token-efficient TOON output. Writes only when enabled, always previewed and atomic.11165 PyPIApache 2.0