Supabase MCP server tool surface audit

A96/100composite score
Token footprint
~3,328
Tools
19
Findings
27
Scanned

Engine mcp-surface-lint@0.3.3 · reported as supabase v0.11.0

Supabase's MCP server publishes 19 tools. Loaded into a conversation, those definitions occupy roughly 3,328 tokens of context before anyone types a word. MCP Surface Lint scores that surface 96 out of 100 (grade A), with 27 scored findings spread across 3 of the six rule categories.

Its strongest category is surface at 100/100; the weakest is design at 88/100. It is catalogued here under Data and Databases, alongside other servers agents reach for in the same kind of work.

Token footprint

Measured against a 200,000-token window, the surface consumes about 2% of it before the conversation starts, and keeps consuming it on every turn. That averages 175 tokens per tool definition, counted with the o200k_base encoding.

That lands exactly on the Data and Databases median of 3,328 tokens.

surface100
naming100
descriptions97
schemas92
annotations100
design88

Findings

Every finding below names the rule behind it and the tool it fired on.

17 findings come from `schemas/param-desc-missing`. Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes. On this surface it fires on `get_cost`, `confirm_cost` and `list_tables`, among 11 others.

`design/list-no-limit` accounts for 9 findings. A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less. On this surface it fires on `search_docs`, `list_organizations` and `list_projects`, among 6 others.

`descriptions/too-long` contributes one finding. Very long tool descriptions are paid for in every conversation. Detail that only matters once a parameter is used belongs in that parameter's description. On this surface it fires on `search_docs`.

warn 27 findings

Findings that measurably degrade tool selection.

Description is 1809 chars (maximum 1500) — move detail into parameter descriptions.

Very long tool descriptions are paid for in every conversation. Detail that only matters once a parameter is used belongs in that parameter's description.

"search_docs" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_organizations
"list_organizations" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

"list_projects" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

"list_tables" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_extensions
"list_extensions" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_migrations
"list_migrations" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

"query_logs" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_edge_functions
"list_edge_functions" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

"list_branches" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

Parameter "type" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "type" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "recurrence" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "amount" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missingget_publishable_keys
Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinggenerate_typescript_types
Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinglist_edge_functions
Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "function_slug" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "project_id" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

info 1 finding

Advisory only — these deduct nothing from the score.

Enum [project, branch] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

get_cost/properties/type; confirm_cost/properties/type

What this surface does well

Supabase scores a full 100 in surface, naming and annotations, which is to say the surface stays inside a sensible tool and token budget, the tool names follow one convention end to end and read and write operations are machine-distinguishable before a client runs them.

Tool inventory

Cost is concentrated in `query_logs`: 795 tokens, some 24% of everything Supabase ships, while `list_organizations` costs 83. Every tool carries a description, ranging from 31 to 1,809 characters.

All 19 declare annotations, so a client can tell a read from a write before running one. Across the surface, schemas carry 1 top-level parameters on average and reach a maximum depth of 2; 2 tools take no input.

All 19 tools as published, heaviest first. Token counts use the o200k_base encoding and are approximate.

Every tool on this surface with its token cost and schema shape.
ToolTokensDescriptionParamsRequiredDepthAnnotations
query_logs795493 chars421yes
search_docs4821809 chars111yes
list_tables188168 chars332yes
get_advisors180385 chars221yes
get_publishable_keys172435 chars111yes
confirm_cost161220 chars331yes
get_cost148198 chars221yes
execute_sql142198 chars221yes
list_branches115179 chars111yes
get_edge_function10967 chars221yes
get_organization9861 chars111yes
list_projects98126 chars000yes
generate_typescript_types9541 chars111yes
get_project9536 chars111yes
list_edge_functions9447 chars111yes
get_project_url9231 chars111yes
list_migrations9037 chars111yes
list_extensions8937 chars111yes
list_organizations8353 chars000yes

How this compares

Within Data and Databases this is rank 2 of 3 scanned servers — exactly on the category median of 96.

The closest comparisons in this directory are MongoDB, PostgreSQL and Brave Search, which sit nearest on score and face the same kind of surface-design pressure.

Category
Data and Databases
Rank in category
2
Category median score
96
Category median tokens
3,328
Want this surface fixed, not just measured?

A fix plan turns these findings into an ordered set of changes with the token saving of each one.

Get a fix plan

This page is a static analysis of Supabase's published tools/list surface on the date shown. It is not a security review, a performance benchmark, or a judgement of the product behind the surface. Read how the score is computed, or browse every audited server.