Veritas
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@VeritasStart investigation: weekly active users decline"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Veritas
An AI-powered data investigation workspace for Product Managers, combining structured investigation workflows with a collectively maintained three-tier data catalog.
What This Is
Two things working together:
Investigation MCP Server -- a custom MCP server that provides investigation lifecycle tools (start, continue, capture, close), three-tier catalog management (local/community/curated), and a self-improving memory system
Data Investigation Framework -- a structured workflow for running multi-session analyses with persistent context, findings tracking, and institutional knowledge that compounds over time
Agent Memory System -- behavioral learning that enables the AI agent to remember corrections, preferences, and workflow patterns across sessions, with a promotion pipeline for turning recurring patterns into permanent rule improvements
Data access (SQL queries, schema discovery, profiling) is handled by the official Databricks MCP server, which runs alongside the investigation MCP server. This separation means adding new data sources (Dynatrace, Amplitude, etc.) is just adding another MCP server entry.
Related MCP server: KDD Conversacional (mcpDataAnalysis)
Quick Start
Setup takes ~5 minutes. See GETTING_STARTED.md for the full guide with screenshots, or follow the quick version:
1. Clone and run setup
git clone https://github.com/hertzcorp/htzd-databricks-mcp.git
cd htzd-databricks-mcpMac / Linux: ./setup.sh | Windows (PowerShell): .\setup.ps1
The script checks prerequisites, installs dependencies, then asks you a few questions: your name, email, Databricks HTTP path, and a personal access token. It shows you the exact links to copy each value. One run — no editing files.
2. Restart Cursor and approve MCP servers
Restart Cursor (Mac: Cmd+Q | Windows: Alt+F4, then reopen). When it starts, click "Start" on the two MCP server prompts at the bottom of the screen. This is a one-time approval -- all tools are pre-approved after that.
3. Start asking questions
Open the Chat panel (Mac: Cmd+Shift+I | Windows: Ctrl+Shift+I) and try:
"What tables do we know about?" -- browse the team's data catalog
"Start investigation" -- begin a tracked multi-session analysis
"What data do we have on billing?" -- search the catalog for relevant knowledge
"Deep investigate: why is contact rate rising?" -- autonomous recursive investigation
"Deep index" -- crawl Databricks lineage to build the table knowledge base
See docs/ONE-PAGER.md for a quick reference of all features with end-to-end examples.
Project Structure
.
├── src/investigation_mcp/ # Investigation MCP server
│ ├── server.py # MCP server entry point (24 tools)
│ └── tools/ # Tool implementations
│ ├── investigation.py # Start, continue, capture, close investigations
│ ├── catalog_index.py # Catalog reading: index, entries, health, context
│ ├── catalog_local.py # Local entry capture + preferences
│ ├── catalog_sharing.py # Share local entries to community via PR
│ ├── catalog_curation.py # Curator tools: review, approve, reject
│ ├── memory.py # Agent memory: capture, load, reinforce, review, apply
│ ├── _git_helpers.py # Shared git utilities
│ └── catalog_management.py # Legacy catalog tools (deprecated)
├── data-catalog/ # Three-tier data catalog
│ ├── curated/ # Reviewed, authoritative knowledge (team-shared)
│ ├── community/ # Unvetted contributions from team members (team-shared)
│ ├── local/ # Personal notes, auto-captured (gitignored)
│ ├── _deep_index/ # Pre-computed table knowledge base (team-shared)
│ ├── _schema.yaml # Entry type definitions
│ └── _curators.yaml # Approved catalog curators
├── investigations/ # Tracked analyses (gitignored except templates + index)
│ └── _templates/ # Templates for new investigations
├── docs/
│ ├── hertzcorp-architecture/ # Hertz system architecture references
│ ├── adoption/ # Adoption strategy and growth plans
│ ├── workshop/ # Workshop facilitator guide and slide assets
│ ├── ONE-PAGER.md # Quick feature reference
│ ├── SPEC.md # Technical specification
│ └── PATTERNS.md # Architectural patterns
├── .cursor/
│ ├── memory/ # Agent behavioral memory (gitignored)
│ │ ├── corrections/ # Behavioral corrections (YAML)
│ │ ├── preferences/ # Style and output preferences (YAML)
│ │ ├── patterns/ # Detected workflow patterns (YAML)
│ │ └── reflections/ # Session retros (Markdown)
│ ├── rules/ # Cursor rules
│ │ ├── analysis-principles.mdc # 8 data analysis principles
│ │ ├── memory.mdc # Agent memory behavior (when to capture/load/cite)
│ │ ├── pm-guardrails.mdc # Prevents AI from modifying protected files
│ │ ├── first-run.mdc # Welcome experience for new users
│ │ └── ... # Development workflow rules
│ ├── hooks/
│ │ └── memory-flush.py # Advisory: remind to capture learnings at session end
│ └── skills/
│ └── data-investigation/ # Investigation workflow skill
├── ideation/ # Product concepts and drafts (gitignored)
├── scripts/ # Standalone analysis scripts
├── .github/
│ └── workflows/
│ └── catalog-validation.yml # CI: validates catalog entries on PR
├── setup.sh # Onboarding wizard
├── GETTING_STARTED.md # PM-friendly setup guide
└── pyproject.toml # Package: investigation-toolkitThree-Tier Data Catalog
The catalog is the institutional knowledge layer. It grows with every investigation.
Tier | Location | Shared? | Trust Level | How It Gets There |
Local |
| No (gitignored) | Personal notes | AI auto-captures during investigations |
Community |
| Yes (via PR) | Unvetted | PM shares via |
Curated |
| Yes (via PR) | Authoritative | Curator promotes from community |
Knowledge lifecycle:
Investigation discovers knowledge
-> AI auto-captures to local/ (continuous, silent)
-> PM selects what to share ("share this with the team")
-> share_to_catalog creates PR to community/ (CI validates, approver merges)
-> Curator reviews community entries (review_pending)
-> Curator promotes to curated/ (approve_entry) or rejects (reject_entry)The AI reads all three tiers with trust ordering: curated (high confidence) > community (hints, verified before use) > local (personal recall).
Investigation Framework
How It Works
Say "start investigation" in Cursor chat to begin a tracked analysis. The framework:
Discovery -- loads the catalog, refines the question, finds the right tables
Analysis -- runs queries via Databricks MCP, auto-captures discoveries to local catalog
Validation -- samples raw records, confirms field semantics, checks system behavior
Capture -- saves findings, presents unshared catalog entries for sharing
Close -- marks complete, prompts for catalog sharing
Investigations persist across sessions. Say "continue investigation" to resume where you left off.
Agent Memory System
The agent learns from your corrections and preferences over time through two paths:
Soft path (immediate): Corrections and preferences are saved to .cursor/memory/ and loaded into context at the start of future sessions. The agent adjusts its behavior based on past learnings without any structural changes.
Hard path (permanent): When a correction recurs 3+ times across sessions, the agent detects the pattern and proposes a permanent change to the workflow rules or investigation skill. You approve before anything changes. Platform-scope proposals create a PR for team review.
What | How |
Correct the agent | It calls |
Same correction 3x | Pattern detected, proposed as a rule change at session end |
Approve a proposal |
|
Wrong promotion | Agent detects contradiction and proposes rollback |
Check system health |
|
Memory is personal and gitignored. Each PM's agent learns independently. Improvements that benefit everyone flow through the PR-based promotion pipeline.
Analysis Principles
The .cursor/rules/analysis-principles.mdc rule enforces eight principles:
Ground truth first -- sample raw records before aggregating
Profile before joining -- verify field contents, don't assume from names
Ask about system behavior early -- domain knowledge shapes data interpretation
Correlation is not causation -- prevalence on a record does not equal cause
Explicit assumptions -- every volume estimate needs a stated deflection rate
Hypotheses before conclusions -- present as "data suggests" until validated
Flag observability gaps -- generic error codes need decomposition, not sizing
Signal catalog trust level -- indicate whether knowledge is curated, community, or local
Commands Reference
Investigation Commands
Command | What It Does |
| Create a new tracked investigation |
| Resume a previous investigation with full context |
| Save findings and offer to share catalog entries |
| Mark complete, prompt for final catalog sharing |
| Show active and recent investigations |
Catalog Commands
Command | What It Does |
| Load catalog index -- shows all entries across tiers |
| Load entries for a specific domain or subject |
| Share a local catalog entry to community via PR |
| Show catalog metrics: backlog, coverage, stale entries |
| Retry shares that failed due to connectivity |
Curator Commands
Command | What It Does |
| Show pending community entries grouped by domain |
| Promote a community entry to curated (curator-only) |
| Remove a community entry with optional reason |
MCP Tools Reference
Investigation MCP (Custom)
Tool | Description |
| Create investigation folder with templates |
| Load investigation context and resume |
| Save findings, prompt for catalog sharing |
| Mark complete, final catalog check |
| List active/completed investigations |
| Lightweight index of all catalog entries |
| Full content for entries matching filter |
| Read curated domain knowledge |
| Catalog metrics and health summary |
| Capture a discovery to local catalog |
| Share local entry to community via PR |
| Retry failed shares from offline sessions |
| Summarize unreviewed community entries |
| Promote community entry to curated (curator-only) |
| Remove community entry (curator-only) |
| Read learned preferences |
| Save a preference for future sessions |
| Capture a correction, preference, or pattern to memory |
| Load scored, filtered memories for current context |
| Reinforce an existing memory when same correction recurs |
| Generate end-of-session learning summary with proposals |
| Write a structured session retro to memory |
| Apply approved proposal to rule/skill file (or create PR) |
| Report memory system health and run maintenance |
Official Databricks MCP (Data Access)
Data access tools are provided by the official Databricks MCP server:
Tool | Description |
| List Unity Catalog catalogs |
| List schemas in a catalog |
| List tables in a schema |
| Get column details |
| Run SQL queries |
| Get sample rows |
| Generate data quality profile |
Tips for Better Results
At the start of an investigation:
The AI loads the catalog automatically. For new domains without curated entries, tell the AI what tables to use.
Share system context early -- how key systems behave, known data quirks, business rules.
State a hypothesis: "I think X is caused by Y" is more productive than "Tell me about X."
During analysis:
Challenge aggregate findings. Ask "Have you looked at actual records?"
When the AI presents a volume estimate, ask about the assumption: "What deflection rate?"
The AI auto-captures gotchas, joins, and terms to your local catalog as it discovers them.
At the end of a session:
Say "capture findings" to save progress. The AI presents unshared catalog entries for sharing.
Choose which discoveries to share with the team. The AI handles the PR.
For executive deliverables:
Ask the AI to create a separate brief rather than editing findings.md.
Push back on oversimplified narratives. Ask for sub-problems.
Request an assumptions and limitations section.
Extending with Additional MCP Servers
Adding a new data source is just adding an entry to .cursor/mcp.json.template:
{
"mcpServers": {
"dynatrace": {
"command": "npx",
"args": ["-y", "@dynatrace-oss/dynatrace-mcp-server@latest"],
"env": {
"DT_URL": "{{DT_URL}}",
"DT_TOKEN": "{{DT_TOKEN}}"
}
}
}
}The investigation MCP and catalog are source-agnostic. The catalog's system field tracks which data source knowledge came from.
Running Scripts
Legacy standalone analysis scripts can be run from the repo root. Note: some older scripts may reference the previous databricks_mcp package which has been renamed to investigation_mcp. See the scripts directory for details.
Troubleshooting
"MCP server not showing in Cursor"
Run
./setup.sh --test-onlyto validate configurationRestart Cursor completely (Cmd+Shift+P > "Reload Window")
Check
.cursor/mcp.jsonexists and has correct paths
"Setup fails at connection test"
Verify your Databricks workspace URL includes
https://Check that your personal access token hasn't expired
Ensure your SQL Warehouse is running
Try
./setup.sh --no-testto skip validation, fix credentials in.env, then./setup.sh --test-only
"Table not found"
Check the full table path (catalog.schema.table)
Use
load_catalog_indexto see what the team knows aboutVerify you have access to the table in Databricks
Security Notes
Databricks tokens stored in
.env(gitignored, never committed)Local catalog entries are gitignored (personal to each user)
Community catalog entries go through PR review before merging
CI scans catalog PRs for secrets and PII patterns
PM guardrails rule prevents AI from modifying protected files (rules, skills, curated catalog) -- exception:
apply_proposalduring approved learning reviewsAgent memory files are gitignored (personal behavioral learnings never pushed to remote)
Memory promotions to rule files require explicit human approval; platform-scope changes go through PR review
Curator authorization enforced programmatically via
_curators.yaml
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Lsyedibrahim/databricks-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server