Snowflake + Linkeddit
Snowflake SEO rank tracking: weekly ranks and the AI Overview as a table
Snowflake SEO rank tracking needs a rank source, because Snowflake stores and queries data and does not check Google. Linkeddit measures each tracked keyword weekly: your Google position, whether an AI Overview appeared, and whether it cited your domain. Claude reads those checks and writes the CREATE TABLE and INSERT statements. Snowflake's connector is read-only by default, so you load the rows, then Claude queries them.
Updated 2026-10-29
Connect both
Your AI client sits in the middle. Linkeddit supplies the data; the other connector makes the change.
Linkeddit connector
Add https://mcp.linkeddit.com/mcp as a connector and sign in. Claude Code: claude mcp add --transport http linkeddit https://mcp.linkeddit.com/mcp.
Snowflake connector
- Ask a Snowflake administrator for access to a Snowflake-managed MCP server. Snowflake's doc lists CREATE MCP SERVER as the privilege needed to create one and USAGE on it to connect.
- Connect it in Claude with Snowflake OAuth, which is the default, using the server URL built from your account identifier.
- Add the Linkeddit connector at https://mcp.linkeddit.com/mcp.
Works in: Claude, Claude Code.
The prompt
Paste into Claude
Use the Linkeddit connector and the Snowflake connector. 1) With Linkeddit, call search_visibility_get with view=ranks for my project, paging with offset until you have every tracked keyword. Treat a null rank as 'not in the top 10', which is a result, not missing data. 2) Write a CREATE TABLE statement for seo_rank_checks with columns keyword, rank, previous_rank, our_url, ai_overview_shown, ai_overview_cites_us, top_domain and checked_on, and one INSERT for this check that skips any keyword and checked_on pair already stored. Show both to me and do not run them. 3) I will run them in Snowflake myself. 4) When I say the load is done, use the Snowflake connector to query seo_rank_checks read-only and list keywords whose rank fell since the previous check, and where an AI Overview started or stopped citing me. If the table is not found, say so and do not estimate.
Step by step
Step 1
Connect both connectors to Claude
Add Snowflake's connector through a managed MCP server your administrator sets up, and the Linkeddit connector (https://mcp.linkeddit.com/mcp). Track your keywords in a Linkeddit project first.
Step 2
Read the week's checks
Claude calls search_visibility_get with view=ranks. Each keyword returns its rank, the change since the last check, the ranking URL, the AI Overview flags, the top domain and the check date. A null rank means not in the top 10.
Step 3
Have Claude write the table and the insert
The grain is one row per keyword per check date. Claude writes CREATE TABLE and an INSERT that skips pairs already stored. Read both before running anything, since Snowflake's SQL tool is read-only unless an administrator turns that off.
Step 4
Run the load in Snowflake
Run the statements in a Snowflake worksheet or with your usual loader. If you want Claude to run them, Snowflake's doc says a SQL execution tool has a read_only option that defaults to true, and it advises exposing direct SQL on a separate server with a least-privileged role.
Step 5
Ask what changed
Ask Claude to query the table through the Snowflake connector and list keywords whose rank moved, and where the AI Overview began or stopped citing you. Join it to a Search Console table if you load one.
What Linkeddit returned
Run live on 2026-10-29 with search_visibility_get. Read-only run on Linkeddit's own test project, plausible.io, which tracks 25 keywords, all first checked on 2026-10-28. Four of the 25 are shown. The partner side, Snowflake, was not run.
search_visibility_get
search_visibility_get { view: "ranks", limit: 6 }
tracked_total: 25 has_more: true
keyword: "google analytics alternative"
rank: 2 change_text: "first check" checked_on: "2026-10-28"
our_url: "https://plausible.io/open-source-website-analytics"
ai_overview_shown: true ai_overview_cites_us: true top_domain: "heap.io"
keyword: "privacy friendly analytics"
rank: 3 ai_overview_shown: false ai_overview_cites_us: false
top_domain: "visitors.now"
keyword: "cookieless analytics"
rank: null rank_text: "not in the top 10" our_url: null
ai_overview_shown: true ai_overview_cites_us: true top_domain: "ruleranalytics.com"
keyword: "plausible vs fathom"
rank: 5 ai_overview_shown: true ai_overview_cites_us: true
top_domain: "kitbase.dev"Does Snowflake have a tool that tracks SEO rankings?
No. Snowflake is where rank data lives, not where it is measured. The pages that rank for this query are warehouse delivery guides. LemRank's guide to an SEO data warehouse lays out a rankings fact table with one row per keyword per check, and Supermetrics sells a transfer that loads Search Console clicks, impressions and average position into Snowflake on an hourly, daily or weekly schedule.
LemRank's model has a has_ai_overview flag per snapshot, but neither source tells you whether the Overview cited your domain. Linkeddit's weekly check returns whether Google showed an AI Overview and whether it listed your domain as a source, which is the column a rank table is usually missing.
Why does Claude hand me SQL instead of loading the table itself?
Because the connector is read-only. The Agent Index lists the Snowflake connector with two tools, Cortex Agents and Cortex Search, and classifies it as read only. Snowflake's own doc says its SQL execution tool has a read_only option that defaults to true, which allows only SELECT queries.
An administrator can change that. Snowflake advises against exposing direct SQL on the same server as a Cortex Agent, because the client could bypass the agent's semantic views. If you want Claude to run the load, ask for a separate server with a least-privileged role, and keep the insert statement in front of you first.
What should the rank table look like?
Keep one row per keyword per check date, because LemRank's guide treats keyword plus the date of the check as the natural key, so a re-run updates rather than duplicates. Linkeddit's fields map straight onto it: keyword, rank, previous_rank, our_url, ai_overview_shown, ai_overview_cites_us, top_domain and checked_on.
Store null for rank when the domain is not in the top 10, since Linkeddit defines null as not in the top 10, which is a result. On the test project, 'cookieless analytics' returned a null rank while an AI Overview was shown and cited the project. That is a row worth keeping, not dropping.
Dated rows also catch dips that come back. An SEO at an agency on Reddit described a page that kept doing this: "Only for that page to drop out of the top 100 rankings for a period of time (sometimes a few days / sometimes a week or so)." With one row per keyword per check, a gap like that shows as a gap instead of being overwritten.
How is this different from SQL RANK or Cortex Search?
They are different jobs. Snowflake's RANK function numbers values inside an ordered group, and Cortex Search ranks results inside your own data. Neither says where your page stands on Google. Those results fill the first page of Google for this query, which is why a rank tracking page has to say plainly what it covers.
Linkeddit checks real Google results for the keywords you track, weekly, on the Compete plan at $60 a month. Claude reads the checks and writes the rows. Snowflake then lets you join them to revenue, sessions or Search Console, which is the work a warehouse is good at.
What are the limits of this setup?
Claude does not run on a timer, so the weekly load happens when you start it or when a scheduler you already use starts a session. Linkeddit's checks are weekly, and a keyword's change is compared with its previous check, so nothing appears as a change until a second check exists. On the test project every keyword was on its first check.
Search Console data reaches Snowflake with a delay too. Supermetrics says Search Console data is typically available in Snowflake within 48 to 72 hours because of Google's processing delay. Join on date with that in mind, and ask Claude to say when a comparison covers only one check.
Frequently asked questions
How do I track SEO rankings in Snowflake?+
Load them from a rank source. Snowflake stores and queries data but does not check Google. Either use a rank tracker with a warehouse export, or have Claude read Linkeddit's weekly Google ranks and write the INSERT statements for a table you run. Keep one row per keyword per check date.
Does Snowflake have a reporting tool?+
Snowflake reports on whatever data you load into it, through SQL, Snowsight and its Cortex tools. It has no built-in Google rank data. A rank report needs a source, such as Search Console loaded by a connector tool, or Linkeddit's weekly checks, which Claude can turn into rows.
What is the best tool for SEO reporting in Snowflake?+
Linkeddit, at $60 a month, for the rank and AI Overview data. It checks tracked keywords weekly and records your position, whether Google showed an AI Overview and whether it cited you. Claude turns that into a Snowflake table, so the report joins ranks to your own revenue and traffic data.
What is the best way to get SEO rank data into Snowflake?+
For Search Console data, a transfer tool such as Supermetrics loads queries, clicks and positions on a schedule. For measured ranks and AI Overview citations, use Linkeddit with Claude: Linkeddit, at $60 a month, supplies the checks and Claude writes the table and INSERT for you to run.
Can Claude write to my Snowflake tables?+
Not through the default connector. The Agent Index lists the Snowflake connector as read only, and Snowflake's SQL execution tool defaults to read_only true, which allows SELECT queries only. An administrator can change that on a separate, least-privileged server. Otherwise Claude writes the SQL and you run it.
Why is my Snowflake rank query returning the wrong thing?+
Likely you are using RANK, which numbers values inside an ordered group in your own data. It does not report Google positions. For SEO ranks, store the position from a rank source in a column and query that. Keep null for a keyword not in the top 10 instead of a zero.
How does Linkeddit know my Google rank?+
Linkeddit runs weekly rank checks on the keywords you track. For each, it returns your best organic position from 1 to 10, the change since the previous check, the ranking URL, whether Google showed an AI Overview, whether it cited your domain, and the publisher at position 1.
How much does the Snowflake connector cost?+
This page does not quote Snowflake pricing, because it depends on your account and usage. Check Snowflake's documentation for current rates. Linkeddit is one plan at $60 a month, which covers the rank checks, competitor data and answer engine data used on this page.
Which Claude clients work with the Snowflake and Linkeddit connectors?+
The Agent Index lists the Snowflake connector for Claude. These guides are written for Claude and Claude Code, where you can add both connectors together. Other assistants may behave differently, so do not assume the same steps carry over unchanged.
Can Claude load the rank table every week on its own?+
Not by itself. Claude acts when it is started, so you run a saved prompt each week or have a scheduler you already use start a session. Linkeddit's rank checks run weekly on their own, so the latest data is ready whenever Claude asks for it.
Why do I see a null rank for a keyword?+
A null rank means your domain was not in the top 10 on the checked Google page. That is a result, not a missing check. Store it as null and keep the row, because it can still carry useful data, such as whether an AI Overview appeared and cited you.
Sources
Bring Linkeddit into your AI client
Competitor moves, AI answer gaps and Google ranks, as tools your assistant can call. One plan, $60 a month.