Skip to main content
Glama

askDB MCP

An MCP server that turns natural-language data questions into the schema context an LLM needs to write SQL. It does not connect to your database and it does not generate SQL itself — it retrieves the right table definitions from your Pinecone index and hands them to whichever model is asking.

user question
   │
   ▼
Claude Code / ChatGPT ──calls──► askDB MCP ──semantic search──► Pinecone (ask-db)
   │                                  │
   │      relevant DDL + guardrails ◄─┘
   ▼
generated SQL

Runs two ways from the same code: locally over stdio, or hosted on Vercel over HTTP.

Tools

Tool

When the model uses it

Input

search_schema

First call for any text-to-SQL request

question, tables?, top_k?, detail?, on_unsure?, database?

get_table_schema

The table is known — usually the user said so

tables[], detail?, database?

list_tables

Orientation, or when search comes back empty

filter?, limit?, verbose?, database?

The rules that keep the model from inventing table names are sent once, in the server's MCP instructions, rather than repeated inside every tool result.

Related MCP server: Vanna AI MCP Server

It asks instead of guessing

The schema index cannot always tell which table a question means. This one is honest about that.

Retrieval is scored for shape, not absolute confidence: 0.91, 0.74, 0.70 has an obvious cliff after the first table, while 0.831, 0.830, 0.829, 0.828 is a flat line and means the embedding could not tell those tables apart. On a flat ranking search_schema returns a numbered shortlist with each table's columns instead of a wall of DDL, and the calling model is told to put the choice to you:

# Ambiguous: 5 tables could answer "give me the mapping details"
_the top 5 tables scored within 0.4% of each other — retrieval could not separate them_

**Do not guess and do not write SQL yet.** Show this list to the user, ask which
table(s) they mean, then call `get_table_schema` with the names they pick.

1. `speed_core_live.tbl_app_category_mapping` (also in speed_core_test) · 0.814 — id, created, modified, account_id …
2. `speed_node.tbl_tron_address_token_mapping` · 0.813 — id, chain_id, address, token_address, balance …

That shortlist costs ~300 tokens; the eight full table definitions it replaces cost ~1,400. Where the client supports MCP elicitation the server prompts you directly instead, skipping the round trip through the model. on_unsure: "best_effort" forces an answer anyway, and ASK_WHEN_UNSURE=false turns the behaviour off entirely.

Names get the same treatment. get_table_schema(["payments"]) does not silently return whatever was nearest in vector space — it answers with real names to choose from, for ~75 tokens:

No table named `payments` in the index.

Closest real names:
- `speed_core_live.tbl_payment`
- `speed_core_live.tbl_payment_link`

Where the tokens went

Measured against this repo's own index (~486 tables across 5 databases), same questions, same retrieval:

Call

Before

After

search_schema × 6 realistic questions

9,081 tok

2,221 tok

get_table_schema with 2 tables

1,712 tok

679 tok

list_tables, whole schema

~3,000 tok

822 tok

list_tables with filter: "payment"

338 tok

Four things changed:

  • One entry per table. A table split across several chunks was rendered several times over, header and all.

  • No metadata dump. Every hit used to print all of its metadata fields alongside the DDL. detail: "full" still does.

  • Standing instructions moved to the handshake. The five-step "how to use this" preamble was previously repeated in every result — and once per table in get_table_schema.

  • Budgets. At most MAX_TABLES tables per answer, MAX_CHARS_PER_TABLE each, MAX_RESPONSE_CHARS overall, with a pointer to detail: "full" when something is clipped. list_tables caps names and prefers filter.

Retrieval: names, not just vectors

With an e5 index every cosine score lands in a narrow band — on this index, 0.79 to 0.83 for everything. That is enough to rank tbl_payment_link_preset_type above tbl_payment for "how many payments were created last month", which is how a simple question turns into eight irrelevant tables and a wrong query.

So the table inventory is matched too. A table wins on name when every token in its name was asked for: "pos terminals" fully covers tbl_pos_terminal but only a third of tbl_pos_terminal_charge_payment_mapping, and it beats the bare tbl_pos because it accounts for more of the question. Partial matches are left to the vector search. This runs against an inventory that is already in memory, so it costs nothing per query, and it is a pure accelerator — while the inventory is still warming, search behaves exactly as it would without it.

