From b529000cc660a2066a2e49fc26098bb97a41942a Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Tue, 9 Jun 2026 11:45:16 -0400 Subject: [PATCH 1/7] Update docs for VSCode MCP and AI tools --- .../how_to_configure_aws_secrets_manager.md | 4 +- docs/how-tos/vs-code/environment-variables.md | 6 ++ .../external-ai-tools/github-copilot.md | 31 +++++++++ .../external-ai-tools/snowflake-cortex.md | 33 +++++++++ docs/how-tos/vs-code/mcp/README.md | 54 +++++++++++++++ docs/how-tos/vs-code/mcp/airflow.md | 44 ++++++++++++ .../mcp/assets/ai-tools-mcp-toggles.png | Bin 0 -> 59075 bytes .../vs-code/mcp/assets/github-pat-env-var.png | Bin 0 -> 40968 bytes docs/how-tos/vs-code/mcp/github.md | 63 ++++++++++++++++++ docs/how-tos/vs-code/mcp/grafana.md | 44 ++++++++++++ docs/reference/admin-menu/environments.md | 18 +++++ 11 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 docs/how-tos/vs-code/external-ai-tools/github-copilot.md create mode 100644 docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md create mode 100644 docs/how-tos/vs-code/mcp/README.md create mode 100644 docs/how-tos/vs-code/mcp/airflow.md create mode 100644 docs/how-tos/vs-code/mcp/assets/ai-tools-mcp-toggles.png create mode 100644 docs/how-tos/vs-code/mcp/assets/github-pat-env-var.png create mode 100644 docs/how-tos/vs-code/mcp/github.md create mode 100644 docs/how-tos/vs-code/mcp/grafana.md diff --git a/docs/how-tos/datacoves/how_to_projects/how_to_configure_aws_secrets_manager.md b/docs/how-tos/datacoves/how_to_projects/how_to_configure_aws_secrets_manager.md index bfb1d849..f50461f8 100644 --- a/docs/how-tos/datacoves/how_to_projects/how_to_configure_aws_secrets_manager.md +++ b/docs/how-tos/datacoves/how_to_projects/how_to_configure_aws_secrets_manager.md @@ -7,9 +7,9 @@ sidebar_position: 50 ## Table of Contents - [Prereqs](#prereqs) - [Create your Secret in AWS Secrets Manager](#create-your-secret-in-aws-secrets-manager) -- [Configure your Secrets Backend in Project settings](#configure-your-secrets-backend-in-project-settings) +- [Configure your Secrets Backend](#configure-your-secrets-backend) - [Project-level configuration](#project-level-configuration) - - [Environment-level override](#environment-level-override) + - [Environment-level configuration](#environment-level-configuration) ## Prereqs diff --git a/docs/how-tos/vs-code/environment-variables.md b/docs/how-tos/vs-code/environment-variables.md index 8c69e545..6376b4aa 100644 --- a/docs/how-tos/vs-code/environment-variables.md +++ b/docs/how-tos/vs-code/environment-variables.md @@ -73,6 +73,12 @@ Creating variables is simple. Add the key following the correct format and add t ![Create variables](assets/env_var_environment_create.png) +:::tip +Some features read a value from an environment variable you set here. For example, the [GitHub MCP +server](/docs/how-tos/vs-code/mcp/github) reads a personal access token from a user-level variable named +`GITHUB_PERSONAL_ACCESS_TOKEN`. Its value is automatically masked because the name contains `token`. +::: + ## Sensitive Variable Masking Datacoves automatically masks the values of environment variables whose names contain certain keywords. This helps prevent accidental exposure of secrets in the UI. diff --git a/docs/how-tos/vs-code/external-ai-tools/github-copilot.md b/docs/how-tos/vs-code/external-ai-tools/github-copilot.md new file mode 100644 index 00000000..553dd0d0 --- /dev/null +++ b/docs/how-tos/vs-code/external-ai-tools/github-copilot.md @@ -0,0 +1,31 @@ +--- +title: GitHub Copilot +sidebar_position: 3 +--- + +# GitHub Copilot + +[GitHub Copilot](https://github.com/features/copilot) is built into the Datacoves VS Code +workspace as the GitHub Copilot and Copilot Chat extensions. + +## Prerequisites + +- A GitHub account with an active GitHub Copilot subscription. +- GitHub Copilot enabled in your Datacoves environment. An administrator enables it under + **Admin > Environments > _your environment_ > AI Tools > AI Extensions**. + +## Login + +1. Open your Datacoves VS Code workspace. +2. Open the Copilot Chat view, or click the Copilot icon in the status bar. +3. Choose to sign in and follow the GitHub authentication prompt in your browser. +4. Once authorized, Copilot is ready in both inline suggestions and chat. + +## MCP servers + +GitHub Copilot can use the Datacoves [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, Airflow, +Grafana) when they are enabled for your environment. + +## Learn more + +- [GitHub Copilot documentation](https://docs.github.com/en/copilot) diff --git a/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md b/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md new file mode 100644 index 00000000..f753d874 --- /dev/null +++ b/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md @@ -0,0 +1,33 @@ +--- +title: Snowflake Cortex +sidebar_position: 2 +--- + +# Snowflake Cortex + +[Snowflake Cortex Code](https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli) is +Snowflake's AI coding assistant, available as a CLI tool in Datacoves. + +## Prerequisites + +- A Snowflake-based (`dbt-snowflake`) environment. Cortex is only available on Snowflake + environments. +- Cortex enabled in your Datacoves environment. Contact + [Datacoves support](mailto:support@datacoves.com) to enable it, or an administrator can turn it + on under **Admin > Environments > _your environment_ > AI Tools**. + +## Login and usage + +Cortex authenticates against Snowflake and is driven from a terminal in your Datacoves VS Code +workspace. See +[Snowflake's Cortex Code CLI documentation](https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli) +for the authentication and usage steps. + +## MCP servers + +Cortex can use the Datacoves [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, Airflow, Grafana) +when they are enabled for your environment. + +## Learn more + +- [Snowflake Cortex Code documentation](https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-cli) diff --git a/docs/how-tos/vs-code/mcp/README.md b/docs/how-tos/vs-code/mcp/README.md new file mode 100644 index 00000000..e47cc062 --- /dev/null +++ b/docs/how-tos/vs-code/mcp/README.md @@ -0,0 +1,54 @@ +--- +title: MCP Servers +sidebar_position: 46 +--- + +# MCP Servers + +Datacoves can connect your AI coding assistants to live data systems through +[MCP (Model Context Protocol)](https://modelcontextprotocol.io/) servers. An MCP server gives an +AI tool structured, read access to an external system so it can answer questions grounded in your +real data instead of guessing. + +Datacoves ships three MCP servers: + +| Server | What it exposes | User setup | +|--------|-----------------|------------| +| [GitHub](/docs/how-tos/vs-code/mcp/github) | Your repositories, pull requests, issues, and CI checks | A GitHub personal access token | +| [Airflow](/docs/how-tos/vs-code/mcp/airflow) | Your DAGs, runs, and task logs (read-only) | None | +| [Grafana (Prometheus & Loki)](/docs/how-tos/vs-code/mcp/grafana) | Metrics and logs from your environment | None | + +Once enabled, these servers are available to every AI tool in your workspace: + +- Datacoves Copilot +- GitHub Copilot +- [OpenAI Codex](/docs/how-tos/vs-code/external-ai-tools/openai-codex) +- [Snowflake Cortex](/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex) + +## Enabling MCP servers + +MCP servers are toggled per environment by an administrator. + +:::note +You need admin access to enable MCP servers. Go to **Admin > Environments**, edit the +environment, open the **AI Tools** tab, and turn on the servers you want under **MCP Servers**. +::: + +![AI Tools tab](./assets/ai-tools-mcp-toggles.png) + +After a server is enabled, it appears automatically in each AI tool the next time the workspace +starts. No further configuration is needed in the tools themselves. + +:::tip +The **Grafana (Prometheus & Loki)** toggle only appears when the **observability stack** is +enabled for your cluster. Contact [Datacoves support](mailto:support@datacoves.com) if you do not +see it. +::: + +## What you can ask + +Each server page includes example prompts. A few to get started: + +- **GitHub:** "Check my last pull request and explain why the CI check failed." +- **Airflow:** "Check the log of the task that failed in my last DAG run and recommend a fix." +- **Grafana:** "Query the metrics and logs for my environment and summarize recent failures." diff --git a/docs/how-tos/vs-code/mcp/airflow.md b/docs/how-tos/vs-code/mcp/airflow.md new file mode 100644 index 00000000..2340c425 --- /dev/null +++ b/docs/how-tos/vs-code/mcp/airflow.md @@ -0,0 +1,44 @@ +--- +title: Airflow +sidebar_position: 2 +--- + +# Airflow MCP Server + +The Airflow MCP server lets your AI tools read your DAGs, runs, and task logs, so you can ask the +AI to investigate a failed task and recommend a fix without leaving VS Code. + +It is backed by [Astronomer's Airflow MCP server](https://github.com/astronomer/agents/tree/main/astro-airflow-mcp) +and works with both Airflow 2 and Airflow 3. + +## Prerequisites + +- The **Airflow** MCP server enabled for your environment (see [Enabling](#enabling)). +- Airflow enabled and running for your environment. + +## How it works + +- **No setup required.** The server authenticates as **you**, using your Datacoves identity, so it + only sees what your Airflow permissions allow. +- **Read-only by default.** The server is configured for read access, so the AI can inspect DAGs, + runs, and logs but cannot trigger, pause, or change anything. +- Works with both your team's Airflow and, when enabled, your personal **My Airflow** instance. + +## Enabling + +:::note +An administrator enables the server in **Admin > Environments > _your environment_ > AI Tools > +MCP Servers** by turning on **Airflow**. +::: + +## Use it + +Start (or restart) your workspace so the AI tools pick up the server, then ask, for example: + +> Check the log of the task that failed in my last DAG run and recommend a fix. + +> Which DAGs failed today, and what was the error? + +## Learn more + +- [Astronomer Airflow MCP server](https://github.com/astronomer/agents/tree/main/astro-airflow-mcp) diff --git a/docs/how-tos/vs-code/mcp/assets/ai-tools-mcp-toggles.png b/docs/how-tos/vs-code/mcp/assets/ai-tools-mcp-toggles.png new file mode 100644 index 0000000000000000000000000000000000000000..13b7ef9b9bc54841dd0b148e5bf7f8a1caa72613 GIT binary patch literal 59075 zcmd?QRa72P7dAGyOMpOd2<{r(B?M1!cMb0D5P}DHcXxMpcXzko4t>e@wf)=G|DqRd zFS-^NFv6TUbI#uTksb71Mhpoa2OaIT>JaabIlnm0bAIgS^_n=$YQC!Fa1%2pzbvp60tKO6@$YzXY(~jy15e*_|Ul@ zxbVc7Ypi>6ZjCKF{&Hs;d_rkCLTrR|hq>uaWMj_Zm*8gWOwl9ZPaAAPsToVc>)#m)$ zfa?buL#B4wQ@F)Ta442P-g%IAmMHN>GW-$u<9W79h`RvlVinR>)wEc>+@!uR+7bLy(oYT-|#T;a{2)^S5>qA#0YLQ7$! z-({di(!y=f0f%&}R zMvC`3`|H5%WUJUtV1GHjeSV90;0J{FS%2FjP*5TEWy3mG9VG+2*{GcIdd}x2`jcaL z;lTN~(w0Pn*|9>{`7`FE4SP%&)c}nyW(2$3GnC3K^-SrZud$0=I8V2mgkOZ%BIfG9 zP*MRKzulp^n+n6dSX004gbZ-6roTKt@_Gg3iGcw+-{hm!Nx5M^iDm*r^R_}?6BU7`$RhROw@^$(C~b8)?PtpROTGmbT? zW>`>daU|TLU=v4MpVrxrZUDxKnlmWfjb!Ps2pxX}Uv(w!5k804{~>{eTmQZ^CA_Yp z5Zl5`6Eo_$t4bV zdJiMfKJ=>}&;*Sylun?4dE_~cMt#ICW%bTHabVh?wf*wtq2SQ2sH!HRBR~lBJY3Yq zy;bPan~^XSn6Q1x8A(JPh>pR$xU=TN z2B*znaEKm3u&oThWh;vrFR>_4;+#JQbh_smeWkhpEikM#~Gm!LD*M&nA((W z#aT1+rgRsZDRORIaLnCiBRD5?S<^kV9|wM23O@dKOZj3tHTR?%;?;^AW* z2@;x7yRfwWHJjdH4z!OoHDkFgtZ{TVE#Oa4Qfy1EvUJ+FumtR?oB&3`;*kY4ySbok z@u^4sn`Gu;ZfMxst4UKidN2Sn-2UdV$C}=5hG#GkT^>q~}(+^Hd9vI1Lv(Sy`+zo4c&;f7MZ~83CPt_D2uU;~d_2g9N z8F>+iztyNVC!6+yOA>0-PEi3=NL>_Q>E)rYxg7=trT&M6M+Iee#^Ejd4Y5J@0gH5% zBMuK1;F zrcJ^q)OC{<+|$Z!IOq>Q4Kms}sv4plFJ#BWHP4WN>qP?e>3G7VnCAWHt)?T5LIih_lMKxc-cvNB{FmE!g z)Fe#Yj=JOp_oD2&noHJ>mW89oU`?`SlsSXnsT~VyN^?fwpK#ZI66{))m#tli-)OH_ z&J}#uZWxb8%k2L>$Mz+)0ziGuM5CY9S3S5Q1x%9L75FF847T}$t7yKk0u2((cLW@s z*AqTnDv{_wg26fF?A-()kZ$VyB#Wd505S?Py_?zE_+?|^$uK}h*$BgPzjQii9e@An zA`F8hAQ9Yl#PNEnoIewITe1i4?dWA{G2gm=67rsPyzEd)>ch_F3uS+D$sAn^0|4WU z+hfC5SqOkwMf1B;##wcJ_W~jyrpyKh2u!mw!rq#r0W*fU`co1#DAYCnUK-~9&SyEz zDwL;AV%I>=ilH6~IIuv25dJm}=U225ekOhe4|}5z25b)Pj)DV29M%tcVU!NZLI?n# zZYCco01Rpp^gsa)%aPUdYi5lSSwfBM_CZVyl5w`Mz@9lWE&$ucp>v{64tytPLE4}n ze6D#E&=kyK025%;RD}d4t_Ke2l6eij*Zl;%v96;!J_6neG;lX$fYcCMn2Wpi?dKp9 zHUPNdq{jv5uahs(J+61MSV!L`CIEl!h0A?dor<1KFmvF*G>R~tnS2#}X+ooX0s^SW zS{su=*sap!$Wkm^j=l$g7>POa44*l+!6ixn(9&~!JpyF0;*7ta+@7cq0N#ZU8z6k+RFf zR-A+1=|~Ld7%*)!gO&61MD2isaHH8p zPtD!9+Qlb@nXDP!bfp=O6r3YwT{Gpkod^_D1sG)as8r04MAl$U`Gq-Bx+w`IpKhhd z!2l8rQT`k$X03q4tb$5v6FYv>;f^FJ ziQ%A<7r~EYjx4*z#`_oC4@B(_*y1XY> zj2#hH-Z?7is1Z2bU~5|=aKJkeR2E+kEcBC*E*o}LSoq>S-QYG!$sM(on1P5<%r=&|Cb>jG=sUP{U!l@}6rj*f%i_M|Y3 z1oKoD>D-4gAg0P(O!vwUcR%P~;9@~3%Kv4#oY+l7~8EhbH?ru2as zfT4UCdp_y*uan;15bZEkYb>uBdEs|npN*gW1RIb?k}{6>#etO-+vj7g+?El_5nQg@ zFLF`_MU1-Qs_l7dEWf5kc@(1G;n93|9ewyNzsh70lnm<~_j>#7A?-#r;SEu|-4^yp z;gZ1~-53&d#&@d)jZcaOm)FLdGvsdVczmYPEf-YB)(Q5x0wF&!4g}j}Xht>M_8vbm zeY4qmESSSvJS@7OXO-g@S}ysH0>*9Pp~e9NtiNSy<7{8##Ss9&c+`Et*I}--cqXVr}3bj;f08(vTrN&aY6h{ib-_?`~ zp&Z?g{%1cz5^I3ZcEGqrpQ_z;Ee={^|7sJ1;)lGJ=t^q3NAxG$e zAJJy+OtbhUv9)L@xG2g4K3iGDXz=Wra%{(mjsDd%T>-22;p#xfML(ZFWvjsdywTtlzVad_N#bDqZ@dE|@a@(l)FYXnf*IBelW2a8WyS5L;m;YvU>5 zP0>9wx8gEqqigT$kEC<Q&>4FKDlQG6b6CncrGZ-*ayIVyMZz8d*7OT9X0}7nqvg0eQ+Frk>k}-Wgi~2~z z78AjHGbuFP9bYQ@LAQCUoc>>=nv_>A*Q$LzH&4d~_8OQ7&D=m3D9#m^P1Jbs5p1t_ z?&XU*&jqqd#;l>4GN%2MfdAgisrXJ;oxt;m=jrZ*0`W-DFtgi?+)+2#}Y;aqv z_#%pq$5y~_PAsG>8aXN8ZTS?q)yY$n)Tx%%dbiP!9pqDTL6$Nxi|vN25Mj&)5bHEKV@dN|>J2pay3^<+1+3oW? z^daV?dqHW3!i+ZG4&E3c&km5Yj6huZUS7X4`#OChYAW$rSZ~Pw8p8a@k8u?)J*u+S zK1`%1c4Zx5QoemJV4$Tt;+zb6*@F`_q8GXMVJ-qi)qlx|``s>;cVtGRpX(AZNI%Bp zwIB33OWoYDm8gH-@!z3=A*bb;uQ?3(ft{EY2-1G<94rL?cRV)s_{?9j~!eF{;j`^r(*K)Nz*$$(}d} z10Jgh*U|%iBsEzl;`iLyH$8a-B5KDdn<}?AxSw6~f1uZh9QI&6KSNDxdyOcmYPP1J zfG75!K!Tf(o0TnElh#;4YWr^`ik?ruqHe9K@Hf%aXrHH%GTq)`AAQ+)xln zNfsAA;KYFx$nJE-Cl#hAJ*lPxArTrNq5zUO5?4aq)v9DpPcF`|w}o`?Qp6{c%H_%O zq#1WArUf(6DfDOoyE}HL=6d>Z@6v&$q+Dnx$*GiqFn1&j(KDO!{03E9eC}p5{QYf7 zu8@y^vi-U*E1i!32c&D`%iY9BZZM(R(ipgfyL$wq>Mh|qSotAhnAw?~g0MGwu(uKr5}=_y zySCl*Pf?D;Yeg#7v6xBkz-tSBld=>JY_ZprlG=#+lVEY9A1lYDYAN?u=>5e#d9~-H z!_vo-JsHST3j&v%fiwSC>SmUS9YJ!|+LZC;8eM@^^R_8K@U7QQTCQ zxBYZy2rctsXx1|q*&X;(_CT1odp?WLuYhVeA9H6}>L}C(0_ke;O0tqyI3EL#>YzW- zye7~kE7 z{-#D}ukAMdnwX+@U*UEsBExv)V)Y> zZ8$879-|#kfWS)b)p>X`U~1*4{&~@}Fzg5-F@(MzBe#8eZ1MRpb6eXZjivysfjuyxPbdzppb=Fhv;5c=^$pB_6iA1$_2(QjAP@%B4| zsUMDJ)=Xr%y@~yv&!K0yh`D;!Tt<^7JM$`Yv}w|c+(Dy1yC8K`f; zmi~iP*!*xExz_VK%SK!2CvRe1ec6o__DT0H*(h{H!p^e%Ww_1sEdkf7i(pnUwUy+< zLcx5p7sD?ro*x`((8T_pg74g{c{k%kd+?p+{w3DVAtb0Ts_znwW> zBj`15w(YTjo8pXVa^pE~l#Gh*az4ZRp&%49o>8S}oHoIetI@5Mn9>q;e%Ps0;W5HK>92;V3Ke%j(4r_KVn&y6MH^OhYbSU7**>p2+0i4-Yoc zjm3hV;mHl0N<8tsw;|uu8Eg(7ZM%Y?Tsw4fIy+-~NmW}mZqlicPhdai7y8Yyv6*O+ zFh_SgpV4YL3nk5{u9i$7gN1@OK$Dii|FtIzQqMt#rjqz3jkr~@5B*I$?c7?+7%%Pn zqlKDnNIIA=C&Oo^7)bzC>lK_l_Y~XUv5nMmvbF}-1Zc=G<�^ig%H551^=X(K)IX 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 literal 0 HcmV?d00001 diff --git a/docs/how-tos/vs-code/mcp/assets/github-pat-env-var.png b/docs/how-tos/vs-code/mcp/assets/github-pat-env-var.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb2809045806f88671864cab86e262c12075b7a GIT binary patch literal 40968 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 Environments > _your environment_ > AI Tools > +MCP Servers** by turning on **GitHub**. +::: + +## Use it + +Start (or restart) your workspace so the AI tools pick up the server, then ask, for example: + +> Check my last pull request, figure out why the CI check failed, and recommend a fix. + +> List my open pull requests in this repository. + +## Learn more + +- [GitHub MCP server](https://github.com/github/github-mcp-server) +- [Managing personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) diff --git a/docs/how-tos/vs-code/mcp/grafana.md b/docs/how-tos/vs-code/mcp/grafana.md new file mode 100644 index 00000000..48803c45 --- /dev/null +++ b/docs/how-tos/vs-code/mcp/grafana.md @@ -0,0 +1,44 @@ +--- +title: Grafana (Prometheus & Loki) +sidebar_position: 3 +--- + +# Grafana MCP Server + +The Grafana MCP server lets your AI tools query the metrics (Prometheus) and logs (Loki) for your +environment, so you can ask the AI to summarize recent failures or look up a specific log. + +It is backed by [Grafana's MCP server](https://github.com/grafana/mcp-grafana). + +## Prerequisites + +- The **observability stack** enabled for your cluster. The Grafana MCP toggle only appears when + it is. Contact [Datacoves support](mailto:support@datacoves.com) if you need it enabled. +- The **Grafana (Prometheus & Loki)** MCP server enabled for your environment (see + [Enabling](#enabling)). + +## How it works + +**No setup required.** Datacoves provisions a per-environment service account for the server, so +there is nothing for you to configure. The server connects to your environment's Grafana, which +already has the Prometheus and Loki data sources wired up. + +## Enabling + +:::note +An administrator enables the server in **Admin > Environments > _your environment_ > AI Tools > +MCP Servers** by turning on **Grafana (Prometheus & Loki)**. +::: + +## Use it + +Start (or restart) your workspace so the AI tools pick up the server, then ask, for example: + +> Query the metrics and logs for my environment and summarize recent failures. + +> Show me the Loki logs for my Airflow workers in the last hour. + +## Learn more + +- [Grafana MCP server](https://github.com/grafana/mcp-grafana) +- [Grafana dashboards in Datacoves](/docs/how-tos/datacoves/metrics-and-logs/grafana) diff --git a/docs/reference/admin-menu/environments.md b/docs/reference/admin-menu/environments.md index a6b6d0c0..ed125795 100644 --- a/docs/reference/admin-menu/environments.md +++ b/docs/reference/admin-menu/environments.md @@ -25,3 +25,21 @@ On the Environments landing page you can see a list of environments associated w For each environment we can see the associated project, the name of the environment to be displayed on the landing page, and the number of associated service connections. Each row contains 2 action buttons, Edit and Delete. + +## AI Tools + +When editing an environment that has VS Code enabled, the **AI Tools** tab controls the AI +assistants and the data systems they can reach. It has three sections: + +- **AI Extensions** - enable or disable the built-in AI extensions, such as Datacoves Copilot and + GitHub Copilot. +- **AI Tools** - enable or disable the AI CLI tools, such as OpenAI Codex and Snowflake Cortex + (Cortex is only shown on Snowflake environments). +- **MCP Servers** - enable or disable the [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, + Airflow, and Grafana) that give the AI tools read access to your repositories, DAGs, and + metrics and logs. + +:::note +The **Grafana (Prometheus & Loki)** MCP server only appears when the observability stack is +enabled for the cluster. +::: From cd8979e2774ae8c46cffd889540cd3436f645b68 Mon Sep 17 00:00:00 2001 From: Fernando Mercado Date: Tue, 1 Sep 2026 15:11:00 -0500 Subject: [PATCH 2/7] Improve SEO metadata for new MCP and AI tools docs Add meta descriptions to pages that lacked one, and align frontmatter titles with each page's actual heading (GitHub/Airflow/Grafana MCP server pages), keeping short sidebar_label values for the sidebar. --- docs/how-tos/vs-code/external-ai-tools/github-copilot.md | 1 + docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md | 1 + docs/how-tos/vs-code/mcp/README.md | 1 + docs/how-tos/vs-code/mcp/airflow.md | 4 +++- docs/how-tos/vs-code/mcp/github.md | 4 +++- docs/how-tos/vs-code/mcp/grafana.md | 4 +++- 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/how-tos/vs-code/external-ai-tools/github-copilot.md b/docs/how-tos/vs-code/external-ai-tools/github-copilot.md index 553dd0d0..fbc9896b 100644 --- a/docs/how-tos/vs-code/external-ai-tools/github-copilot.md +++ b/docs/how-tos/vs-code/external-ai-tools/github-copilot.md @@ -1,5 +1,6 @@ --- title: GitHub Copilot +description: Enable and log in to GitHub Copilot in your Datacoves VS Code workspace, and use it with the Datacoves MCP servers. sidebar_position: 3 --- diff --git a/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md b/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md index f753d874..3451e784 100644 --- a/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md +++ b/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md @@ -1,5 +1,6 @@ --- title: Snowflake Cortex +description: Enable and use Snowflake Cortex, Snowflake's AI coding assistant CLI, in your Datacoves VS Code workspace. sidebar_position: 2 --- diff --git a/docs/how-tos/vs-code/mcp/README.md b/docs/how-tos/vs-code/mcp/README.md index e47cc062..57effe17 100644 --- a/docs/how-tos/vs-code/mcp/README.md +++ b/docs/how-tos/vs-code/mcp/README.md @@ -1,5 +1,6 @@ --- title: MCP Servers +description: Connect GitHub, Airflow, and Grafana MCP servers to give AI tools in your Datacoves VS Code workspace read access to real repositories, DAGs, metrics, and logs. sidebar_position: 46 --- diff --git a/docs/how-tos/vs-code/mcp/airflow.md b/docs/how-tos/vs-code/mcp/airflow.md index 2340c425..5d3c288d 100644 --- a/docs/how-tos/vs-code/mcp/airflow.md +++ b/docs/how-tos/vs-code/mcp/airflow.md @@ -1,5 +1,7 @@ --- -title: Airflow +title: Airflow MCP Server +sidebar_label: Airflow +description: Connect the Airflow MCP server so AI tools in VS Code can read your DAGs, runs, and task logs to investigate failures and recommend fixes. sidebar_position: 2 --- diff --git a/docs/how-tos/vs-code/mcp/github.md b/docs/how-tos/vs-code/mcp/github.md index e71b0d3b..3d06896d 100644 --- a/docs/how-tos/vs-code/mcp/github.md +++ b/docs/how-tos/vs-code/mcp/github.md @@ -1,5 +1,7 @@ --- -title: GitHub +title: GitHub MCP Server +sidebar_label: GitHub +description: Connect the GitHub MCP server so AI tools in VS Code can read your repositories, pull requests, issues, and CI checks using a personal access token. sidebar_position: 1 --- diff --git a/docs/how-tos/vs-code/mcp/grafana.md b/docs/how-tos/vs-code/mcp/grafana.md index 48803c45..076e867e 100644 --- a/docs/how-tos/vs-code/mcp/grafana.md +++ b/docs/how-tos/vs-code/mcp/grafana.md @@ -1,5 +1,7 @@ --- -title: Grafana (Prometheus & Loki) +title: Grafana MCP Server (Prometheus & Loki) +sidebar_label: Grafana (Prometheus & Loki) +description: Connect the Grafana MCP server so AI tools in VS Code can query Prometheus metrics and Loki logs for your Datacoves environment. sidebar_position: 3 --- From 47367e942593b863fdcdd9d239cda829d93a2c6f Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Fri, 11 Sep 2026 17:20:22 +0000 Subject: [PATCH 3/7] [DCV-3510] Document the Snowflake MCP server --- docs/how-tos/vs-code/mcp/README.md | 15 ++++- docs/how-tos/vs-code/mcp/snowflake.md | 97 +++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 docs/how-tos/vs-code/mcp/snowflake.md diff --git a/docs/how-tos/vs-code/mcp/README.md b/docs/how-tos/vs-code/mcp/README.md index 57effe17..74e20dd8 100644 --- a/docs/how-tos/vs-code/mcp/README.md +++ b/docs/how-tos/vs-code/mcp/README.md @@ -1,6 +1,6 @@ --- title: MCP Servers -description: Connect GitHub, Airflow, and Grafana MCP servers to give AI tools in your Datacoves VS Code workspace read access to real repositories, DAGs, metrics, and logs. +description: Connect GitHub, Airflow, Grafana, and Snowflake MCP servers to give AI tools in your Datacoves VS Code workspace read access to real repositories, DAGs, metrics, logs, and data. sidebar_position: 46 --- @@ -11,21 +11,26 @@ Datacoves can connect your AI coding assistants to live data systems through AI tool structured, read access to an external system so it can answer questions grounded in your real data instead of guessing. -Datacoves ships three MCP servers: +Datacoves ships four MCP servers: | Server | What it exposes | User setup | |--------|-----------------|------------| | [GitHub](/docs/how-tos/vs-code/mcp/github) | Your repositories, pull requests, issues, and CI checks | A GitHub personal access token | | [Airflow](/docs/how-tos/vs-code/mcp/airflow) | Your DAGs, runs, and task logs (read-only) | None | | [Grafana (Prometheus & Loki)](/docs/how-tos/vs-code/mcp/grafana) | Metrics and logs from your environment | None | +| [Snowflake](/docs/how-tos/vs-code/mcp/snowflake) | Your Snowflake data and metadata, through read-only SQL | An MCP server created in your Snowflake account | -Once enabled, these servers are available to every AI tool in your workspace: +Once enabled, the GitHub, Airflow, and Grafana servers are available to every AI tool in your +workspace: - Datacoves Copilot - GitHub Copilot - [OpenAI Codex](/docs/how-tos/vs-code/external-ai-tools/openai-codex) - [Snowflake Cortex](/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex) +The Snowflake server is wired into Datacoves Copilot only. Snowflake Cortex reaches your account +directly and needs no MCP server. + ## Enabling MCP servers MCP servers are toggled per environment by an administrator. @@ -46,6 +51,9 @@ enabled for your cluster. Contact [Datacoves support](mailto:support@datacoves.c see it. ::: +[Snowflake](/docs/how-tos/vs-code/mcp/snowflake) has no toggle. It appears on its own once an +account administrator creates the MCP server object in your Snowflake account. + ## What you can ask Each server page includes example prompts. A few to get started: @@ -53,3 +61,4 @@ Each server page includes example prompts. A few to get started: - **GitHub:** "Check my last pull request and explain why the CI check failed." - **Airflow:** "Check the log of the task that failed in my last DAG run and recommend a fix." - **Grafana:** "Query the metrics and logs for my environment and summarize recent failures." +- **Snowflake:** "Which columns does the customers table have, and how many rows are in it?" diff --git a/docs/how-tos/vs-code/mcp/snowflake.md b/docs/how-tos/vs-code/mcp/snowflake.md new file mode 100644 index 00000000..3284de80 --- /dev/null +++ b/docs/how-tos/vs-code/mcp/snowflake.md @@ -0,0 +1,97 @@ +--- +title: Snowflake MCP Server +sidebar_label: Snowflake +description: Connect the Snowflake-managed MCP server so AI tools in VS Code can run read-only SQL against your own Snowflake account. +sidebar_position: 4 +--- + +# Snowflake MCP Server + +The Snowflake MCP server lets your AI tools run read-only SQL against your Snowflake account, so you +can ask about your tables, columns, and data and get an answer from the warehouse instead of a guess. + +It is backed by +[Snowflake's managed MCP server](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp), +which runs inside your own Snowflake account. Your data never leaves it. + +## Prerequisites + +- A Snowflake environment whose first Snowflake connection is a development connection, that is, one + whose name contains `dev`. +- [Key pair authentication](/docs/how-tos/vs-code/initial) on that connection. Snowflake accepts a + key pair token and nothing else for MCP, so a password-authenticated connection cannot reach the + server. +- An MCP server object named `DATACOVES` in your Snowflake account, created by an account + administrator as shown below. + +:::note +This server has no toggle in **Admin > Environments > AI Tools**. It appears on its own once the +server object exists in your account. +::: + +## Create the server in your Snowflake account + +The MCP server is an object in your own account. Datacoves does not create it and cannot see it +until it exists. Pick the database and schema you want it in, and name the server `DATACOVES`. + +```sql +create mcp server ..DATACOVES from specification $$ +{ + "version": 1, + "tools": [ + { + "title": "Read-only SQL", + "name": "execute_sql", + "type": "SYSTEM_EXECUTE_SQL", + "description": "Run SELECT queries against Snowflake metadata and data.", + "config": { + "read_only": true, + "query_timeout": 120, + "warehouse": "" + } + } + ] +} +$$; +``` + +Then let the role your Datacoves connection uses reach it: + +```sql +grant usage on mcp server ..DATACOVES to role ; +``` + +`read_only` keeps the tool to `SELECT` queries, so the AI can read your data and metadata but cannot +change anything. + +## How it works + +**No setup in Datacoves.** Your workspace signs a token with the private key of your Snowflake +connection, asks your account which MCP servers it holds, and points Datacoves Copilot at the one +named `DATACOVES`. The token is short-lived and refreshed for you. + +Unlike the other three servers, this one is wired into Datacoves Copilot only. Snowflake Cortex +reaches your account directly and needs no MCP server. + +The server acts as **you**, through your connection's own Snowflake role, so it sees only what that +role is allowed to see. + +Until the server object exists, the `snowflake` entry sits switched off in Datacoves Copilot. Once +an administrator creates it, your workspace picks it up within five minutes, with no restart. + +## Use it + +Ask, for example: + +> Which columns does the customers table have, and how many rows are in it? + +> Count yesterday's rows in the raw orders table and compare them with the day before. + +You can confirm it is connected in Datacoves Copilot under **Settings > MCP Servers**, where +`snowflake` lists the `execute_sql` tool. + +## Learn more + +- [Snowflake-managed MCP server](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-mcp) +- [CREATE MCP SERVER](https://docs.snowflake.com/en/sql-reference/sql/create-mcp-server) +- [Set up your Snowflake connection with a key pair](/docs/how-tos/vs-code/initial) From db36d9433ae47bfaab56be599521b19224c8fede Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Fri, 11 Sep 2026 17:24:52 +0000 Subject: [PATCH 4/7] [DCV-3510] Scope the Snowflake MCP delivery claim to the standard environment --- docs/how-tos/vs-code/mcp/README.md | 4 ++-- docs/how-tos/vs-code/mcp/snowflake.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/how-tos/vs-code/mcp/README.md b/docs/how-tos/vs-code/mcp/README.md index 74e20dd8..f0f239ca 100644 --- a/docs/how-tos/vs-code/mcp/README.md +++ b/docs/how-tos/vs-code/mcp/README.md @@ -28,8 +28,8 @@ workspace: - [OpenAI Codex](/docs/how-tos/vs-code/external-ai-tools/openai-codex) - [Snowflake Cortex](/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex) -The Snowflake server is wired into Datacoves Copilot only. Snowflake Cortex reaches your account -directly and needs no MCP server. +The Snowflake server is delivered to Datacoves Copilot; the other tools' MCP configs do not carry +it. Snowflake Cortex reaches your account directly and needs no MCP server. ## Enabling MCP servers diff --git a/docs/how-tos/vs-code/mcp/snowflake.md b/docs/how-tos/vs-code/mcp/snowflake.md index 3284de80..c3be87b8 100644 --- a/docs/how-tos/vs-code/mcp/snowflake.md +++ b/docs/how-tos/vs-code/mcp/snowflake.md @@ -70,8 +70,8 @@ change anything. connection, asks your account which MCP servers it holds, and points Datacoves Copilot at the one named `DATACOVES`. The token is short-lived and refreshed for you. -Unlike the other three servers, this one is wired into Datacoves Copilot only. Snowflake Cortex -reaches your account directly and needs no MCP server. +In a standard environment this entry is delivered to Datacoves Copilot; the other tools' MCP +configs do not receive it. Snowflake Cortex reaches your account directly and needs no MCP server. The server acts as **you**, through your connection's own Snowflake role, so it sees only what that role is allowed to see. From 86c72f0e99bd83b210a1fd6e36ddbd614cc10942 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 14 Sep 2026 07:31:07 +0000 Subject: [PATCH 5/7] [DCV-3510] Document the Snowflake managed MCP server toggle and its delivery to every AI tool --- docs/how-tos/vs-code/mcp/README.md | 10 +++------- docs/how-tos/vs-code/mcp/snowflake.md | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/docs/how-tos/vs-code/mcp/README.md b/docs/how-tos/vs-code/mcp/README.md index f0f239ca..c3329103 100644 --- a/docs/how-tos/vs-code/mcp/README.md +++ b/docs/how-tos/vs-code/mcp/README.md @@ -20,16 +20,15 @@ Datacoves ships four MCP servers: | [Grafana (Prometheus & Loki)](/docs/how-tos/vs-code/mcp/grafana) | Metrics and logs from your environment | None | | [Snowflake](/docs/how-tos/vs-code/mcp/snowflake) | Your Snowflake data and metadata, through read-only SQL | An MCP server created in your Snowflake account | -Once enabled, the GitHub, Airflow, and Grafana servers are available to every AI tool in your -workspace: +Once enabled, the GitHub, Airflow, Grafana, and Snowflake servers are available to every AI tool in +your workspace: - Datacoves Copilot - GitHub Copilot - [OpenAI Codex](/docs/how-tos/vs-code/external-ai-tools/openai-codex) - [Snowflake Cortex](/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex) -The Snowflake server is delivered to Datacoves Copilot; the other tools' MCP configs do not carry -it. Snowflake Cortex reaches your account directly and needs no MCP server. +Snowflake Cortex reaches your account directly and needs no MCP server for SQL. ## Enabling MCP servers @@ -51,9 +50,6 @@ enabled for your cluster. Contact [Datacoves support](mailto:support@datacoves.c see it. ::: -[Snowflake](/docs/how-tos/vs-code/mcp/snowflake) has no toggle. It appears on its own once an -account administrator creates the MCP server object in your Snowflake account. - ## What you can ask Each server page includes example prompts. A few to get started: diff --git a/docs/how-tos/vs-code/mcp/snowflake.md b/docs/how-tos/vs-code/mcp/snowflake.md index c3be87b8..5241a473 100644 --- a/docs/how-tos/vs-code/mcp/snowflake.md +++ b/docs/how-tos/vs-code/mcp/snowflake.md @@ -23,11 +23,8 @@ which runs inside your own Snowflake account. Your data never leaves it. server. - An MCP server object named `DATACOVES` in your Snowflake account, created by an account administrator as shown below. - -:::note -This server has no toggle in **Admin > Environments > AI Tools**. It appears on its own once the -server object exists in your account. -::: +- The **Snowflake** toggle turned on for your environment by an administrator, under + **Admin > Environments > AI Tools > MCP Servers**. ## Create the server in your Snowflake account @@ -66,18 +63,21 @@ change anything. ## How it works -**No setup in Datacoves.** Your workspace signs a token with the private key of your Snowflake -connection, asks your account which MCP servers it holds, and points Datacoves Copilot at the one -named `DATACOVES`. The token is short-lived and refreshed for you. +**One toggle, and nothing else to configure.** Your workspace signs a token with the private key of +your Snowflake connection, asks your account which MCP servers it holds, and points your AI tools at +the one named `DATACOVES`. The token is short-lived and refreshed for you. -In a standard environment this entry is delivered to Datacoves Copilot; the other tools' MCP -configs do not receive it. Snowflake Cortex reaches your account directly and needs no MCP server. +The entry is delivered to every AI tool in your workspace: Datacoves Copilot, GitHub Copilot, OpenAI +Codex and Snowflake Cortex. Snowflake Cortex reaches your account directly and needs no MCP server +for SQL. The server acts as **you**, through your connection's own Snowflake role, so it sees only what that role is allowed to see. -Until the server object exists, the `snowflake` entry sits switched off in Datacoves Copilot. Once -an administrator creates it, your workspace picks it up within five minutes, with no restart. +Until the server object exists, the entry holds a placeholder address and no token, so it cannot +reach your account: in Datacoves Copilot it sits switched off, and in GitHub Copilot, Codex and +Cortex it is listed but does not connect. Once an administrator creates it, your workspace picks it +up within five minutes, with no restart. ## Use it From a0f4e64c8d63325bdee5e8650c38d4368f64a516 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Wed, 23 Sep 2026 15:36:58 +0000 Subject: [PATCH 6/7] [DCV-3510] Snowflake MCP page: lone-server fallback, full delivery list, drop the Cortex exception --- docs/how-tos/vs-code/mcp/snowflake.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/how-tos/vs-code/mcp/snowflake.md b/docs/how-tos/vs-code/mcp/snowflake.md index 5241a473..7ae073bd 100644 --- a/docs/how-tos/vs-code/mcp/snowflake.md +++ b/docs/how-tos/vs-code/mcp/snowflake.md @@ -21,8 +21,8 @@ which runs inside your own Snowflake account. Your data never leaves it. - [Key pair authentication](/docs/how-tos/vs-code/initial) on that connection. Snowflake accepts a key pair token and nothing else for MCP, so a password-authenticated connection cannot reach the server. -- An MCP server object named `DATACOVES` in your Snowflake account, created by an account - administrator as shown below. +- An MCP server object in your Snowflake account, created by an account administrator as shown + below. - The **Snowflake** toggle turned on for your environment by an administrator, under **Admin > Environments > AI Tools > MCP Servers**. @@ -61,23 +61,26 @@ grant usage on mcp server ..DATACOVES to role Date: Thu, 24 Sep 2026 19:59:17 +0000 Subject: [PATCH 7/7] [DCV-3510] Snowflake MCP pages: server served from the workspace, Claude Code and Copilot CLI listed --- .../vs-code/external-ai-tools/claude-code.md | 4 ++++ .../vs-code/external-ai-tools/github-copilot.md | 3 ++- .../external-ai-tools/snowflake-cortex.md | 4 ++-- docs/how-tos/vs-code/mcp/README.md | 3 ++- docs/how-tos/vs-code/mcp/snowflake.md | 17 ++++++++--------- docs/reference/admin-menu/environments.md | 4 ++-- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/docs/how-tos/vs-code/external-ai-tools/claude-code.md b/docs/how-tos/vs-code/external-ai-tools/claude-code.md index dede3082..b2ac585d 100644 --- a/docs/how-tos/vs-code/external-ai-tools/claude-code.md +++ b/docs/how-tos/vs-code/external-ai-tools/claude-code.md @@ -65,6 +65,10 @@ If you have problems copying text from Claude Code in the VS Code terminal, run /tui default ``` +## MCP servers + +Claude Code, the extension and the CLI, can use the Datacoves [Snowflake MCP server](/docs/how-tos/vs-code/mcp/snowflake) when it is enabled for your environment. + ## Learn more - [Claude Code VS Code extension documentation](https://code.claude.com/docs/en/vs-code) diff --git a/docs/how-tos/vs-code/external-ai-tools/github-copilot.md b/docs/how-tos/vs-code/external-ai-tools/github-copilot.md index fbc9896b..f7822034 100644 --- a/docs/how-tos/vs-code/external-ai-tools/github-copilot.md +++ b/docs/how-tos/vs-code/external-ai-tools/github-copilot.md @@ -25,7 +25,8 @@ workspace as the GitHub Copilot and Copilot Chat extensions. ## MCP servers GitHub Copilot can use the Datacoves [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, Airflow, -Grafana) when they are enabled for your environment. +Grafana, Snowflake) when they are enabled for your environment. The GitHub Copilot CLI gets the +[Snowflake server](/docs/how-tos/vs-code/mcp/snowflake) too. ## Learn more diff --git a/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md b/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md index 3451e784..1ab149c0 100644 --- a/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md +++ b/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex.md @@ -26,8 +26,8 @@ for the authentication and usage steps. ## MCP servers -Cortex can use the Datacoves [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, Airflow, Grafana) -when they are enabled for your environment. +Cortex can use the Datacoves [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, Airflow, Grafana, +Snowflake) when they are enabled for your environment. ## Learn more diff --git a/docs/how-tos/vs-code/mcp/README.md b/docs/how-tos/vs-code/mcp/README.md index c3329103..acbbcadc 100644 --- a/docs/how-tos/vs-code/mcp/README.md +++ b/docs/how-tos/vs-code/mcp/README.md @@ -28,7 +28,8 @@ your workspace: - [OpenAI Codex](/docs/how-tos/vs-code/external-ai-tools/openai-codex) - [Snowflake Cortex](/docs/how-tos/vs-code/external-ai-tools/snowflake-cortex) -Snowflake Cortex reaches your account directly and needs no MCP server for SQL. +The Snowflake server also reaches [Claude Code](/docs/how-tos/vs-code/external-ai-tools/claude-code), +the extension and the CLI, and the GitHub Copilot CLI. ## Enabling MCP servers diff --git a/docs/how-tos/vs-code/mcp/snowflake.md b/docs/how-tos/vs-code/mcp/snowflake.md index 7ae073bd..971fb364 100644 --- a/docs/how-tos/vs-code/mcp/snowflake.md +++ b/docs/how-tos/vs-code/mcp/snowflake.md @@ -67,20 +67,19 @@ account holds exactly one MCP server it picks that one whatever it is called. ## How it works **One toggle, and nothing else to configure.** Your workspace signs a token with the private key of -your Snowflake connection, asks your account which MCP servers it holds, and points your AI tools at -it. The token is short-lived and refreshed for you. +your Snowflake connection, asks your account which MCP servers it holds, and serves that server to +your AI tools from inside the workspace. Every request goes to Snowflake with a current token, so a +conversation left open for hours keeps working. -The entry is delivered to every AI tool in your workspace: Datacoves Copilot, GitHub Copilot in VS -Code, the GitHub Copilot CLI, Snowflake Cortex and OpenAI Codex. A tool you do not have installed is -skipped, so there is nothing to turn off. +The server is delivered to every AI tool in your workspace: Datacoves Copilot, GitHub Copilot in VS +Code, the GitHub Copilot CLI, Claude Code (the extension and the CLI), OpenAI Codex and Snowflake +Cortex. Adding it changes nothing else in your tools' MCP settings. The server acts as **you**, through your connection's own Snowflake role, so it sees only what that role is allowed to see. -Until the server object exists, the entry holds a placeholder address and no token, so it cannot -reach your account: in Datacoves Copilot it sits switched off, and in the other tools it is listed -but does not connect. Once an administrator creates it, your workspace picks it up within five -minutes, with no restart. +Until the server object exists, your AI tools don't list it. Once an administrator creates it, your +workspace picks it up within five minutes, with no restart. ## Use it diff --git a/docs/reference/admin-menu/environments.md b/docs/reference/admin-menu/environments.md index eb8c1be2..ab7a89de 100644 --- a/docs/reference/admin-menu/environments.md +++ b/docs/reference/admin-menu/environments.md @@ -38,8 +38,8 @@ assistants and the data systems they can reach. It has three sections: - **AI Tools** - enable or disable the AI CLI tools, such as OpenAI Codex and Snowflake Cortex (Cortex is only shown on Snowflake environments). - **MCP Servers** - enable or disable the [MCP servers](/docs/how-tos/vs-code/mcp) (GitHub, - Airflow, and Grafana) that give the AI tools read access to your repositories, DAGs, and - metrics and logs. + Airflow, Grafana, and Snowflake) that give the AI tools read access to your repositories, DAGs, + metrics and logs, and Snowflake data. :::note The **Grafana (Prometheus & Loki)** MCP server only appears when the observability stack is