MCP (Model Context Protocol) is a standard way for a server to advertise a set of callable tools. aidb.import_mcp_tools() registers an external MCP server and imports the tools it advertises, so your agents can call them alongside AIDB's own native and SQL tools:
SELECT aidb.import_mcp_tools( name => 'weather', url => 'https://weather.example.com/mcp', transport => 'streamable_http', -- optional; 'streamable_http' or 'sse' (see below). Default: 'streamable_http' headers => NULL, -- optional; request headers to send, for example, an auth token. Mutually exclusive with headers_env. Default: NULL tool_filter => NULL, -- optional; import only these tool names. Default: NULL (import everything the server advertises) headers_env => NULL -- optional; env var holding the headers JSON instead of storing it. Mutually exclusive with headers. Default: NULL ); SELECT aidb.create_agent('trip_planner', 'Help plan trips, checking weather when useful.', 'my_gpt', tools => ARRAY['get_forecast']); -- a tool the weather server advertised
| Parameter | Type | Default | Description |
|---|---|---|---|
name | TEXT | Required | Unique name for the server registration. |
url | TEXT | Required | The server's MCP endpoint URL. |
transport | TEXT | 'streamable_http' | 'streamable_http' or 'sse' — only 'streamable_http' is fully supported today. |
headers | JSONB | NULL | Request headers to send, for example, {"Authorization": "Bearer ..."}. Mutually exclusive with headers_env. |
tool_filter | TEXT | NULL | Import only these tool names. Omit to import everything the server advertises. |
headers_env | TEXT | NULL | Name of an environment variable holding the headers JSON, read fresh on each use instead of storing it. Mutually exclusive with headers. |
import_mcp_tools validates the server by calling its tools/list endpoint before registering anything — if it's unreachable or advertises nothing matching tool_filter, nothing is stored. The tools it returns are cached immediately, so they show up in aidb.tools right away rather than after a separate refresh.
Only the streamable_http transport (the default) actually works end-to-end today; sse is accepted as a value but isn't fully implemented yet.
Reaching an MCP server is an outbound network call — subject to the same aidb.egress_allowlist restriction as model provider calls and HuggingFace downloads.
Authentication
Pass headers for a server that needs specific request headers (most commonly an Authorization bearer token):
SELECT aidb.import_mcp_tools( name => 'internal_crm', url => 'https://crm.internal.example.com/mcp', headers => '{"Authorization": "Bearer sk-..."}'::JSONB );
headers is stored in aidb.mcp_registry, but aidb_users has no SELECT access to that column — only AIDB's own internal calls (to validate, refresh, or invoke the server's tools) can read it back.
Note
Prefer not to store the secret in the table at all? Pass headers_env instead: name an environment variable (read fresh from the Postgres process's own environment on every call) holding a JSON object of headers, in the same shape headers would take. headers and headers_env are mutually exclusive. The variable's name must start with the prefix configured by aidb.env_var_allowed_prefix (AIDB_ by default) — the same mechanism and GUC used by credentials_env for model credentials.
Filtering which tools are imported
By default, every tool the server advertises is imported. Pass tool_filter to import only specific ones by name:
SELECT aidb.import_mcp_tools( name => 'weather', url => 'https://weather.example.com/mcp', tool_filter => ARRAY['get_forecast', 'get_alerts'] );
Keeping the tool list current
AIDB doesn't re-fetch a server's tool list on every query — aidb.tools only shows entries cached within the last 60 minutes, so a SELECT never has a network side effect. Call aidb.refresh_mcp_tools() to re-fetch and update the cache on demand (for example, after the server adds a new tool):
SELECT aidb.refresh_mcp_tools('weather');
It returns the number of tools now cached (after tool_filter applies). Changing a server's registration — its url, transport, headers, or tool_filter, via re-running import_mcp_tools-equivalent settings — also invalidates its cache automatically.
Removing a server
SELECT aidb.delete_tool('weather');
Deleting an MCP server removes every tool it advertised along with it — there's no way to remove just one of its tools individually; use tool_filter to curate which of its tools are exposed instead.
Exposing AIDB's own tools over MCP
aidb.get_mcp_tools() returns every tool currently in aidb.tools (native, SQL, and imported MCP tools alike), reshaped as MCP tools/list line items — useful if some other system needs AIDB's tool catalog in MCP's own descriptor format:
SELECT * FROM aidb.get_mcp_tools();
This only converts AIDB's tool catalog into MCP's descriptor shape — AIDB doesn't run an MCP server endpoint of its own that an external MCP client could connect to and actually invoke these tools over the network.