askDB
askDB is an MCP server that retrieves the relevant database schema (DDL) for a natural-language data question, so an LLM can write accurate SQL — it does not connect to your database or generate SQL itself.
search_schema: semantically search the Pinecone schema index using the user's question, optionally restricted to specific tables or a database.
get_table_schema: fetch full stored DDL by exact table name when the target table is already known.
list_tables: list the available schema inventory grouped by database, useful for orientation or when search returns nothing.
Asks instead of guessing: when retrieval is ambiguous, it returns a shortlist and prompts the user to choose which tables they mean; can be disabled with
ASK_WHEN_UNSURE=false.Handles fuzzy/partial table names: suggests real table names when an exact match doesn't exist.
Duplicate-environment handling: collapses
*_live/*_testduplicates and notes the other location.Token-efficient output: budgets table counts, per-table characters, and total response size to keep context lean.
Standing instructions: sends usage rules once via MCP instructions rather than repeating them in every result.
Caching and warm-up: repeats are fast; the schema inventory is primed in the background after startup.
Runs locally over stdio or hosted on Vercel over HTTP, with bearer-token auth when hosted.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@askDBWhat tables and columns are needed to list all users with their recent orders?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 SQLRuns two ways from the same code: locally over stdio, or hosted on Vercel over HTTP.
Tools
Tool | When the model uses it | Input |
| First call for any text-to-SQL request |
|
| The table is known — usually the user said so |
|
| Orientation, or when search comes back empty |
|
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 |
| 9,081 tok | 2,221 tok |
| 1,712 tok | 679 tok |
| ~3,000 tok | 822 tok |
| — | 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_TABLEStables per answer,MAX_CHARS_PER_TABLEeach,MAX_RESPONSE_CHARSoverall, with a pointer todetail: "full"when something is clipped.list_tablescaps names and prefersfilter.
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 installThen create .env next to the server with your Pinecone key — everything else has a default:
PINECONE_API_KEY=...
PINECONE_INDEX=ask-db
SQL_DIALECT=MySQLClaude 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 --prod3. Set environment variables
Project Settings → Environment Variables, scoped to Production (add Preview too if you want preview deploys to work):
Variable | Value |
| your Pinecone key |
| the token from step 1 |
| optional, e.g. |
| optional, e.g. |
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 .envConnect 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 |
| — | Required |
| — | Required when hosted; unused over stdio |
|
| |
| (default ns) | |
|
| Chunks retrieved per search |
|
| Must match the model you upserted with |
| (all) | Scope every lookup to one database |
|
| Passed to the model as a hint |
| (auto-detected) | Candidate metadata keys, tried in order |
|
| Cap on |
Output budget — lower these to spend fewer tokens, raise them to see more schema at once:
Variable | Default | Notes |
|
| Tables rendered in one answer |
|
| Per-table DDL cap in |
|
| Whole-response cap |
|
| Names printed by |
|
| In-process cache for searches, fetches and the inventory; |
|
| How long a search waits for a table scan still warming up; |
|
| Record batches fetched in parallel while scanning |
When to ask rather than guess:
Variable | Default | Notes |
|
|
|
|
| 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 |
|
| Length of the shortlist |
|
| Extra absolute floor; |
|
| 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 |
stdio entry point | |
Tool definitions — the MCP surface | |
Retrieval: search, exact fetch, field detection, warm-up | |
Table-name matching over the inventory | |
Renders hits into the schema block the model reads | |
In-process TTL cache for Pinecone round trips | |
Env loading and defaults | |
Hosted MCP endpoint — | |
Hosted config check — | |
Routing and function duration |
Available Tools
3 toolsget_table_schemaGet schema for specific tablesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tables | Yes | Exact table names, e.g. ["tbl_account", "tbl_order"]. | |
| database | No | Restrict to one database/schema — omit to search all of them. | |
| namespace | No | Pinecone namespace override. |
TDQS
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.
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.
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.
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.
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.
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 tablesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Restrict to one database/schema — omit to search all of them. | |
| namespace | No | Pinecone namespace override. |
TDQS
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.
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.
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.
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.
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.
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 schemaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | How many schema chunks to retrieve (default 8). | |
| tables | No | Restrict the search to these table names, when you already know them. | |
| database | No | Restrict to one database/schema — omit to search all of them. | |
| question | Yes | The natural-language data question, e.g. "top 10 accounts by transaction volume last month". | |
| namespace | No | Pinecone namespace override. |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v1.0.0- First observed
get_table_schema - First observed
list_tables - First observed
search_schema
TDQS
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.
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.
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.
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
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
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
The Instant MCP server is a wrapper around the Instant Platform SDK that enables creating, managing, and updating InstantDB applications directly within an editor. It provides tools for fetching rules files for LLMs, retrieving and pushing app schemas, managing permission rules, and executing database queries. Key capabilities include schema management (get-schema, push-schema), permission management (get-perms, push-perms), query execution, and listing recent query history.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP-Server from your Database optimized for LLMs and AI-Agents. Supports PostgreSQL, MySQL, ClickHouse, Snowflake, MSSQL, BigQuery, Oracle Database, SQLite, ElasticSearch, DuckDB547Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn 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-
- FlicenseAqualityDmaintenanceAn 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-
- FlicenseNot gradedqualityBmaintenanceAn MCP server that exposes relational databases (PostgreSQL/MySQL) to AI agents with natural language to SQL query support.19-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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