diff --git a/.changes/unreleased/Enhancement or New Feature-20250604-162749.yaml b/.changes/unreleased/Enhancement or New Feature-20250604-162749.yaml new file mode 100644 index 00000000..0c07ef59 --- /dev/null +++ b/.changes/unreleased/Enhancement or New Feature-20250604-162749.yaml @@ -0,0 +1,3 @@ +kind: Enhancement or New Feature +body: Add new tool to get the MCP server version +time: 2025-06-04T16:27:49.547265+02:00 diff --git a/src/dbt_mcp/mcp/server.py b/src/dbt_mcp/mcp/server.py index 1ac1331f..dd2693af 100644 --- a/src/dbt_mcp/mcp/server.py +++ b/src/dbt_mcp/mcp/server.py @@ -17,6 +17,7 @@ from dbt_mcp.config.config import load_config from dbt_mcp.dbt_cli.tools import register_dbt_cli_tools from dbt_mcp.discovery.tools import register_discovery_tools +from dbt_mcp.meta.tools import register_meta_tools from dbt_mcp.remote.tools import register_remote_tools from dbt_mcp.semantic_layer.tools import register_sl_tools from dbt_mcp.tracking.tracking import UsageTracker @@ -90,6 +91,9 @@ async def call_tool( async def create_dbt_mcp(): dbt_mcp = DbtMCP(usage_tracker=UsageTracker(), name="dbt", lifespan=app_lifespan) + logger.info("Registering meta tools") + register_meta_tools(dbt_mcp) + if config.semantic_layer_config: logger.info("Registering semantic layer tools") register_sl_tools(dbt_mcp, config.semantic_layer_config) diff --git a/src/dbt_mcp/meta/tools.py b/src/dbt_mcp/meta/tools.py new file mode 100644 index 00000000..0009379e --- /dev/null +++ b/src/dbt_mcp/meta/tools.py @@ -0,0 +1,15 @@ +import logging +from importlib.metadata import version + +from mcp.server.fastmcp import FastMCP + +from dbt_mcp.prompts.prompts import get_prompt + + +logger = logging.getLogger(__name__) + + +def register_meta_tools(dbt_mcp: FastMCP) -> None: + @dbt_mcp.tool(description=get_prompt("meta/get_dbt_mcp_server_version")) + def get_dbt_mcp_server_version() -> str: + return version("dbt-mcp") diff --git a/src/dbt_mcp/prompts/meta/get_dbt_mcp_server_version.md b/src/dbt_mcp/prompts/meta/get_dbt_mcp_server_version.md new file mode 100644 index 00000000..9e0c0d8f --- /dev/null +++ b/src/dbt_mcp/prompts/meta/get_dbt_mcp_server_version.md @@ -0,0 +1 @@ +this tool returns the current version of the dbt MCP server \ No newline at end of file diff --git a/tests/unit/meta/test_tools.py b/tests/unit/meta/test_tools.py new file mode 100644 index 00000000..3e4b598f --- /dev/null +++ b/tests/unit/meta/test_tools.py @@ -0,0 +1,41 @@ +import unittest +from unittest.mock import MagicMock, patch + +from dbt_mcp.meta.tools import register_meta_tools + + +class TestMetaTools(unittest.TestCase): + def test_get_dbt_mcp_server_version(self): + # Create a mock FastMCP + mock_fastmcp = MagicMock() + + # Capture the registered tools + tools = {} + + # Patch the tool decorator to capture functions + def mock_tool_decorator(**kwargs): + def decorator(func): + tools[func.__name__] = func + return func + + return decorator + + mock_fastmcp.tool = mock_tool_decorator + + # Register the tools + register_meta_tools(mock_fastmcp) + + # Test the get_dbt_mcp_server_version function + with patch("dbt_mcp.meta.tools.version") as mock_version: + mock_version.return_value = "1.0.0" + result = tools["get_dbt_mcp_server_version"]() + + # Verify the version function was called with correct package name + mock_version.assert_called_once_with("dbt-mcp") + + # Verify the result + self.assertEqual(result, "1.0.0") + + +if __name__ == "__main__": + unittest.main()