Duplicate environments are collapsed the same way. An index holding speed_core_live and speed_core_test used to return both copies of every table and spend half of top_k on duplicates; now the preferred copy is returned with _same table also in: speed_core_test_ underneath. Preference is database argument, then DEFAULT_DATABASE, then the database with the most tables.

Run it locally

npm install

Then create .env next to the server with your Pinecone key — everything else has a default:

PINECONE_API_KEY=...
PINECONE_INDEX=ask-db
SQL_DIALECT=MySQL

Claude Code

The CLI, the desktop app and the IDE extensions share one config, so this registers the server for all three:

# from the repo root — records an absolute path, so it works in any folder
claude mcp add askdb --scope user -- node "$PWD\src\server.js"

Check it with claude mcp list (askdb: ... ✓ Connected), then restart the desktop app or IDE window — MCP servers load at startup.

User scope is deliberate: the point is to ask database questions while working in your other repos. A project-scoped .mcp.json would only resolve when Claude Code is started at this repo's root.

Claude Desktop / Cursor

Add to claude_desktop_config.json (or Cursor's MCP settings):

{
  "mcpServers": {
    "askdb": {
      "command": "node",
      "args": ["D:\\working-directory\\AI\\askDB-mcp\\src\\server.js"]
    }
  }
}

Credentials come from .env next to the server, so no keys go in the client config.


Host it on Vercel

Two functions, no build step. api/mcp.js is the MCP endpoint; api/health.js tells you whether the deployment is configured. Both reuse src/mcp.js unchanged — the MCP SDK's WebStandardStreamableHTTPServerTransport takes a Request and returns a Response, which is exactly Vercel's Web Handler signature, so there's no shim in between.

1. Generate an auth token

/mcp serves your entire schema to anyone who can reach the URL, so it fails closed: with no MCP_AUTH_TOKEN set it returns 503 rather than serving anything.

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Keep this out of git — it goes in Vercel's environment variables, nowhere else.

2. Deploy

From the dashboard: push the repo to GitHub, then vercel.com/new → import it. Application Preset Other, no build command, no output directory — Vercel picks up api/ on its own.

Do not pick the Node preset. Vercel's backend presets scan for an app entrypoint at app.*, index.*, server.*, src/app.*, src/index.* or src/server.*, and this repo has src/server.js — the stdio entry point. The preset boots it expecting an Express-style app, finds no default export and no port listener, and the whole deployment dies with FUNCTION_INVOCATION_FAILED before api/ is ever built. vercel.json sets "framework": null to force Other regardless of the dashboard setting, so this is already handled — just don't override it.

Or from the CLI:

npx vercel login
npx vercel link
npx vercel deploy --prod

3. Set environment variables

Project Settings → Environment Variables, scoped to Production (add Preview too if you want preview deploys to work):

Variable

Value

PINECONE_API_KEY

your Pinecone key

MCP_AUTH_TOKEN

the token from step 1

DEFAULT_DATABASE

optional, e.g. speed_core_live — see below

SQL_DIALECT

optional, e.g. MySql

Or via CLI: npx vercel env add PINECONE_API_KEY production

Redeploy after adding them — environment variables are baked in at deploy time, so an existing deployment won't pick them up.

4. Turn off Deployment Protection

Settings → Deployment Protection. If Vercel Authentication is on for production, every request to /mcp gets bounced to an SSO login page and no MCP client can connect. Turn it off for production (your bearer token is the access control), or issue a Protection Bypass token and send it as well.

This is the single most common reason a deploy that looks fine returns HTML instead of JSON.

5. Verify

curl https://ask-db-mcp.vercel.app/health
{
  "status": "ok",
  "index": "ask-db",
  "env": { "PINECONE_API_KEY": true, "MCP_AUTH_TOKEN": true }
}

env reports presence only, never values. A 503 with "status": "misconfigured" means a variable is missing or you haven't redeployed since adding it.

Then the endpoint itself:

curl -X POST https://ask-db-mcp.vercel.app/mcp \
  -H "Authorization: Bearer $MCP_AUTH_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

You should get an SSE frame listing the three tools. 401 means the token doesn't match; HTML means Deployment Protection is still on.

Local testing

npx vercel dev      # serves /mcp and /health on localhost:3000, reading .env

Connect a client to the hosted server

Claude Code:

claude mcp add --transport http askdb https://ask-db-mcp.vercel.app/mcp \
  --scope user \
  --header "Authorization: Bearer <token>"

Claude Desktop / Cursor — neither speaks a static bearer token natively (their built-in connectors expect OAuth), so bridge with mcp-remote. On Windows the config lives at %APPDATA%\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "askdb": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://ask-db-mcp.vercel.app/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer <token>"
      }
    }
  }
}

