Model Context Protocol (MCP) server for dbt project discovery. Query Flipside dbt models through any MCP-enabled client.
- UV with
Python 3.10or higher - Git
-
Installation:
# clone the repo git clone <repo-url> cd data-discovery # create a virtual environment uv venv --python 3.10 # activate the virtual environment source .venv/bin/activate # install python dependencies uv sync # install the server as a module using uv uv run python -m data_discovery.server
-
Add to Claude Desktop (
claude_desktop_config.json): Configure a local MCP Server for Claude desktop with the following parameters. See the MCP documentation for additional help. A fileclaude_config.example.jsonis also maintained.{ "mcpServers": { "data-discovery": { "command": "/absolute/path/to/data-discovery/.venv/bin/python", "args": ["/absolute/path/to/src/data_discovery/server.py"], "env": { "DEPLOYMENT_MODE": "desktop" } } } } -
Restart Claude Desktop and start exploring:
- "Show me all Bitcoin core models"
- "Get details on ethereum transaction models"
- "List available blockchain projects"
-
Debugging
- Check the
~/.cache/data-discovery/claude-server.logfile for logs from the Claude Desktop invocations of the MCP server
tail -f ~/.cache/data-discovery/claude-server.log ... 2025-06-12 19:15:46.527 | DEBUG | __main__:call_tool:186 - [SERVER] Routing to tool handler for 'get_models' 2025-06-12 19:15:46.527 | DEBUG | __main__:call_tool:199 - [SERVER] Calling handle_get_models with args: {'resource_id': 'bsc-models', 'schema': 'core', 'limit': 100} 2025-06-12 19:15:53.625 | DEBUG | __main__:call_tool:167 - [SERVER] call_tool invoked - name='get_model_details', arguments={'uniqueId': 'model.fsc_evm.core__fact_blocks'} 2025-06-12 19:15:53.626 | DEBUG | __main__:call_tool:183 - [SERVER] Input validation passed for tool 'get_model_details' 2025-06-12 19:15:53.626 | DEBUG | __main__:call_tool:186 - [SERVER] Routing to tool handler for 'get_model_details' 2025-06-12 19:15:53.626 | DEBUG | __main__:call_tool:189 - [SERVER] Calling handle_get_model_details with args: {'uniqueId': 'model.fsc_evm.core__fact_blocks'} 2025-06-12 19:15:58.131 | DEBUG | __main__:call_tool:167 - [SERVER] call_tool invoked - name='get_model_details', arguments={'model_name': 'core__fact_blocks', 'resource_id': 'bsc-models'} 2025-06-12 19:15:58.131 | DEBUG | __main__:call_tool:183 - [SERVER] Input validation passed for tool 'get_model_details' 2025-06-12 19:15:58.131 | DEBUG | __main__:call_tool:186 - [SERVER] Routing to tool handler for 'get_model_details' 2025-06-12 19:15:58.131 | DEBUG | __main__:call_tool:189 - [SERVER] Calling handle_get_model_details with args: {'model_name': 'core__fact_blocks', 'resource_id': 'bsc-models'}
- Check the
get_resources- List available dbt projects (Bitcoin, Ethereum, Kairos)get_models- Search models across projects with filteringget_model_details- Comprehensive model metadata and schemaget_description- Documentation blocks with expert context
Currently disabled pending multi-project migration:
dbt_list,dbt_compile,dbt_show
DEPLOYMENT_MODE- Set to"desktop"for Claude Desktop (required or Claude Desktop will try to use an unwritable cache directory)DEBUG- Enable debug logging ("true"/"false")DBT_PATH- Full path to dbt executable (not necessary as alldbt_clitools are disabled and will probably be deprecated)
desktop(recommended): Uses~/.cache/data-discovery/for cachelocal: Usestarget/directory (development only)
-
Error executing code: Cannot convert undefined or null to object- Client passed
nullasresource_id - JSON artifacts not cached yet
- Client passed
-
"dbt command not found"
- Set
DBT_PATHenvironment variable - Example:
DBT_PATH=/Users/username/.pyenv/versions/3.12.11/bin/dbt
- Set
python src/data_discovery/server.pymcp- Model Context Protocol SDKaiohttp- Async HTTP for GitHub integration
- Multi-project artifact management with local caching
- GitHub integration for remote dbt artifacts
- MCP Resources for project discovery
- Property-based input validation