Guides
Give Claude Code, Cursor and Codex your data lineage over MCP

Give Claude Code, Cursor and Codex your data lineage over MCP

Subscribe to our Newsletter
Get the latest from our team delivered to your inbox
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Ready to get started?
Try It Free
Illustration of a coding agent plugged into a hub that connects to tables, jobs, documents and dashboards.

Coding agents are good at the repository they're working in. What they can't see is everything outside it: the job in another repo that reads the table they're changing, the dashboard that filters on a column value, the COBOL batch that reads the same Db2 column. Foundational Context of Code and Data gives the agent that view over MCP, so it can ask what depends on a table, column or dataset before it edits.

This guide covers what the agent can ask, a rules-file snippet that makes it ask at the right moment, and how it fits next to the dbt MCP server. The exact setup steps for each tool live in our help center. For the background, read what AI coding agents can't see, and the context that fixes it.

What the agent gets

Foundational analyzes source code across your repositories and languages, including Python, Java, Scala, TypeScript, Go, SQL, mainframe code such as COBOL and JCL, and tools like dbt and Spark. Over MCP, the agent can query:

  • End-to-end lineage for tables, columns and datasets, across repositories
  • Owners and other metadata for each asset

The MCP server returns lineage and definitions, never table contents. It only shows what your Foundational account can already see.

Questions worth asking before a change

Ask these in Claude Code, Cursor, Codex, GitHub Copilot or Devin, in the middle of a task:

  • "What reads or writes the STATUS column of ACCOUNT, across all our repos?"
  • "Which dashboards use the dim_products table?"
  • "Where does fct_user_sessions get its data from?"
  • "Who owns the service that reads this topic?"
  • "If I change the values in this column, which reports change with it?"

The same questions work whether the code is a Java service, a PySpark job, a dbt model or a COBOL program.

Make the agent ask at the right moment

An agent only calls a tool when it thinks it should. Add a short rule to CLAUDE.md, AGENTS.md or your Cursor rules so it checks before risky edits:

## Changes other systems may depend on
Before renaming, dropping or changing the type or values of a table, column or dataset:
1. Use the Foundational MCP tools to list everything that reads or writes it, in any repo or language, and who owns it.
2. Summarize that list in the pull request description.
3. If anything outside this repo depends on it, flag it and wait for a human review.

Connect it

Foundational runs as a hosted MCP server at https://mcp.foundational.io/mcp, over Streamable HTTP. For interactive use there's no API key: after you add the server, your tool sends you to Foundational to sign in. You need a user account in the Foundational app.

Step-by-step setup for Claude Code, Cursor, Codex, GitHub Copilot, Devin and other MCP clients is in the help center: Use Foundational MCP with your AI tools.

Using it next to the dbt MCP server

The dbt MCP server gives the agent your dbt project: models, tests and the DAG. Foundational Context of Code and Data covers what sits around it: the application code that writes the source tables, Spark jobs, mainframe programs and the BI tools that read the results. Teams that use dbt can run both, with dbt for project work and Foundational for impact outside the project.

Catch what the agent missed

A rule raises the odds the agent checks first, but it's not a guarantee. Impact analysis on the pull request shows the reviewer the downstream jobs, services and dashboards a change affects, whether a person or an agent wrote it. See impact analysis.

FAQ

Which coding agents work with Foundational Context of Code and Data?

Claude Code, Cursor, OpenAI Codex, GitHub Copilot and Devin, plus other MCP clients listed in the help center.

Do I need an API key?

Not for interactive use. Your tool sends you to Foundational to sign in. API tokens are for headless and CI setups; see the help center.

Does the agent see our data?

No. The server returns lineage and definitions, never table contents. Foundational needs read-only access to source code, and its warehouse connections read metadata only. Foundational is SOC 2 Type II certified.

Does it replace the dbt MCP server?

No. They cover different ground and work side by side.

Book a demo to see it on your own code.

code snippet <goes here>
<style>.horizontal-trigger {height: calc(100% - 100vh);}</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/ScrollTrigger.min.js"></script>
<script>
// © Code by T.RICKS, https://www.timothyricks.com/
// Copyright 2021, T.RICKS, All rights reserved.
// You have the license to use this code in your projects but not to redistribute it to others
gsap.registerPlugin(ScrollTrigger);
let horizontalItem = $(".horizontal-item");
let horizontalSection = $(".horizontal-section");
let moveDistance;
function calculateScroll() {
 // Desktop
 let itemsInView = 3;
 let scrollSpeed = 1.2;  if (window.matchMedia("(max-width: 479px)").matches) {
   // Mobile Portrait
   itemsInView = 1;
   scrollSpeed = 1.2;
 } else if (window.matchMedia("(max-width: 767px)").matches) {
   // Mobile Landscape
   itemsInView = 1;
   scrollSpeed = 1.2;
 } else if (window.matchMedia("(max-width: 991px)").matches) {
   // Tablet
   itemsInView = 2;
   scrollSpeed = 1.2;
 }
 let moveAmount = horizontalItem.length - itemsInView;
 let minHeight =
   scrollSpeed * horizontalItem.outerWidth() * horizontalItem.length;
 if (moveAmount <= 0) {
   moveAmount = 0;
   minHeight = 0;
   // horizontalSection.css('height', '100vh');
 } else {
   horizontalSection.css("height", "200vh");
 }
 moveDistance = horizontalItem.outerWidth() * moveAmount;
 horizontalSection.css("min-height", minHeight + "px");
}
calculateScroll();
window.onresize = function () {
 calculateScroll();
};let tl = gsap.timeline({
 scrollTrigger: {
   trigger: ".horizontal-trigger",
   // trigger element - viewport
   start: "top top",
   end: "bottom top",
   invalidateOnRefresh: true,
   scrub: 1
 }
});
tl.to(".horizontal-section .list", {
 x: () => -moveDistance,
 duration: 1
});
</script>
Share this post
Subscribe to our Newsletter
Get the latest from our team delivered to your inbox
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Ready to get started?
Try It Free

Governance that starts at the source.