npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ruminaider/metabase-mcp-server

v0.1.0

Published

A comprehensive MCP server for Metabase with full read/write support

Downloads

18

Readme

metabase-mcp-server

A comprehensive MCP server for Metabase with full read/write support -- 46 tools for cards, dashboards, databases, collections, queries, and more.

npm version License: MIT

Quick Start

Using npx

Add to your .mcp.json:

{
  "mcpServers": {
    "metabase": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@ruminaider/metabase-mcp-server"],
      "env": {
        "METABASE_URL": "https://your-instance.metabaseapp.com",
        "METABASE_API_KEY": "your-api-key"
      }
    }
  }
}

Using Docker

docker build -t metabase-mcp-server .
{
  "mcpServers": {
    "metabase": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "METABASE_URL", "-e", "METABASE_API_KEY", "metabase-mcp-server"],
      "env": {
        "METABASE_URL": "https://your-instance.metabaseapp.com",
        "METABASE_API_KEY": "your-api-key"
      }
    }
  }
}

Authentication

The server supports three authentication methods, tried in priority order:

| Priority | Method | Environment Variables | Notes | |----------|--------|-----------------------|-------| | 1 | API Key | METABASE_API_KEY | Recommended. Create one in Metabase Admin > Settings > Authentication > API Keys. | | 2 | Session Token | METABASE_SESSION_TOKEN | Short-lived token from the Metabase API (POST /api/session). | | 3 | Email + Password | METABASE_USER_EMAIL + METABASE_PASSWORD | The server exchanges credentials for a session token on startup. |

Configuration

