Atlas / MCP servers / serdnaley / @serdnaley/metabase-mcp

@serdnaley/metabase-mcpSAFE

mcp/serdnaley/metabase-mcp
Verdict
SAFE
Grade
B
Trust score
87 /100
Exposed tools
128 53r · 53w · 22d
Transport
stdio
License
—
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

MCP server for Metabase — comprehensive coverage of the Metabase REST API for AI assistants.

Metabase ships a built-in MCP for querying data. This project goes further: 128 tools covering dashboards, questions, collections, users, permissions, alerts, settings, and more — so AI assistants can fully manage Metabase, not just read from it.

Features

  • 128 MCP tools across 26 domains: search, databases, tables, collections, cards, dashboards, actions, dataset, users, groups, permissions, segments, revisions, settings, alerts, subscriptions, glossary, documents, timelines, bookmarks, moderation, snippets, x-rays, cache, persistence, uploads
  • Full CRUD: Create, read, update, delete across all domains
  • Admin automation: User/group management, permissions, settings, database connections
  • Read-only mode: Restrict to read-only tools via a single env var
  • Type-safe: HTTP client generated from Metabase's OpenAPI spec
  • Two auth modes: API key (recommended) or email/password session
  • Zero config: Runs via npx — no installation needed

Installation

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
"mcpServers": {
"metabase": {
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}

Restart Claude Desktop after saving.

Claude Code (CLI)

claude mcp add metabase \
--env METABASE_URL=https://your-metabase.example.com \
--env METABASE_API_KEY=mb_xxx \
-- npx -y @serdnaley/metabase-mcp

Or add to .claude/mcp.json:

{
"mcpServers": {
"metabase": {
"ty
Read from source at commit 64a9a00cc48fOBSERVED · 2026-10-12
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add metabase-mcp --env METABASE_API_KEY=${METABASE_API_KEY} --env METABASE_PASSWORD=${METABASE_PASSWORD} -- npx -y @serdnaley/[email protected]
claude-desktop
{
  "mcpServers": {
    "metabase-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@serdnaley/[email protected]"
      ],
      "env": {
        "METABASE_API_KEY": "${METABASE_API_KEY}",
        "METABASE_PASSWORD": "${METABASE_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (128)

53 read · 53 write · 22 destructive. Blast radius: 22 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
add_group_memberwriteAdd a user to a Metabase permission group
copy_cardreadCopy a card to a collection
copy_dashboardreadCopy a dashboard to a collection
create_actionwriteCreate a new action (query or implicit only — HTTP actions are not supported)
create_action_public_linkwriteGenerate a public link for an action form
create_alertwriteCreate an alert on a saved question. Alerts notify recipients via email or Slack when query results meet a condition.
create_bookmarkwriteBookmark a card, dashboard, or collection
create_cardwriteCreate a new question (native SQL or structured query)
create_card_public_linkwriteGenerate a public sharing link for a card. Returns the card with a public_uuid field. The public URL is {metabase_url}/public/question/{uuid}. Public sharing must be enabled in Metabase admin settings.
create_collectionwriteCreate a new collection
create_dashboardwriteCreate a new dashboard
create_dashboard_public_linkwriteGenerate a public sharing link for a dashboard. Returns the dashboard with a public_uuid field. The public URL is {metabase_url}/public/dashboard/{uuid}. Public sharing must be enabled in Metabase admin settings.
create_dashboard_subscriptionwriteCreate an email or Slack subscription for a dashboard. Subscriptions deliver a snapshot of the dashboard on a schedule.
create_databasewriteAdd a new database connection to Metabase
create_documentwriteCreate a narrative analytics document
create_glossary_termwriteCreate a business glossary term
create_groupwriteCreate a new Metabase permission group
create_moderation_reviewdestructiveMark a card or dashboard as verified or remove verification (Pro/Enterprise)
create_segmentwriteCreate a new segment
create_snippetwriteCreate a reusable SQL snippet
create_timelinewriteCreate a timeline for annotating charts
create_timeline_eventwriteCreate an event on a timeline
create_userwriteCreate a new Metabase user
deactivate_userdestructiveDeactivate a Metabase user (soft-delete). The user record is retained but access is disabled.
delete_actiondestructiveDelete an action
delete_action_public_linkdestructiveRemove the public link from an action
delete_alertdestructiveDelete an alert
delete_bookmarkdestructiveRemove a bookmark from a card, dashboard, or collection
delete_carddestructiveDelete a card (question)
delete_card_public_linkdestructiveRemove the public sharing link from a card
delete_dashboarddestructiveDelete a dashboard
delete_dashboard_public_linkdestructiveRemove the public sharing link from a dashboard
delete_dashboard_subscriptiondestructiveDelete a dashboard subscription
delete_databasedestructiveDelete a database connection from Metabase
delete_documentdestructiveDelete a document
delete_glossary_termdestructiveDelete a glossary term
delete_groupdestructiveDelete a Metabase permission group
delete_segmentdestructiveDelete (archive) a segment
delete_snippetdestructiveArchive (soft-delete) a SQL snippet
delete_timelinedestructiveDelete a timeline
delete_timeline_eventdestructiveDelete a timeline event
discard_field_valuesdestructiveClear cached field values for a field
execute_actionwriteRun an action with optional parameters
execute_card_querywriteRun a saved question and return results. For parameterized cards, pass template tag values as key-value pairs (e.g. { fromDate:
execute_querywriteRun an ad-hoc query (native SQL or structured) and return results
generate_xrayreadGenerate an automatic X-ray exploratory dashboard for a table
get_actionreadGet action details
get_activityreadGet recent activity feed (user actions, views, etc.)
get_alertreadGet details of a specific alert
get_cardreadGet card details (query definition, visualization settings)
get_collectionreadGet collection details
get_collection_permissionsreadGet the collection permissions graph (which groups can access which collections)
get_collection_treereadGet the full collection hierarchy as a tree
get_current_userreadGet the currently authenticated Metabase user
get_dashboardreadGet dashboard with all cards and layout
get_databasereadGet database details by ID
get_database_metadatareadGet full database metadata: tables, fields, types, relationships
get_database_schemareadGet tables within a specific database schema
get_documentreadGet a document by ID
get_fieldreadGet field details including type, special type, fingerprint
get_field_valuesreadGet sample values for a field
get_glossary_termreadGet a glossary term by ID
get_permissions_graphwriteGet the full data permissions graph (view-data and create-queries permissions per group per database)
get_segmentreadGet segment by ID
get_settingreadGet a specific Metabase setting value
get_snippetreadGet a SQL snippet by ID
get_tablereadGet table details and field info
get_table_query_metadatareadGet full query metadata for a table (fields, FKs, metrics)
get_taskreadGet details of a specific background task
get_timelinereadGet a timeline by ID
get_userreadGet a Metabase user by ID
invalidate_cachereadInvalidate cached query results
list_actionsreadList all actions
list_alertsreadList all alerts configured in Metabase
list_bookmarksreadList all bookmarks for the current user
list_cardsreadList all saved questions
list_collection_itemsreadList items in a collection (cards, dashboards, sub-collections)
list_collectionsreadList all collections
list_dashboard_subscriptionsreadList email/Slack subscriptions for a dashboard
list_dashboardsreadList all dashboards
list_database_schemasreadList schemas in a database
list_databasesreadList all databases the user has access to
list_documentsreadList all narrative analytics documents
list_glossary_termsreadList all business glossary terms
list_groupsreadList all Metabase permission groups
list_revisionsreadList revision history for a card or dashboard
list_segmentsreadList all segments
list_settingsreadList all Metabase instance settings
list_snippetsreadList all SQL snippets
list_tasksreadList all scheduled background tasks and their status
list_timelinesreadList all timelines
list_usersreadList all Metabase users. Supports optional search query to filter by name or email.
notify_databasewriteSend a post-ETL pipeline notification to trigger a schema sync on a database
persist_modelwriteEnable persistence (materialization) for a model card
reactivate_userreadReactivate a previously deactivated Metabase user
refresh_persisted_modelwriteManually trigger a refresh of the materialized data for a persisted model
remove_group_memberdestructiveRemove a user from a Metabase permission group by membership ID
reorder_fieldswriteSet a custom field ordering for a table by providing an ordered list of field IDs
rescan_field_valueswriteTrigger a re-scan of field values used to populate filter dropdowns
revert_revisionreadRevert a card or dashboard to a prior revision
searchreadSearch across all Metabase entities (cards, dashboards, collections, tables, etc.)
sync_database_schemawriteTrigger a schema resync on a database (use after DDL changes to pick up new or modified tables)
translate_entity_idsreadTranslate serialization entity IDs to API integer IDs
unpersist_modelwriteDisable persistence (materialization) for a model card
update_actionwriteUpdate an action (cannot change type to http)
update_alertwriteUpdate an existing alert. Only the fields you provide will be changed.
update_cache_configwriteUpdate cache strategy for a model (database, dashboard, or card)
update_cardwriteUpdate question query, display, name, or other properties
update_collectionwriteUpdate collection properties
update_collection_permissionswriteUpdate the collection permissions graph. Must include the
update_dashboardwriteUpdate dashboard properties (name, description, filters)
update_dashboard_cardsdestructiveAdd, remove, or reposition cards on a dashboard
update_dashboard_subscriptionwriteUpdate a dashboard subscription (schedule, channels, parameters)
update_databasewriteUpdate an existing database connection configuration
update_documentwriteUpdate a document
update_fieldwriteUpdate field display name, description, semantic type, visibility, or FK target
update_glossary_termwriteUpdate a glossary term
update_groupwriteUpdate the name of a Metabase permission group
update_permissions_graphwriteUpdate the data permissions graph. Must include the
update_segmentwriteUpdate an existing segment
update_settingwriteUpdate a Metabase setting value
update_snippetwriteUpdate a SQL snippet
update_tablewriteUpdate table display name, description, visibility type, or entity type
update_timelinewriteUpdate a timeline
update_timeline_eventwriteUpdate a timeline event
update_userwriteUpdate an existing Metabase user. Only provided fields will be updated.
upload_csvwriteUpload a CSV file as a new table in Metabase
validate_databasereadTest database connection parameters before saving to verify credentials and connectivity
04

Trust audit

SAFEgrade B · trust 87/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (3 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (9)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
create_moderation_review, deactivate_user, delete_action, delete_action_public_link, delete_alert, delete_bookmark, delete_card, delete_card_public_link, delete_dashboard, delete_dashboard_public_link
Why it matters. 22 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/e2e/analytics-workflow.test.ts:3
import { search } from "../../src/services/search.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/e2e/analytics-workflow.test.ts:4
import { getTableQueryMetadata } from "../../src/services/tables.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/e2e/analytics-workflow.test.ts:5
import { createCard, executeCardQuery, deleteCard } from "../../src/services/cards.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/e2e/analytics-workflow.test.ts:6
import { executeQuery } from "../../src/services/dataset.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/e2e/content-management.test.ts:3
import { createCollection, getCollection, listCollectionItems, updateCollection } from "../../src/services/collections.js";
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, openapi-fetch, zod, @types/bun, @types/node, openapi-typescript, typescript
Why it matters. 7 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
generated/metabase-api.d.ts
generated/metabase-api.d.ts
Why it matters. 1380715 bytes not read

Gates applied: no_behavioural_pass, no_license.

Audited 2026-10-12 · audit v0.4.1 · source sha 64a9a00cc48ffull audit observations/trust-audit/mcp-server/serdnaley__metabase-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1264a9a00cc48fSAFEB87first audit
06

Questions

What tools does @serdnaley/metabase-mcp expose?

128 in total: 53 read-only, 53 that write, and 22 that can delete or overwrite (create_moderation_review, deactivate_user, delete_action, delete_action_public_link, delete_alert). Every one is listed on this page with its risk.

Is @serdnaley/metabase-mcp safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (87/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 22 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @serdnaley/metabase-mcp need?

It reads METABASE_API_KEY and METABASE_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does @serdnaley/metabase-mcp run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @serdnaley/metabase-mcp at 0.2.0.

How current is this page?

The grade is for one exact copy of the source (64a9a00cc48f), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement