mcp odbc server
Provides generic Open Database Connectivity (ODBC) to any Database Management System (DBMS) that's accessible via an ODBC Connector (Driver).
Provides generic Open Database Connectivity (ODBC) to any Database Management System (DBMS) that's accessible via an ODBC Connector (Driver).
This document covers the setup and use of a generic ODBC server for the Model Context Protocol (MCP), referred to as an mcp-odbc server. It has been developed to provide Large Language Models with transparent access to ODBC-accessible data sources via a Data Source Name configured for a specific ODBC Connector (or Driver).
This MCP Server for ODBC is a small TypeScript layer built on top of node-odbc
. It routes calls to the host system's local ODBC Driver Manager via node.js (specifically using 'npx' for TypeScript).
While the examples that follow are oriented toward the Virtuoso ODBC Connector, this guide will also work with other ODBC Connectors. We strongly encourage code contributions and usage demo submissions related to other database management systems for incorporation into this project.
nvm install v21.1.0
npm install @modelcontextprotocol/sdk zod tsx odbc dotenv
nvm
version using: nvm alias default 21.1.0
git clone https://github.com/OpenLinkSoftware/mcp-odbc-server.git
cd mcp-odbc-server
npm init -y
"type":"module"
to the package.json
filenpm install @modelcontextprotocol/sdk zod tsx odbc dotenv
odbcinst -j
odbcinst -q -s
As good security practice, you should use the .env
file situated in the same directory as the mcp-ser
to set bindings for the target Large Language Model API Key (if you want to use the OpenLink AI Layer (OPAL) via ODBC), ODBC Data Source Name (ODBC_DSN), User (ODBC_USER), Password (ODBC_PWD), and ODBC INI (ODBCINI).
API_KEY=sk-xxx
ODBC_DSN=Local Virtuoso
ODBC_USER=dba
ODBC_PASSWORD=dba
ODBCINI=/Library/ODBC/odbc.ini
After successful installation, the following tools will be available to MCP client applications.
name | description |
---|---|
get_schemas | List database schemas accessible to connected database management system (DBMS). |
get_tables | List tables associated with a selected database schema. |
describe_table | Provide the description of a table associated with a designated database schema. This includes information about column names, data types, nulls handling, autoincrement, primary key, and foreign keys |
filter_table_names | List tables, based on a substring pattern from the q input field, associated with a selected database schema. |
query_database | Execute a SQL query and return results in JSONL format. |
execute_query | Execute a SQL query and return results in JSONL format. |
execute_query_md | Execute a SQL query and return results in Markdown table format. |
spasql_query | Execute a SPASQL query and return results. |
sparql_query | Execute a SPARQL query and return results. |
virtuoso_support_ai | Interact with the Virtuoso Support Assistant/Agent -- a Virtuoso-specific feature for interacting with LLMs |
user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns a JSON string array of schema names.
get_tables
schema
(string, optional): Database schema to filter tables. Defaults to connection default.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns a JSON string containing table information (e.g., TABLE_CAT, TABLE_SCHEM, TABLE_NAME, TABLE_TYPE).
filter_table_names
q
(string, required): The substring to search for within table names.schema
(string, optional): Database schema to filter tables. Defaults to connection default.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns a JSON string containing information for matching tables.
describe_table
schema
(string, required): The database schema name containing the table.table
(string, required): The name of the table to describe.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns a JSON string describing the table's columns (e.g., COLUMN_NAME, TYPE_NAME, COLUMN_SIZE, IS_NULLABLE).
query_database
query
(string, required): The SQL query string to execute.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns query results as a JSON string.
query_database_md
query
(string, required): The SQL query string to execute.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns query results as a Markdown table string.
query_database_jsonl
query
(string, required): The SQL query string to execute.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns query results as a JSONL string.
spasql_query
query
(string, required): The SPASQL query string.max_rows
(number, optional): Maximum number of rows to return. Defaults to 20.timeout
(number, optional): Query timeout in milliseconds. Defaults to 30000.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns the result from the underlying stored procedure call (e.g., Demo.demo.execute_spasql_query
).
sparql_query
query
(string, required): The SPARQL query string.format
(string, optional): Desired result format. Defaults to 'json'.timeout
(number, optional): Query timeout in milliseconds. Defaults to 30000.user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".Returns the result from the underlying function call (e.g., "UB".dba."sparqlQuery"
).
virtuoso_support_ai
prompt
(string, required): The prompt text for the AI function.api_key
(string, optional): API key for the AI service. Defaults to "none".user
(string, optional): Database username. Defaults to "demo".password
(string, optional): Database password. Defaults to "demo".dsn
(string, optional): ODBC data source name. Defaults to "Local Virtuoso".DEMO.DBA.OAI_VIRTUOSO_SUPPORT_AI
).ODBCINI=/Library/ODBC/odbc.ini npx -y @modelcontextprotocol/inspector npx tsx ./src/main.ts
The path for this config file is: ~{username}/Library/Application Support/Claude/claude_desktop_config.json
.
{
"mcpServers": {
"ODBC": {
"command": "/path/to/.nvm/versions/node/v21.1.0/bin/node",
"args": [
"/path/to/mcp-odbc-server/node_modules/.bin/tsx",
"/path/to/mcp-odbc-server/src/main.ts"
],
"env": {
"ODBCINI": "/Library/ODBC/odbc.ini",
"NODE_VERSION": "v21.1.0",
"PATH": "~/.nvm/versions/node/v21.1.0/bin:${PATH}"
},
"disabled": false,
"autoApprove": []
}
}
}
Execute the following query: SELECT TOP * from Demo..Customers
The path for this config file is: ~{username}/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
{
"mcpServers": {
"ODBC": {
"command": "/path/to/.nvm/versions/node/v21.1.0/bin/node",
"args": [
"/path/to/mcp-odbc-server/node_modules/.bin/tsx",
"/path/to/mcp-odbc-server/src/main.ts"
],
"env": {
"ODBCINI": "/Library/ODBC/odbc.ini",
"NODE_VERSION": "v21.1.0",
"PATH": "/path/to/.nvm/versions/node/v21.1.0/bin:${PATH}"
},
"disabled": false,
"autoApprove": []
}
}
}
Use the settings gear to open the configuration menu that includes the MCP menu item for registering and configuring mcp servers
.
Command or Control + I
key combination to open the Chat InterfaceAgent
from the drop-down at the bottom left of the UI, since the default is Ask
mcp-server for odbc
using the pattern: @odbc {rest-of-prompt}