The token goes in env, not in args, and there is no space after the colon in Authorization:${AUTH_HEADER}. Claude Desktop on Windows and Cursor both have a bug where spaces inside args are not escaped when invoking npx, which mangles the header; routing the value through an environment variable sidesteps it, since spaces are fine there.

Restart Claude Desktop fully after editing — MCP servers are loaded at startup. If it fails to connect, try "command": "cmd" with "args": ["/c", "npx", "-y", "mcp-remote", ...]; Windows sometimes can't resolve npx when it is spawned without a shell.

ChatGPT: add a connector pointing at https://ask-db-mcp.vercel.app/mcp with an Authorization: Bearer <token> header.

Teammates need nothing installed — just the URL and the token.


Configuration

All optional except the API key. The same names work as Vercel environment variables.

Variable

Default

Notes

PINECONE_API_KEY

Required

MCP_AUTH_TOKEN

Required when hosted; unused over stdio

PINECONE_INDEX

ask-db

PINECONE_NAMESPACE

(default ns)

TOP_K / MAX_TOP_K

8 / 30

Chunks retrieved per search

EMBED_MODEL

multilingual-e5-large

Must match the model you upserted with

DEFAULT_DATABASE

(all)

Scope every lookup to one database

SQL_DIALECT

MySQL

Passed to the model as a hint

TEXT_FIELDS / TABLE_FIELDS / DB_FIELDS

(auto-detected)

Candidate metadata keys, tried in order

LIST_SCAN_LIMIT

1000

Cap on list_tables scanning

Output budget — lower these to spend fewer tokens, raise them to see more schema at once:

Variable

Default

Notes

MAX_TABLES

4

Tables rendered in one answer

MAX_CHARS_PER_TABLE

1400

Per-table DDL cap in compact detail

MAX_RESPONSE_CHARS

7000

Whole-response cap

MAX_LISTED_TABLES

120

Names printed by list_tables before it asks for a filter

CACHE_TTL_MS

600000

In-process cache for searches, fetches and the inventory; 0 disables

INVENTORY_WAIT_MS

3000

How long a search waits for a table scan still warming up; 0 never waits

SCAN_CONCURRENCY

6

Record batches fetched in parallel while scanning

When to ask rather than guess:

Variable

Default

Notes

ASK_WHEN_UNSURE

true

false always answers with the best guess

AMBIGUITY_GAP

0.015

Biggest score drop in the top results, as a fraction of the best score, below which the ranking counts as flat. Raise it to be asked more often

MAX_CANDIDATES

8

Length of the shortlist

MIN_SCORE

0

Extra absolute floor; 0 disables it

ELICIT

true

Prompt the user directly when the client supports MCP elicitation

The server samples the index on first use to detect which metadata fields your records use and whether the index has integrated embedding, so the defaults usually work unchanged.

Three things worth knowing

The embedding model must match. If EMBED_MODEL is not the model the schema was upserted with, every score collapses to near-zero and results are noise — the vectors are effectively random relative to each other. You'll see this as unrelated tables coming back with scores around 0.01 instead of 0.8. This index was built with multilingual-e5-large. (Irrelevant if the index has integrated embedding — list_tables reports which.)

DEFAULT_DATABASE is a trade, not a free win. Duplicate *_live / *_test copies are already collapsed, so scoping is no longer needed to stop the model mixing environments. Scoping does make retrieval sharper — but it also hides every table that lives only somewhere else. On this index tbl_user and tbl_account_kyc exist in speed alone, so DEFAULT_DATABASE=speed_core_live would make them unfindable. Leave it unset unless one database really is the whole story.

Startup is warmed, not lazy. The Pinecone SDK costs ~6s to import and the table scan another ~5s. Both now run in the background right after the MCP handshake (warmup()) instead of inside the first tool call, and the two overlap, so priming lands at ~11s and is normally finished before anyone asks anything. Nothing awaits it and nothing depends on it: a question that arrives mid-warm-up waits INVENTORY_WAIT_MS (3s) for the inventory and then answers without name matching. Hosted, module scope runs once per container, so a warm container is already primed — which is why api/mcp.js keeps its 60s maxDuration in vercel.json for the cold case.

The scan got cheaper too. Records in this index are keyed database.table, one per table, so after fetching a single batch to confirm that convention actually holds, the remaining table names are read straight from the ids and ~386 records of DDL are never pulled over the wire. Scan work dropped from ~11s to ~5s, and the result is identical to reading every record's metadata — verified against a full fetch. Any batch containing an id that does not parse is still fetched, and an index that does not follow the convention at all falls back to fetching everything, six batches at a time.

Repeat questions are free. Searches, table fetches and the inventory are cached in process for CACHE_TTL_MS (10 minutes), keyed on every argument. A repeated search returns in ~0ms instead of ~700ms, which matters most when a conversation circles the same two tables.

Layout

File

Role

src/server.js

stdio entry point

src/mcp.js

Tool definitions — the MCP surface

src/pinecone.js

Retrieval: search, exact fetch, field detection, warm-up

src/lexical.js

Table-name matching over the inventory

src/format.js

Renders hits into the schema block the model reads

src/cache.js

In-process TTL cache for Pinecone round trips

src/config.js

Env loading and defaults

api/mcp.js

Hosted MCP endpoint — /mcp, bearer auth

api/health.js

Hosted config check — /health, unauthenticated

vercel.json

Routing and function duration

Available Tools

3 tools
get_table_schemaGet schema for specific tablesA
Read-only

Fetch the full stored DDL for one or more tables by exact name. Use after search_schema when you need every column of a table, or when the user named the table.

ParametersJSON Schema
NameRequiredDescriptionDefault
tablesYesExact table names, e.g. ["tbl_account", "tbl_order"].
databaseNoRestrict to one database/schema — omit to search all of them.
namespaceNoPinecone namespace override.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only and open-world, so the behavioral burden is lower. The description clarifies that DDL is returned for exact table names, but does not add details like pagination limits, error handling for missing tables, or performance traits beyond what annotations signal.

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?

The description is extremely concise—two short sentences that immediately convey purpose and usage context. There is no wasted wording, and every sentence adds value.

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 tool's simplicity, strong annotations, and complete schema, the description is largely complete. It could optionally mention that the output is raw DDL (though implicit), but lack of output schema does not diminish clarity given the straightforward fetch operation.

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 thoroughly documents all three parameters. The description adds no extra semantics beyond what the schema provides, so a baseline score of 3 is appropriate.

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 clearly states the tool fetches 'full stored DDL for one or more tables by exact name', using specific verbs and resources. It also distinguishes itself from sibling tool 'search_schema' by indicating when to use this tool after that one.

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 description provides explicit guidance on when to use this tool ('after search_schema when you need every column') and references the user naming a table. However, it does not explicitly state when not to use it or mention any alternatives like 'list_tables'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tablesList available tablesA
Read-only

