diff --git a/.changes/unreleased/Enhancement or New Feature-20250917-013531.yaml b/.changes/unreleased/Enhancement or New Feature-20250917-013531.yaml new file mode 100644 index 00000000..8712742e --- /dev/null +++ b/.changes/unreleased/Enhancement or New Feature-20250917-013531.yaml @@ -0,0 +1,3 @@ +kind: Enhancement or New Feature +body: Add Analytics to DBT MCP Server +time: 2025-09-17T01:35:31.599894+05:30 diff --git a/pyproject.toml b/pyproject.toml index 22e73c1a..8bbc75bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ dependencies = [ "pyyaml==6.0.2", "requests==2.32.4", "filelock>=3.18.0", + "agnost==0.1.2", ] [dependency-groups] dev = [ diff --git a/src/dbt_mcp/config/config.py b/src/dbt_mcp/config/config.py index b6be633a..4a68bfc0 100644 --- a/src/dbt_mcp/config/config.py +++ b/src/dbt_mcp/config/config.py @@ -101,6 +101,7 @@ class DbtMcpSettings(BaseSettings): disable_tools: Annotated[list[ToolName] | None, NoDecode] = Field( None, alias="DISABLE_TOOLS" ) + do_not_track: bool = Field(False, alias="DO_NOT_TRACK") @property def actual_host(self) -> str | None: @@ -160,6 +161,7 @@ class Config(BaseModel): semantic_layer_config: SemanticLayerConfig | None = None admin_api_config: AdminApiConfig | None = None disable_tools: list[ToolName] + do_not_track: bool = False def _get_dbt_user_dir(dbt_profiles_dir: str | None = None) -> Path: @@ -455,4 +457,5 @@ def create_config(settings: DbtMcpSettings) -> Config: semantic_layer_config=semantic_layer_config, admin_api_config=admin_api_config, disable_tools=settings.disable_tools or [], + do_not_track=settings.do_not_track, ) diff --git a/src/dbt_mcp/mcp/server.py b/src/dbt_mcp/mcp/server.py index 95b5eb9e..31ce3f4c 100644 --- a/src/dbt_mcp/mcp/server.py +++ b/src/dbt_mcp/mcp/server.py @@ -128,4 +128,9 @@ async def create_dbt_mcp(config: Config) -> DbtMCP: logger.info("Registering SQL tools") await register_sql_tools(dbt_mcp, config.sql_config, config.disable_tools) + if not config.do_not_track: + from agnost import track, config as agnost_config + # get your projId from app.agnost.ai, and set agnost_config as per your preference. refer https://docs.agnost.ai/quickstart for more details. + track(dbt_mcp, "projId", agnost_config(disable_input=True, disable_output=True)) + return dbt_mcp diff --git a/uv.lock b/uv.lock index 61b7fc2c..1d60fb27 100644 --- a/uv.lock +++ b/uv.lock @@ -44,6 +44,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/ac/1fb234f5b5c47088bf8db114b0e64b10f99d287e41e80ebe703482f4b6fc/adbc_driver_manager-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:ce4e0b9805df82213f8130af97320a5544f7a873982104cb81a9474adaf42caf", size = 531676, upload-time = "2025-03-07T00:54:25.168Z" }, ] +[[package]] +name = "agnost" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/8a/22f618fc8ce6ae0cc3ea4708683cc4d434b3bd36cccea53a67a4edf1a118/agnost-0.1.2.tar.gz", hash = "sha256:34dbb445576de67263cd33712b3aec3dbed366733f3b3a38caf62281ba46b759", size = 6465, upload-time = "2025-09-12T10:14:14.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/e6/fdded8fc54492a93cc30000d37fec6e90ea271acc1371a35ee3b851ed995/agnost-0.1.2-py3-none-any.whl", hash = "sha256:1ef7b9e3a84fa85bc62f89d209c728daa85c76fdbf07ca1d6485ed2f869aa87e", size = 6767, upload-time = "2025-09-12T10:14:13.273Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -243,6 +255,7 @@ wheels = [ name = "dbt-mcp" source = { editable = "." } dependencies = [ + { name = "agnost" }, { name = "authlib" }, { name = "dbt-protos" }, { name = "dbt-sl-sdk", extra = ["sync"] }, @@ -274,6 +287,7 @@ dev = [ [package.metadata] requires-dist = [ + { name = "agnost", specifier = "==0.1.2" }, { name = "authlib", specifier = "==1.6.3" }, { name = "dbt-protos", specifier = "==1.0.317" }, { name = "dbt-sl-sdk", extras = ["sync"], specifier = "==0.13.0" },