| Variable | Required | Description | |----------|----------|-------------| | METABASE_URL | Yes | Metabase instance URL (e.g. https://analytics.example.com) | | METABASE_API_KEY | * | API key for authentication | | METABASE_SESSION_TOKEN | * | Session token for authentication | | METABASE_USER_EMAIL | * | Email for email/password authentication | | METABASE_PASSWORD | * | Password (required when METABASE_USER_EMAIL is set) | | METABASE_READ_ONLY | No | Set to true to block all write operations (default: false) | | METABASE_CACHE_TTL_MS | No | Cache TTL in milliseconds for schema data (default: 600000 / 10 minutes) |

* At least one authentication method is required.

Read-Only Mode

Set METABASE_READ_ONLY=true to block all write operations. The server will reject any tool call that would create, update, archive, or delete content, returning a clear error message. This is useful for providing safe, read-only access to your Metabase instance.

Write-protected tools include: create_card, update_card, archive_card, copy_card, create_dashboard, update_dashboard, archive_dashboard, copy_dashboard, update_dashboard_cards, create_collection, update_collection, update_field, revert_revision, toggle_bookmark, and invalidate_cache.

Performance

Response Optimization

All responses are automatically optimized to reduce token usage:

  • List responses strip query definitions, visualization settings, creator details, and other metadata -- returning only identifiers and essential fields.
  • Detail responses strip result_metadata (column fingerprints), embedding params, permission booleans, and other bloat while keeping functional fields like queries and parameters.
  • Query results are flattened from Metabase's {rows: [[v1,v2]], cols: [{name:"a"}]} format into [{"a": v1, "b": v2}] -- eliminating column metadata overhead.
  • All responses use compact JSON (no whitespace).

Caching

Schema exploration data is cached in-memory with a configurable TTL (default: 10 minutes):

  • Databases, database metadata, schemas, and schema tables
  • Tables, table metadata, foreign keys, fields, and field values
  • Collection tree

Cards, dashboards, search results, and query results are NOT cached -- these change frequently and staleness causes bugs.

Cache entries expire automatically. Write operations (update_field) invalidate relevant cache entries immediately. Configure TTL with METABASE_CACHE_TTL_MS.

Batch Retrieval

get_card, get_dashboard, and get_table accept either a single ID or an array of IDs:

{ "id": 42 }
{ "id": [42, 43, 44] }

When multiple IDs are passed, requests are executed concurrently (max 5 at a time) with individual error handling -- one failed ID won't abort the batch.

Tools

Cards (Saved Questions) -- 10 tools

| Tool | Description | |------|-------------| | list_cards | List saved questions/cards, with optional category filter | | get_card | Get a card by ID or batch-fetch multiple cards by ID array | | create_card | Create a new saved question/card | | update_card | Update a card's name, description, query, display, or collection | | copy_card | Duplicate a saved question/card | | execute_card | Execute a saved question and return results (max 2000 rows) | | export_card_results | Execute a card and export results as CSV, JSON, or XLSX (up to 1M rows) | | get_card_metadata | Get field, database, and table metadata for a card's query | | list_card_dashboards | List all dashboards that contain a specific card | | archive_card | Archive (soft-delete) a card |

Dashboards -- 8 tools

| Tool | Description | |------|-------------| | list_dashboards | List all dashboards, with optional category filter | | get_dashboard | Get a dashboard by ID or batch-fetch multiple dashboards by ID array | | create_dashboard | Create a new dashboard | | update_dashboard | Update a dashboard's name, description, parameters, or collection | | copy_dashboard | Duplicate a dashboard, optionally to a different collection | | update_dashboard_cards | Set the full list of cards on a dashboard (add, remove, reposition, resize) | | archive_dashboard | Archive (soft-delete) a dashboard | | get_dashboard_metadata | Get consolidated query metadata for all cards on a dashboard |

Databases -- 5 tools

| Tool | Description | |------|-------------| | list_databases | List all connected databases | | get_database | Get details for a specific database | | get_database_metadata | Get full metadata including all tables, fields, and foreign keys | | list_database_schemas | List all schemas in a database | | list_schema_tables | List all tables in a specific schema |

Tables & Fields -- 7 tools

| Tool | Description | |------|-------------| | list_tables | List all tables across all databases | | get_table | Get a table by ID or batch-fetch multiple tables by ID array | | get_table_metadata | Get full metadata including fields, foreign keys, and field values | | get_table_fks | Get all foreign key relationships for a table | | get_field | Get details for a specific field | | get_field_values | Get distinct values for a field | | update_field | Update a field's display name, description, semantic type, or visibility |

Queries -- 3 tools

| Tool | Description | |------|-------------| | execute_query | Execute a native SQL query (max 2000 rows) | | export_query_results | Execute a SQL query and export as CSV, JSON, or XLSX (up to 1M rows) | | convert_to_native_sql | Convert an MBQL query to native SQL |

Collections -- 6 tools

| Tool | Description | |------|-------------| | list_collections | List all collections (folders) | | get_collection | Get details for a collection (use "root" for the root collection) | | get_collection_items | List items in a collection, with type filtering and pagination | | get_collection_tree | Get the full collection hierarchy as a tree | | create_collection | Create a new collection | | update_collection | Update a collection's name, description, color, or archived status |

Search & Activity -- 4 tools

| Tool | Description | |------|-------------| | search | Search across all content types (cards, dashboards, collections, tables, databases) | | get_recent_views | Get recently viewed items for the current user | | get_current_user | Get details about the currently authenticated user | | invalidate_cache | Invalidate cached query results for a database or dashboard |

Revisions & Bookmarks -- 3 tools

| Tool | Description | |------|-------------| | get_revisions | Get the revision history for a card or dashboard | | revert_revision | Revert a card or dashboard to a previous revision | | toggle_bookmark | Add or remove a bookmark on a card, dashboard, or collection |

Development

pnpm install       # install dependencies
pnpm build         # compile TypeScript
pnpm test          # run tests
pnpm dev           # watch mode (recompile on change)
pnpm lint          # lint with Biome
pnpm lint:fix      # auto-fix lint issues
pnpm typecheck     # type-check without emitting

Project Structure

src/
  index.ts                   # Entry point (stdio transport)
  server.ts                  # MCP server creation and tool registration
  config.ts                  # Environment variable parsing and auth detection
  services/
    metabase-client.ts       # HTTP client with auth, retry, and error handling
    card-service.ts          # Card (saved question) CRUD and execution
    collection-service.ts    # Collection CRUD and tree navigation
    dashboard-service.ts     # Dashboard CRUD and card management
    database-service.ts      # Database and schema introspection
    query-service.ts         # Raw SQL execution and export
    revision-service.ts      # Revision history, revert, and bookmarks
    search-service.ts        # Cross-content search and activity
    table-service.ts         # Table/field introspection and metadata
    *.test.ts                # Unit tests for each service
  tools/
    index.ts                 # Wires all tool categories into the MCP server
    card-tools.ts            # Card tool definitions
    collection-tools.ts      # Collection tool definitions
    dashboard-tools.ts       # Dashboard tool definitions
    database-tools.ts        # Database tool definitions
    query-tools.ts           # Query tool definitions
    revision-tools.ts        # Revision/bookmark tool definitions
    search-tools.ts          # Search/activity tool definitions
    table-tools.ts           # Table/field tool definitions
  utils/
    batch.ts                 # Concurrent batch processing with configurable concurrency
    cache.ts                 # In-memory TTL cache for schema exploration data
    errors.ts                # Custom error types (AuthenticationError, NotFoundError, etc.)
    logger.ts                # Structured stderr logging (safe for stdio MCP transport)
    read-only-guard.ts       # Write-operation guard for read-only mode
    response.ts              # Response optimization (field stripping, query flattening, compact JSON)
    retry.ts                 # Exponential backoff retry for transient failures

Adding a New Tool

  1. Add or extend a service method in src/services/
  2. Register the tool in the appropriate src/tools/*-tools.ts file using server.tool()
  3. Increment the return count in the registration function
  4. If adding a new tool category, import and call the registration function in src/tools/index.ts
  5. Run pnpm build && pnpm test to verify

License

MIT