Inventory of every table in the schema index, grouped by database, plus the index configuration. Use it to orient yourself, or when search_schema comes back empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
databaseNoRestrict to one database/schema — omit to search all of them.
namespaceNoPinecone namespace override.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and scope. The description adds beyond annotations by stating that results are grouped by database and include index configuration. No behavioral traits (like performance impact or pagination) are discussed, but for a read-only inventory tool this is adequate.

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 wasted words. The first sentence defines the core functionality, and the second provides usage guidance. It is front-loaded and every part 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 simple list tool with no output schema, the description gives a sufficient mental model: inventory, grouping by database, and inclusion of index configuration. Could be slightly more explicit about the return structure (e.g., whether it's flat or nested), but fine given the tool's simplicity and the presence of sibling context.

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% with clear descriptions for both optional parameters (database filter and namespace override). The description does not elaborate further on parameter semantics beyond what the schema provides, so it meets the baseline expected when schema does the heavy lifting.

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 clearly states the tool provides an 'Inventory of every table in the schema index, grouped by database, plus the index configuration.' It uses specific verbs and nouns, and distinguishes itself from sibling tools like search_schema by indicating when to use it (when search_schema returns empty).

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 description explicitly says 'Use it to orient yourself, or when search_schema comes back empty,' providing clear usage context. It does not mention when to avoid this tool or use get_table_schema, but the positive guidance is strong and helps an agent decide between siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_schemaSearch database schemaA
Read-only

Semantic search over the database schema stored in Pinecone. Call this FIRST for any text-to-SQL request: pass the user question verbatim and you get back the relevant tables, columns, types and relationships to write the query against.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_kNoHow many schema chunks to retrieve (default 8).
tablesNoRestrict the search to these table names, when you already know them.
databaseNoRestrict to one database/schema — omit to search all of them.
questionYesThe natural-language data question, e.g. "top 10 accounts by transaction volume last month".
namespaceNoPinecone namespace override.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and openWorldHint=true, so the description's disclosure burden is lower. The description adds context about the Pinecone vector store and the first-step pipeline role, which is valuable beyond annotations.

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, no wasted words. The first sentence defines the tool, the second provides usage instruction. Front-loaded and efficient.

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?

No output schema, but the description indicates what is returned (relevant tables, columns, types, relationships). For a semantic search tool, this is sufficient. The tool is moderately complex (5 params, no nested objects) and the description covers its role adequately.

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 all 5 parameters are documented in the schema. The description reinforces the 'question' parameter by saying 'pass the user question verbatim' but does not add new semantics beyond what the schema provides for other parameters. Baseline 3 is appropriate.

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 clearly states it performs semantic search over the database schema stored in Pinecone, explicitly for text-to-SQL requests. It distinguishes from siblings by positioning itself as the first step and mentioning retrieval of tables, columns, types, and relationships.

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 description explicitly says 'Call this FIRST for any text-to-SQL request', providing clear context for when to use. It doesn't explicitly exclude alternatives like get_table_schema or list_tables, but the 'first step' instruction implies the workflow.

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. Dates show when Glama detected each change.

  1. 3 tool updatesv1.0.0
    • First observedget_table_schema
    • First observedlist_tables
    • First observedsearch_schema

TDQS

A4.3/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: search_schema for semantic discovery, get_table_schema for exact DDL retrieval, and list_tables for inventory. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (search_schema, get_table_schema, list_tables), making them predictable and easy to understand.

Tool Count4/5

Three tools is minimal but appropriate for the focused domain of database schema exploration. Each tool earns its place and covers the essential operations without being overly sparse.

Completeness5/5

The tool set fully covers schema discovery: semantic search, exact schema lookup, and table listing. For the stated purpose of enabling text-to-SQL by providing schema info, there are no obvious gaps.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP-Server from your Database optimized for LLMs and AI-Agents. Supports PostgreSQL, MySQL, ClickHouse, Snowflake, MSSQL, BigQuery, Oracle Database, SQLite, ElasticSearch, DuckDB
    547
    Apache 2.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that allows AI assistants to query databases using natural language by leveraging Vanna AI. It supports secure SSH tunneling, model training on database schemas, and persistent storage of SQL patterns via ChromaDB.
    2
    -
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that connects LLMs to SQL databases for development assistance, enabling query execution, schema exploration, and data manipulation while providing safety controls against destructive operations.
    5
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that exposes relational databases (PostgreSQL/MySQL) to AI agents with natural language to SQL query support.
    19
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/RaviSenjaliya/askDB-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server