Skip to main content
Glama
cs-codespace

multi-monetdb-mcp-server

by cs-codespace

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

USAGE.md

AI agents & developers

Tool call sequences, decision flow, examples

config.example.json

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_connect

  • Hot reload — config changes apply within ~5 seconds, no restart

  • --label filter — expose only one database per Cursor project

  • --no-dynamic — block runtime mdb_connect for locked-down projects

  • Read-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 config.json

mdb_query(database="analytics", query="...")

B — Dynamic

User gives credentials in chat

mdb_connect(...) then omit database on other tools

See USAGE.md for full examples and AI workflow.

Quick Start

1. Install & build

cd multi-monetdb-mcp-server
npm install
npm run build

2. 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_databases shows only the filtered label

  • AI 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 --label needed — only one connection exists

  • Best 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_connect is rejected — config labels only

  • User cannot bypass restriction by pasting credentials in chat

  • Recommended for production-facing projects

{
  "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

--label <name>

Only one config label visible to AI

--config <path>

Which config file to load (project-specific)

--no-dynamic

Blocks mdb_connect (runtime credentials)

"readOnly": true

Blocks INSERT/UPDATE/DELETE/DROP in SQL

"enabled": false

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

label

(required)

Name used as database parameter in tool calls

host

—

MonetDB server hostname

port

50000

MAPI port

user

—

Username

password

""

Password

database

—

Database name

url

—

Full MAPI URL (alternative to host/user/password/database)

enabled

true

Set false to hide without removing

readOnly

true

Block write queries

timeout

10000

Connection timeout (ms)

Environment variable substitution in config values:

{ "password": "${MONETDB_PASSWORD:-monetdb}" }

Tools

Tool

Description

mdb_list_databases

Start here. Labels, session status, connection guide

mdb_connect

Runtime credentials (blocked when --no-dynamic)

mdb_disconnect

Close dynamic session

mdb_query

Execute SQL

mdb_list_tables

List tables

mdb_describe_table

Column types

mdb_list_schemas

List schemas

mdb_health_check

Connectivity check

mdb_explain

EXPLAIN plan

Security

  • Read-only by default (readOnly: true)

  • Use --no-dynamic + --label in production Cursor projects

  • Dynamic 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 registrations

License

Apache-2.0

Available Tools

9 tools
mdb_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull MAPI URL, e.g. mapi:monetdb://user:pass@host:50000/db
hostNoMonetDB server hostname
portNoMAPI port (default: 50000)
userNoUsername
timeoutNoConnection timeout in ms (default: 10000)
databaseNoDatabase name
passwordNoPassword
readOnlyNoBlock write queries when true (default: true)

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYesTable name
schemaNoSchema name (omit to search all non-system schemas)
databaseNoConfig 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

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSQL query to analyze
databaseNoConfig 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

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseNoConfig 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseNoConfig 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
schemaNoSchema name (omit to list all non-system schemas)
databaseNoConfig 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

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows to return (truncates results if exceeded)
queryYesSQL query to execute
databaseNoConfig 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

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 9 tool updatesv1.0.0
    • First observedmdb_connect
    • First observedmdb_describe_table
    • First observedmdb_disconnect
    • First observedmdb_explain
    • First observedmdb_health_check
    • First observedmdb_list_databases
    • First observedmdb_list_schemas
    • First observedmdb_list_tables
    • First observedmdb_query

TDQS

A3.8/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to safely explore and query databases across SQLite, PostgreSQL, MySQL, and MSSQL, with schema introspection, natural language queries, and data profiling.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    B
    quality
    C
    maintenance
    Enables 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.
    16
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Read-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.
    11
    165 PyPI
    Apache 2.0