{"_id":"@serdnaley/metabase-mcp","_rev":"4-9eb25a850d61511d9a086fc4beef7ba1","name":"@serdnaley/metabase-mcp","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@serdnaley/metabase-mcp","version":"0.1.0","keywords":["metabase","mcp","model-context-protocol","ai","dashboards"],"license":"MIT","_id":"@serdnaley/metabase-mcp@0.1.0","maintainers":[{"name":"serdnaley","email":"serdnaley@gmail.com"}],"homepage":"https://github.com/serdnaley/metabase-mcp#readme","bugs":{"url":"https://github.com/serdnaley/metabase-mcp/issues"},"bin":{"metabase-mcp":"dist/index.js"},"dist":{"shasum":"61fb67917c367975592e3717eef8d3474ecea389","tarball":"https://registry.npmjs.org/@serdnaley/metabase-mcp/-/metabase-mcp-0.1.0.tgz","fileCount":3,"integrity":"sha512-JQm2IMqCxoFezzjfUifc4GJHJ6fJIzY9v6KXwI6eUp3NVi82stUTHqunkLMz0sd4duGeQk7iaOvRAmtCjCUHsw==","signatures":[{"sig":"MEUCIC1Leg2+APTletknP/dkpj02OF+nPjj64YCykycpRlCJAiEAoWaLdhd0luXIKTCgBWSobswMwEBrUzvoVP1IECVEdnI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1037445},"type":"module","gitHead":"a3bdd3927bdd238fde0c4dc864d3e9432885c33d","scripts":{"dev":"bun run src/index.ts","test":"bun test","build":"bun build src/index.ts --outdir dist --target node","test:setup":"bun run tests/setup.ts","generate-types":"bun run scripts/generate-types.ts","prepublishOnly":"bun run build"},"_npmUser":{"name":"serdnaley","email":"serdnaley@gmail.com"},"repository":{"url":"git+https://github.com/serdnaley/metabase-mcp.git","type":"git"},"_npmVersion":"10.8.3","description":"MCP server for Metabase — extends the built-in MCP with write tools for managing dashboards, questions, collections, and actions","directories":{},"_nodeVersion":"24.14.0","dependencies":{"zod":"^4.3.6","openapi-fetch":"^0.17.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6.0.2","@types/node":"^25.5.2","openapi-typescript":"^7.13.0"},"_npmOperationalInternal":{"tmp":"tmp/metabase-mcp_0.1.0_1775245085371_0.8735404430701741","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@serdnaley/metabase-mcp","version":"0.1.4","keywords":["metabase","mcp","model-context-protocol","ai","dashboards"],"license":"MIT","_id":"@serdnaley/metabase-mcp@0.1.4","maintainers":[{"name":"serdnaley","email":"serdnaley@gmail.com"}],"homepage":"https://github.com/Serdnaley/metabase-mcp#readme","bugs":{"url":"https://github.com/Serdnaley/metabase-mcp/issues"},"bin":{"metabase-mcp":"dist/index.js"},"dist":{"shasum":"a017002660e38a91e49c57bd93302acae4973016","tarball":"https://registry.npmjs.org/@serdnaley/metabase-mcp/-/metabase-mcp-0.1.4.tgz","fileCount":3,"integrity":"sha512-mGHwnWkFrR14wRw166tTHJyNiGrJh8a8Zx71zHg449OfnI7rHD+klnVOU2gWi37ee6gqIrkf1o+IEQ880+ypPQ==","signatures":[{"sig":"MEYCIQDYcaFNIbzPv7EsF9Llo9nIyJI+VXFA+FHuiKd6DxwnLwIhAPJr9vLI4kdWSHaSTv5Uw/em0migVG2hNamq2PKbirsW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@serdnaley%2fmetabase-mcp@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1038562},"type":"module","gitHead":"fd5a8a539bc7a49fb4d78e5b822bb18d0aa2740e","scripts":{"dev":"bun run src/index.ts","test":"bun test","build":"bun build src/index.ts --outdir dist --target node","test:setup":"bun run tests/setup.ts","generate-types":"bun run scripts/generate-types.ts","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3841270a-5bcd-4e7a-9a2a-c4829fac0f87"}},"repository":{"url":"git+https://github.com/Serdnaley/metabase-mcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server for Metabase — extends the built-in MCP with write tools for managing dashboards, questions, collections, and actions","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.3.6","openapi-fetch":"^0.17.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6.0.2","@types/node":"^25.5.2","openapi-typescript":"^7.13.0"},"_npmOperationalInternal":{"tmp":"tmp/metabase-mcp_0.1.4_1775249404693_0.38998929265098337","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@serdnaley/metabase-mcp","version":"0.1.5","keywords":["metabase","mcp","model-context-protocol","ai","dashboards"],"license":"MIT","_id":"@serdnaley/metabase-mcp@0.1.5","maintainers":[{"name":"serdnaley","email":"serdnaley@gmail.com"}],"homepage":"https://github.com/Serdnaley/metabase-mcp#readme","bugs":{"url":"https://github.com/Serdnaley/metabase-mcp/issues"},"bin":{"metabase-mcp":"dist/index.js"},"dist":{"shasum":"53ad108a80a5499b5a83d9adf916544cfd96fc6e","tarball":"https://registry.npmjs.org/@serdnaley/metabase-mcp/-/metabase-mcp-0.1.5.tgz","fileCount":3,"integrity":"sha512-9buNtxe+IhoUCsrtXvTq/bGca8jrnDsrzyVDiffKLFrKEkgcbNi+66KAiXK0O5Cu16tPEx5PIXvLlHZVCaMoSg==","signatures":[{"sig":"MEUCIQCroPKGXZGBnbat5P8Gu9usj3Xzel01x4aM7+3FGxThsgIgLJjo8w4iDE4eRJuPKfr17cTCrm6V3evzkashvsAYuvo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@serdnaley%2fmetabase-mcp@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1044021},"type":"module","gitHead":"d376c00a4372d758aba0eeab33aaf22b18736ad6","scripts":{"dev":"bun run src/index.ts","test":"bun test","build":"bun build src/index.ts --outdir dist --target node","test:setup":"bun run tests/setup.ts","generate-types":"bun run scripts/generate-types.ts","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3841270a-5bcd-4e7a-9a2a-c4829fac0f87"}},"repository":{"url":"git+https://github.com/Serdnaley/metabase-mcp.git","type":"git"},"_npmVersion":"11.11.0","description":"MCP server for Metabase — extends the built-in MCP with write tools for managing dashboards, questions, collections, and actions","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.3.6","openapi-fetch":"^0.17.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^6.0.2","@types/node":"^25.5.2","openapi-typescript":"^7.13.0"},"_npmOperationalInternal":{"tmp":"tmp/metabase-mcp_0.1.5_1775755277667_0.4305056931953972","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@serdnaley/metabase-mcp","version":"0.2.0","description":"MCP server for Metabase — 128 tools for full API coverage: dashboards, questions, collections, users, permissions, alerts, settings, and more","type":"module","scripts":{"generate-types":"bun run scripts/generate-types.ts","build":"bun build src/index.ts --outdir dist --target node","dev":"bun run src/index.ts","prepublishOnly":"bun run build","test":"bun test","test:setup":"bun run tests/setup.ts"},"bin":{"metabase-mcp":"dist/index.js"},"keywords":["metabase","mcp","model-context-protocol","ai","dashboards"],"license":"MIT","publishConfig":{"access":"public","provenance":true},"repository":{"type":"git","url":"git+https://github.com/Serdnaley/metabase-mcp.git"},"devDependencies":{"@types/bun":"latest","@types/node":"^25.5.2","openapi-typescript":"^7.13.0","typescript":"^6.0.2"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","openapi-fetch":"^0.17.0","zod":"^4.3.6"},"gitHead":"379f41a2b5dfe5f6d6e39cbdab89ca1a011b15bf","_id":"@serdnaley/metabase-mcp@0.2.0","bugs":{"url":"https://github.com/Serdnaley/metabase-mcp/issues"},"homepage":"https://github.com/Serdnaley/metabase-mcp#readme","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-qF3rj5q+loQL7HMxxKQ/PNNhvGZiy7YuHiWNJMhb1367fI5iqbElBULJ7H4loRGruW998dQLK+ozj0oFIEGjdA==","shasum":"f94bee8fc2956c64127b9868937228fa259fbe5a","tarball":"https://registry.npmjs.org/@serdnaley/metabase-mcp/-/metabase-mcp-0.2.0.tgz","fileCount":3,"unpackedSize":1122646,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@serdnaley%2fmetabase-mcp@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCID2blG5Zkzy0VHR6zNeRJx/iWFiHVc3KK4aARJWZuJk9AiEAnLbqFOQaPmuYQT1BTlom0WV1ICDUgSUCg8xZy5yvaFg="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3841270a-5bcd-4e7a-9a2a-c4829fac0f87"}},"directories":{},"maintainers":[{"name":"serdnaley","email":"serdnaley@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/metabase-mcp_0.2.0_1776327128401_0.32902148640264883"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-03T19:38:05.305Z","modified":"2026-04-16T08:12:08.835Z","0.1.0":"2026-04-03T19:38:05.561Z","0.1.4":"2026-04-03T20:50:04.860Z","0.1.5":"2026-04-09T17:21:17.880Z","0.2.0":"2026-04-16T08:12:08.565Z"},"bugs":{"url":"https://github.com/Serdnaley/metabase-mcp/issues"},"license":"MIT","homepage":"https://github.com/Serdnaley/metabase-mcp#readme","keywords":["metabase","mcp","model-context-protocol","ai","dashboards"],"repository":{"type":"git","url":"git+https://github.com/Serdnaley/metabase-mcp.git"},"description":"MCP server for Metabase — 128 tools for full API coverage: dashboards, questions, collections, users, permissions, alerts, settings, and more","maintainers":[{"name":"serdnaley","email":"serdnaley@gmail.com"}],"readme":"# @serdnaley/metabase-mcp\n\nMCP server for Metabase — comprehensive coverage of the Metabase REST API for AI assistants.\n\nMetabase ships a [built-in MCP](https://www.metabase.com/docs/master/ai/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.\n\n## Features\n\n- **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\n- **Full CRUD**: Create, read, update, delete across all domains\n- **Admin automation**: User/group management, permissions, settings, database connections\n- **Read-only mode**: Restrict to read-only tools via a single env var\n- **Type-safe**: HTTP client generated from Metabase's OpenAPI spec\n- **Two auth modes**: API key (recommended) or email/password session\n- **Zero config**: Runs via `npx` — no installation needed\n\n## Installation\n\n<details>\n<summary><strong>Claude Desktop</strong></summary>\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"metabase\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@serdnaley/metabase-mcp\"],\n      \"env\": {\n        \"METABASE_URL\": \"https://your-metabase.example.com\",\n        \"METABASE_API_KEY\": \"mb_xxx\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop after saving.\n\n</details>\n\n<details>\n<summary><strong>Claude Code (CLI)</strong></summary>\n\n```bash\nclaude mcp add metabase \\\n  --env METABASE_URL=https://your-metabase.example.com \\\n  --env METABASE_API_KEY=mb_xxx \\\n  -- npx -y @serdnaley/metabase-mcp\n```\n\nOr add to `.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"metabase\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@serdnaley/metabase-mcp\"],\n      \"env\": {\n        \"METABASE_URL\": \"https://your-metabase.example.com\",\n        \"METABASE_API_KEY\": \"mb_xxx\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Cursor</strong></summary>\n\nAdd to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project):\n\n```json\n{\n  \"mcpServers\": {\n    \"metabase\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@serdnaley/metabase-mcp\"],\n      \"env\": {\n        \"METABASE_URL\": \"https://your-metabase.example.com\",\n        \"METABASE_API_KEY\": \"mb_xxx\"\n      }\n    }\n  }\n}\n```\n\nRestart Cursor after saving.\n\n</details>\n\n<details>\n<summary><strong>Windsurf</strong></summary>\n\nAdd to `~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"metabase\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@serdnaley/metabase-mcp\"],\n      \"env\": {\n        \"METABASE_URL\": \"https://your-metabase.example.com\",\n        \"METABASE_API_KEY\": \"mb_xxx\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Cline (VS Code)</strong></summary>\n\nAdd to your Cline MCP settings (accessible via the MCP Servers icon):\n\n```json\n{\n  \"mcpServers\": {\n    \"metabase\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@serdnaley/metabase-mcp\"],\n      \"env\": {\n        \"METABASE_URL\": \"https://your-metabase.example.com\",\n        \"METABASE_API_KEY\": \"mb_xxx\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Continue (VS Code)</strong></summary>\n\nAdd to `.continue/config.yaml`:\n\n```yaml\nmcpServers:\n  - name: metabase\n    command: npx\n    args:\n      - \"-y\"\n      - \"@serdnaley/metabase-mcp\"\n    env:\n      METABASE_URL: \"https://your-metabase.example.com\"\n      METABASE_API_KEY: \"mb_xxx\"\n```\n\n</details>\n\n<details>\n<summary><strong>Zed</strong></summary>\n\nAdd to your Zed `settings.json`:\n\n```json\n{\n  \"context_servers\": {\n    \"metabase\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@serdnaley/metabase-mcp\"],\n      \"env\": {\n        \"METABASE_URL\": \"https://your-metabase.example.com\",\n        \"METABASE_API_KEY\": \"mb_xxx\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n## Configuration\n\n| Variable | Required | Description |\n|---|---|---|\n| `METABASE_URL` | Yes | Base URL of your Metabase instance |\n| `METABASE_API_KEY` | No* | API key for authentication |\n| `METABASE_EMAIL` | No* | Email for session-based auth |\n| `METABASE_PASSWORD` | No* | Password for session-based auth |\n| `METABASE_READ_ONLY_MODE` | No | Set to `true` to disable write tools |\n\n*Either `METABASE_API_KEY` or both `METABASE_EMAIL` + `METABASE_PASSWORD` must be provided. API key is recommended.\n\n### Getting a Metabase API Key\n\n1. Go to your Metabase instance\n2. Click the gear icon > Admin settings > Authentication > API Keys\n3. Click \"Create API Key\"\n4. Give it a name and select the appropriate group (e.g., Administrators)\n5. Copy the key — it starts with `mb_`\n\n## Examples\n\n### \"Create a dashboard showing order trends\"\n\nThe AI assistant will:\n1. Use `search` and `get_database_metadata` to discover your data\n2. Use `create_card` to create questions (e.g., orders by month, revenue by product)\n3. Use `create_dashboard` to create the dashboard\n4. Use `update_dashboard_cards` to arrange the cards with a layout\n\n### \"Move all Q4 reports to the Archive collection\"\n\nThe AI assistant will:\n1. Use `search` to find Q4 report cards\n2. Use `create_collection` to create an Archive collection if needed\n3. Use `update_card` on each card to move it to the new collection\n\n### \"What tables do we have in the analytics database?\"\n\nThe AI assistant will:\n1. Use `list_databases` to find the database\n2. Use `get_database_metadata` to list all tables, fields, and relationships\n\n## Tools\n\n### Read tools (50 — always available)\n\n| Domain | Tools |\n|---|---|\n| **Search** | `search` |\n| **Databases** | `list_databases`, `get_database`, `get_database_metadata`, `list_database_schemas`, `get_database_schema` |\n| **Tables & Fields** | `get_table`, `get_table_query_metadata`, `get_field`, `get_field_values` |\n| **Collections** | `list_collections`, `get_collection`, `list_collection_items`, `get_collection_tree` |\n| **Cards** | `list_cards`, `get_card`, `execute_card_query` |\n| **Dashboards** | `list_dashboards`, `get_dashboard` |\n| **Actions** | `list_actions`, `get_action` |\n| **Dataset** | `execute_query` |\n| **Users & Groups** | `list_users`, `get_user`, `get_current_user`, `list_groups` |\n| **Permissions** | `get_permissions_graph`, `get_collection_permissions` |\n| **Segments** | `list_segments`, `get_segment` |\n| **Revisions** | `list_revisions` |\n| **Settings** | `list_settings`, `get_setting` |\n| **Alerts** | `list_alerts`, `get_alert`, `list_dashboard_subscriptions` |\n| **Activity** | `get_activity`, `list_tasks`, `get_task` |\n| **Snippets** | `list_snippets`, `get_snippet` |\n| **Glossary** | `list_glossary_terms`, `get_glossary_term` |\n| **Documents** | `list_documents`, `get_document` |\n| **Timelines** | `list_timelines`, `get_timeline` |\n| **Bookmarks** | `list_bookmarks` |\n| **X-Rays** | `generate_xray` |\n| **EID Translation** | `translate_entity_ids` |\n\n### Write tools (78 — disabled in read-only mode)\n\n| Domain | Tools |\n|---|---|\n| **Collections** | `create_collection`, `update_collection` |\n| **Cards** | `create_card`, `update_card`, `delete_card`, `copy_card`, `create_card_public_link`, `delete_card_public_link` |\n| **Dashboards** | `create_dashboard`, `update_dashboard`, `delete_dashboard`, `copy_dashboard`, `update_dashboard_cards`, `create_dashboard_public_link`, `delete_dashboard_public_link` |\n| **Actions** | `create_action`, `update_action`, `delete_action`, `execute_action`, `create_action_public_link`, `delete_action_public_link` |\n| **Tables & Fields** | `update_table`, `update_field`, `rescan_field_values`, `discard_field_values`, `reorder_fields` |\n| **Databases** | `create_database`, `update_database`, `delete_database`, `validate_database`, `sync_database_schema`, `notify_database` |\n| **Users & Groups** | `create_user`, `update_user`, `deactivate_user`, `reactivate_user`, `create_group`, `update_group`, `delete_group`, `add_group_member`, `remove_group_member` |\n| **Permissions** | `update_permissions_graph`, `update_collection_permissions` |\n| **Segments** | `create_segment`, `update_segment`, `delete_segment` |\n| **Revisions** | `revert_revision` |\n| **Settings** | `update_setting` |\n| **Alerts** | `create_alert`, `update_alert`, `delete_alert`, `create_dashboard_subscription`, `update_dashboard_subscription`, `delete_dashboard_subscription` |\n| **Snippets** | `create_snippet`, `update_snippet`, `delete_snippet` |\n| **Glossary** | `create_glossary_term`, `update_glossary_term`, `delete_glossary_term` |\n| **Documents** | `create_document`, `update_document`, `delete_document` |\n| **Timelines** | `create_timeline`, `update_timeline`, `delete_timeline`, `create_timeline_event`, `update_timeline_event`, `delete_timeline_event` |\n| **Bookmarks** | `create_bookmark`, `delete_bookmark` |\n| **Moderation** | `create_moderation_review` |\n| **Cache** | `invalidate_cache`, `update_cache_config` |\n| **Persistence** | `persist_model`, `unpersist_model`, `refresh_persisted_model` |\n| **Upload** | `upload_csv` |\n\n## Security\n\n**`execute_query` is available even in read-only mode.** It can execute arbitrary SQL against any database the configured Metabase account has access to. Metabase enforces its own permission model, but this tool does not add additional restrictions.\n\nTo prevent write operations, ensure the Metabase API key or account has **read-only database permissions** within Metabase itself.\n\n**Action types are restricted.** The `create_action` tool only allows `query` and `implicit` action types. HTTP actions (which could make arbitrary outbound requests) are blocked.\n\n## Development\n\n```bash\nbun install\nbun run dev                    # Start the MCP server\nbun run build                  # Build for npm\nbun run generate-types         # Regenerate types from Metabase OpenAPI spec\n```\n\n## Testing\n\nTests run against a real Metabase instance via Docker:\n\n```bash\ndocker compose up -d             # Start Metabase\n./tests/ci/wait-for-metabase.sh  # Wait for ready (~15s)\nbun test                         # 202 tests, 668 assertions\ndocker compose down              # Stop Metabase\n```\n\n## How It Works\n\n```\nAI Client (Claude, Cursor, etc.)\n  ↓ MCP protocol (stdio)\nMCP Tool (zod schema + handler)\n  ↓\nService function (business logic)\n  ↓\nopenapi-fetch (type-safe HTTP client)\n  ↓\nMetabase REST API\n```\n\nThe server generates TypeScript types from Metabase's [OpenAPI spec](https://www.metabase.com/docs/master/api.json) and uses [openapi-fetch](https://openapi-ts.dev/openapi-fetch/) for type-safe API calls.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}