Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

ai.haymon/dbmcp

OCI · GHCR.IO/HAYMON-AI/DBMCP

Database MCP server for MySQL, MariaDB, PostgreSQL & SQLite with PII redaction and write-prevention

+3 this week 40 Trust /100

Last scanned (9 hours ago)

Scores higher than 51% of OCI servers

Category Databases

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.Unverified
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability60
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5355 tokens (~669/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management23
  • Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "readQuery" implies "execute" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Fail
  • An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 22 Oct 26 0
    • Stability: 0.20 → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • First check of Schema quality: unverified functional
    • Package version: 0.15.0 → 0.15.1 functional
  • 21 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

  • 19 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Oct 26 +1
    • Stability: unverified → 0.07 ▲ functional
    • Package version: 0.14.0 → 0.15.0 functional
  • 15 Oct 26 37

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Oct 2026 · Analysed oci/ghcr.io/haymon-ai/dbmcp@0.15.1

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem oci
Reason No attestation published

Background: How many MCP packages publish verified provenance →

MCP tools · 8 exposed · ~5,133 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
explainQuery ~354

Return the execution plan for a SQL query to diagnose performance. Use this tool instead of running EXPLAIN directly through readQuery — it provides structured output. <usecase> Use when: - A query runs slowly and you need to understand why - Investigating performance bottlenecks - Planning index creation to optimize queries - Analyzing join methods, table scan strategies, and sort operations </usecase> <when_not_to_use> - Running actual queries → use readQuery or writeQuery - Checking table structure → use listTables(detailed=true) </when_not_to_use> <examples> ✓ "Why is my SELECT on orders slow?" → explainQuery(query="SELECT ...") ✓ "Should I add an index?" → explainQuery with analyze=true ✗ "Run this SELECT" → use readQuery </examples> <safety> Set `analyze` to true for actual execution statistics (EXPLAIN ANALYZE). IMPORTANT: EXPLAIN ANALYZE actually executes the query! In read-only mode, only read-only statements are allowed with analyze. When analyze is false, returns EXPLAIN FORMAT=JSON output without executing. Only a single SQL statement is accepted. </safety> <what_it_returns> A JSON array of execution plan rows showing access methods, join types, row estimates, and costs. </what_it_returns>

NameTypeReqDescription
analyzeboolean–If true, use EXPLAIN ANALYZE for actual execution statistics. In read-only mode, only allowed for read-only statements. Defaults to false.
databasestring|null–Database to explain against. Defaults to the active database.
querystringyesThe SQL query to explain.
NameTypeReqDescription
rowsarrayyesResult rows, each a JSON object keyed by a column name.

No examples provided.

listDatabases ~183

List all accessible databases on the connected server. Use this tool to discover what databases are available before using other tools. <usecase> ALWAYS call this tool FIRST when: - You need to explore what databases exist on the server - You need a database name for listTables or query tools - The user asks what data is available </usecase> <examples> ✓ "What databases are on this server?" ✓ "Show me what's available" → call listDatabases first </examples> <what_it_returns> A sorted JSON array of database name strings. </what_it_returns> <pagination> Paginated. Pass the prior response's `nextCursor` as `cursor` to fetch the next page. </pagination>

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
NameTypeReqDescription
databasesarrayyesSorted list of database names for this page.
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page.

No examples provided.

listFunctions ~969

List user-defined SQL functions in a database, optionally filtered and/or with full metadata. Loadable UDFs (`mysql.func`) and stored procedures are excluded. <usecase> Use when: - Auditing stored functions across a database (brief mode, default). - Searching for a function by partial name (pass `search`). - Inspecting a function's language, signature, return type, determinism, SQL-data-access classification, security mode, definer, comment, session context, and full reconstructed `CREATE FUNCTION` text before reasoning about correctness or invocation safety (pass `detailed: true`). Detailed mode supersedes ad-hoc `readQuery` against `information_schema.ROUTINES` / `information_schema.PARAMETERS`. </usecase> <parameters> - `database` — Database to target. Defaults to the active database. - `cursor` — Opaque pagination cursor; echo the prior response's `nextCursor`. - `search` — Case-insensitive filter on function names via `LIKE`. `%` matches any sequence; `_` matches a single character. - `detailed` — When `true`, returns full metadata objects keyed by function name instead of bare name strings. Default `false`. </parameters> <examples> ✓ "What functions are in the mydb database?" → listFunctions(database="mydb") ✓ "Find the order-total calculation" → listFunctions(search="order") ✓ "What does calc_order_total do?" → listFunctions(search="calc_order_total", detailed=true) ✗ "List stored procedures" → use listProcedures instead ✗ "List loadable UDFs from mysql.func" → not supported; only routines in information_schema.ROUTINES are returned </examples> <what_it_returns> Brief mode (default): a sorted JSON array of function-name strings, e.g. `["calc_order_subtotal", "calc_order_total", "double_it"]`. Detailed mode: a JSON object keyed by bare function name (MySQL/MariaDB do not allow function overloading, so no signature suffix is needed); each value carries `schema`, `language` (typically `"SQL"`; MariaDB external-language functions report the external language…

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
databasestring|null–Database to list functions from. Defaults to the active database.
detailedboolean–When `true`, each returned entry is a full metadata object (schema, language, arguments, returnType, deterministic, sqlDataAccess, security, definer, description, definition, sqlMode, characterSetCli…
searchstring|null–Optional case-insensitive filter on function names. The input is used within a `LIKE` clause: `%` matches any sequence of characters and `_` matches any single character.
NameTypeReqDescription
entries–yesPage of matching entries. Shape depends on the request's `detailed` flag.
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page.

No examples provided.

listProcedures ~1,081

List user-defined stored procedures in a database, optionally filtered and/or with full metadata. Stored functions and loadable UDFs (`mysql.func`) are excluded. <usecase> Use when: - Auditing stored procedures across a database (brief mode, default). - Searching for a procedure by partial name (pass `search`). - Inspecting a procedure's language, parameter list (with `IN`/`OUT`/`INOUT` modes), determinism, SQL-data-access classification, security mode, definer, comment, session context, and full reconstructed `CREATE PROCEDURE` text before reasoning about correctness or invocation safety (pass `detailed: true`). Detailed mode supersedes ad-hoc `readQuery` against `information_schema.ROUTINES` / `information_schema.PARAMETERS`. </usecase> <parameters> - `database` — Database to target. Defaults to the active database. - `cursor` — Opaque pagination cursor; echo the prior response's `nextCursor`. - `search` — Case-insensitive filter on procedure names via `LIKE`. `%` matches any sequence; `_` matches a single character. - `detailed` — When `true`, returns full metadata objects keyed by procedure name instead of bare name strings. Default `false`. </parameters> <examples> ✓ "What procedures are in the mydb database?" → listProcedures(database="mydb") ✓ "Find the order archival routine" → listProcedures(search="archive") ✓ "What does archive_order do?" → listProcedures(search="archive_order", detailed=true) ✗ "List functions" → use listFunctions instead ✗ "List loadable UDFs from mysql.func" → not supported; only routines in information_schema.ROUTINES are returned </examples> <what_it_returns> Brief mode (default): a sorted JSON array of procedure-name strings, e.g. `["archive_order", "archive_order_history", "purge_order_archive", "touch_post"]`. Detailed mode: a JSON object keyed by bare procedure name (MySQL/MariaDB do not allow procedure overloading, so no signature suffix is needed); each value carries `schema`, `language` (typically `"SQL"`; MariaDB externa…

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
databasestring|null–Database to list procedures from. Defaults to the active database.
detailedboolean–When `true`, each returned entry is a full metadata object (schema, language, arguments with IN/OUT/INOUT mode tokens, deterministic, sqlDataAccess, security, definer, description, definition, sqlMod…
searchstring|null–Optional case-insensitive filter on procedure names. The input is used within a `LIKE` clause: `%` matches any sequence of characters and `_` matches any single character.
NameTypeReqDescription
entries–yesPage of matching entries. Shape depends on the request's `detailed` flag.
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page.

No examples provided.

listTables ~554

List tables in a database, optionally filtered and/or with full metadata. <usecase> Use when: - Exploring a database to find relevant tables (brief mode, default). - Searching for a table by partial name (pass `search`). - Inspecting a table's columns, constraints, indexes, and triggers before writing a query (pass `detailed: true`). This supersedes the legacy `getTableSchema` tool. </usecase> <parameters> - `database` — Database to target. Defaults to the active database. - `cursor` — Opaque pagination cursor; echo the prior response's `nextCursor`. - `search` — Case-insensitive filter on table names via `LIKE`. `%` matches any sequence; `_` matches a single character. - `detailed` — When `true`, returns full metadata objects keyed by table name instead of bare name strings. Default `false`. </parameters> <examples> ✓ "What tables are in mydb?" → listTables(database="mydb") ✓ "Find the orders table" → listTables(search="order") ✓ "What columns does orders have?" → listTables(search="orders", detailed=true) </examples> <what_it_returns> Brief mode (default): a sorted JSON array of table-name strings, e.g. `["customers", "orders"]`. Detailed mode: a JSON object keyed by table name; each value carries `schema`, `kind`, `owner`, `comment`, `columns`, `constraints`, `indexes`, and `triggers` (the name is the key and is not repeated inside the value). Keys iterate in the same alphabetical order brief mode uses. Example: `{"orders": {"schema": "mydb", "kind": "TABLE", …}}`. </what_it_returns> <pagination> Paginated. Pass the prior response's `nextCursor` as `cursor` to fetch the next page. The `search` filter must stay the same across pages for cursor continuity. </pagination>

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
databasestring|null–Database to list tables from. Defaults to the active database.
detailedboolean–When `true`, each returned entry is a full metadata object (columns, constraints, indexes, triggers, owner, comment, kind); when `false` or omitted, each entry is the bare table-name string.
searchstring|null–Optional case-insensitive filter on table names. The input is used within a `LIKE` clause: `%` matches any sequence of characters and `_` matches any single character.
NameTypeReqDescription
entries–yesPage of matching entries. Shape depends on the request's `detailed` flag.
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page.

No examples provided.

listTriggers ~719

List user-defined triggers in a database, optionally filtered and/or with full metadata. <usecase> Use when: - Auditing trigger coverage across a database (brief mode, default). - Searching for a trigger by partial name (pass `search`). - Inspecting a trigger's timing, event, activation level, full `CREATE TRIGGER` text, and the session context active at trigger-creation time before reasoning about side-effects (pass `detailed: true`). Detailed mode supersedes ad-hoc `readQuery` against `information_schema.TRIGGERS`. </usecase> <parameters> - `database` — Database to target. Defaults to the active database. - `cursor` — Opaque pagination cursor; echo the prior response's `nextCursor`. - `search` — Case-insensitive filter on trigger names via `LIKE`. `%` matches any sequence; `_` matches a single character. - `detailed` — When `true`, returns full metadata objects keyed by trigger name instead of bare name strings. Default `false`. </parameters> <examples> ✓ "What triggers are in the mydb database?" → listTriggers(database="mydb") ✓ "Find the audit triggers" → listTriggers(search="audit") ✓ "What does orders_audit_after_insert do?" → listTriggers(search="orders_audit_after_insert", detailed=true) ✗ "Show me a trigger's body" → use detailed mode; the `definition` field carries the full `CREATE TRIGGER` text </examples> <what_it_returns> Brief mode (default): a sorted JSON array of trigger-name strings, e.g. `["customers_audit_after_insert", "orders_audit_after_insert"]`. Detailed mode: a JSON object keyed by trigger name; each value carries `schema`, `table`, `timing` (BEFORE/AFTER), `events` (single-element array — `INSERT`, `UPDATE`, or `DELETE`), `activationLevel` (always `ROW` on MySQL/MariaDB), `definition` (the canonical `CREATE TRIGGER` text including `DEFINER=` in `` `user`@`host` `` form), `sqlMode`, `characterSetClient`, `collationConnection`, and `databaseCollation`. The Postgres-only `status` and `functionName` fields are intentionally absent (no per-…

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
databasestring|null–Database to list triggers from. Defaults to the active database.
detailedboolean–When `true`, each returned entry is a full metadata object (schema, table, timing, events, activationLevel, definition, plus backend-specific fields); when `false` or omitted, each entry is the bare…
searchstring|null–Optional case-insensitive filter on trigger names. The input is used within a `LIKE` clause: `%` matches any sequence of characters and `_` matches any single character.
NameTypeReqDescription
entries–yesPage of matching entries. Shape depends on the request's `detailed` flag.
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page.

No examples provided.

listViews ~907

List user-defined views in a database, optionally filtered and/or with full metadata. Base tables and system-schema views are excluded. <usecase> Use when: - Auditing views across a database (brief mode, default). - Searching for a view by partial name (pass `search`). - Inspecting a view's definer, security mode, check-option level, updatable flag, session character set/collation, and full SELECT body before querying it (pass `detailed: true`). Detailed mode supersedes ad-hoc `readQuery` against `information_schema.VIEWS`. </usecase> <parameters> - `database` — Database to target. Defaults to the active database. - `cursor` — Opaque pagination cursor; echo the prior response's `nextCursor`. - `search` — Case-insensitive filter on view names via `LIKE`. `%` matches any sequence; `_` matches a single character. - `detailed` — When `true`, returns full metadata objects keyed by view name instead of bare name strings. Default `false`. </parameters> <examples> ✓ "What views are in the mydb database?" → listViews(database="mydb") ✓ "Find the active-users view" → listViews(search="active") ✓ "What does active_users select?" → listViews(search="active_users", detailed=true) ✗ "Show me the columns of a view" → use listTables with `detailed: true` instead ✗ "List materialized views" → MySQL/MariaDB have no materialized-view concept </examples> <what_it_returns> Brief mode (default): a sorted JSON array of view-name strings, e.g. `["active_orders", "active_users", "published_posts"]`. Detailed mode: a JSON object keyed by bare view name; each value carries `schema`, `definer` (`user@host`), `security` (`INVOKER` or `DEFINER`), `checkOption` (`NONE`, `CASCADED`, or `LOCAL`), `updatable` (boolean), `characterSetClient`, `collationConnection`, and `definition` (the SELECT body verbatim from `information_schema.VIEWS.VIEW_DEFINITION`, with no `CREATE VIEW` wrapper). The view name is the map key only — it is not repeated inside the value. Versus the Postgres `listViews` deta…

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
databasestring|null–Database to list views from. Defaults to the active database.
detailedboolean–When `true`, each returned entry is a full metadata object (schema, definer, security, checkOption, updatable, characterSetClient, collationConnection, definition); when `false` or omitted, each entr…
searchstring|null–Optional case-insensitive filter on view names. The input is used within a `LIKE` clause: `%` matches any sequence of characters and `_` matches any single character.
NameTypeReqDescription
entries–yesPage of matching entries. Shape depends on the request's `detailed` flag.
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page.

No examples provided.

readQuery ~366

Execute a read-only SQL query. Allowed statements: SELECT, SHOW, DESCRIBE, USE, EXPLAIN. <usecase> Use when: - Querying data from tables (SELECT with WHERE, JOIN, GROUP BY, etc.) - Aggregations: COUNT, SUM, AVG, GROUP BY, HAVING - Listing server variables or status (SHOW) - Viewing table structure (DESCRIBE) - Switching database context (USE) </usecase> <when_not_to_use> - Data changes (INSERT, UPDATE, DELETE) → use writeQuery - Query performance analysis → use explainQuery - Discovering tables or columns → use listTables (pass detailed=true for column-level metadata) </when_not_to_use> <examples> ✓ "SELECT * FROM users WHERE status = 'active'" ✓ "SELECT COUNT(*) FROM orders GROUP BY region" ✓ "SHOW TABLES" or "DESCRIBE users" ✗ "INSERT INTO users ..." → use writeQuery ✗ "EXPLAIN SELECT ..." → use explainQuery for structured analysis </examples> <what_it_returns> A JSON array of row objects, each keyed by column name. </what_it_returns> <pagination> `SELECT` results are paginated. Pass the prior response's `nextCursor` as `cursor` to fetch the next page. `SHOW`, `DESCRIBE`, `USE`, and `EXPLAIN` return a single page and ignore `cursor`. </pagination>

NameTypeReqDescription
cursorstring|null–Opaque cursor from a prior response's `nextCursor`; omit for the first page.
databasestring|null–Database to run the query against. Defaults to the active database.
querystringyesThe SQL query to execute.
NameTypeReqDescription
nextCursorstring|null–Opaque cursor pointing to the next page. Absent when this is the final page, when the result fits in one page, or when the statement is a non-`SELECT` kind that does not paginate (e.g. `SHOW`, `EXPLA…
rowsarrayyesResult rows, each a JSON object keyed by a column name.

No examples provided.

Install

How do I install the ai.haymon/dbmcp MCP server?

ai.haymon/dbmcp runs locally as a container image, launched with docker run --rm -i ghcr.io/haymon-ai/dbmcp:0.15.1. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/haymon-ai/dbmcp

# add to Claude Code
claude mcp add ai-haymon-dbmcp -- docker run --rm -i ghcr.io/haymon-ai/dbmcp:0.15.1
Common questions

What is the ai.haymon/dbmcp MCP server?

ai.haymon/dbmcp is an MCP server listed in the public MCP registry as ai.haymon/dbmcp. Database MCP server for MySQL, MariaDB, PostgreSQL & SQLite with PII redaction and write-prevention. This page covers its container image (ghcr.io/haymon-ai/dbmcp).

Is the ai.haymon/dbmcp MCP server safe to use?

ai.haymon/dbmcp scores 40 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the ai.haymon/dbmcp MCP server expose?

ai.haymon/dbmcp exposes 8 tools: explainQuery, listDatabases, listFunctions, listProcedures, listTables, and 3 more. Their descriptions and schemas cost roughly 5,133 tokens of context every time the server is loaded.

Is the ai.haymon/dbmcp MCP server still maintained?

ai.haymon/dbmcp is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the ai.haymon/dbmcp MCP server under?

ai.haymon/dbmcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.