Pendo Ontology MCP Server
A semantic ontology layer for Pendo that enables users to define and manage business concepts, entity relationships, and measurement hints, grounding LLM queries in workspace-specific definitions.
README
pendo-ontology-mcp
A semantic ontology layer for Pendo, as an MCP server. Pairs with the Pendo MCP server: Pendo MCP is the data plane (live entities, usage, retention, funnels); this server is the meaning plane — the business concepts, definitions, entity relationships, causes, and playbooks your workspace has agreed on.
Why
LLM agents querying product analytics fail in a characteristic way: they don't know what your objects mean. Feature and segment names encode tribal knowledge, business terms like "activation" have workspace-specific definitions that live in people's heads, and the relationships between objects and business goals are written down nowhere — so agents ask endless follow-ups and produce confidently wrong answers.
This server is the place where that meaning gets written down — and it's designed so the LLM itself does most of the writing. The flywheel:
you ask questions → the model learns what you care about
→ it proposes/records concepts here (you review)
→ every future question is grounded in your definitions
→ answers get sharper → you ask more
The ontology store is a single portable JSON file: diffable, version-controllable, and an organizational asset that survives model swaps and agent rewrites.
What it is (and isn't)
- A typed JSON graph, not RDF/OWL. Its consumers are an LLM context window and a human reviewer.
- Query-language agnostic. Concepts carry a prose
measurementHint("weekly cohort retention over the measured features"), not query templates. The agent turns hints into concrete Pendo MCP calls (entityUsageTimeSeries,cohortRetentionCurve, …). - No LLM calls inside the server. The client model is the intelligence; this server contributes deterministic guarantees (stable ids, phrase-match floors, coverage gaps) and durable storage.
Data model
STRUCTURAL (synced/pushed, rebuildable) SEMANTIC (the asset)
───────────────────────────────────── ─────────────────────────────
EntityNode Concept
id: "feature:<pendoId>" ← stable name, definition
kind: feature|page|segment| measurementHint (prose)
productArea|trackEvent|object measures: [entity ids]
pendoId ← valid directly in Pendo tools causes[] (+ questionTemplate)
name, appId?, url?, groupId? actions[] (+ questionTemplate)
tags[], source
Stable ids mean concept links survive full re-syncs. Entities deleted upstream leave dangling references that are ignored, never destroyed — a later sync may bring them back.
Install
git clone <this repo> && cd pendo-ontology-mcp
npm install && npm run build
Claude Code
claude mcp add pendo-ontology -- node /path/to/pendo-ontology-mcp/dist/index.js
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"pendo-ontology": {
"command": "node",
"args": ["/path/to/pendo-ontology-mcp/dist/index.js"],
"env": {
"ONTOLOGY_STORE_PATH": "/path/to/team/ontology.json"
}
}
}
}
Environment
| Variable | Default | Purpose |
|---|---|---|
ONTOLOGY_STORE_PATH |
~/.pendo-ontology/ontology.json |
Where the ontology lives. Point at a repo file to share with your team. |
PENDO_INTEGRATION_KEY |
— | Enables the optional sync_from_pendo direct REST sync. Not needed when pairing with Pendo MCP. |
PENDO_API_BASE |
https://app.pendo.io/api/v1 |
Override for EU/other regions. |
Tools
| Tool | Purpose |
|---|---|
get_product_map |
Overview: entity counts + every concept (definition, measurement hint, measured entities with pendoIds, causes, actions). Call first. |
lookup_ontology |
Search entities & concepts by name. Product areas expand into member features. |
get_entity_catalogue |
Full registered catalogue, features grouped by area — for picking measure links. |
upsert_concept |
Create/update a concept. autoLink: true adds deterministic phrase-matched entities. |
delete_concept |
Remove a concept (cause links to it are scrubbed). |
suggest_links |
Deterministic phrase-match candidates for a problem statement — the precision floor under the model's own semantic picks. |
list_coverage_gaps |
Entities no concept measures yet. Join with Pendo MCP usage data to rank concept candidates. |
ingest_pendo_payload |
The easy sync path: pass a RAW Pendo MCP tool result (listCountables, listProductAreas, segmentList, …) verbatim — array, wrapper object, or JSON string — and it's normalized and merged. Per-item evidence (elementPathRules → feature, url → page, kind-named wrapper keys) beats the kind hint. |
register_entities |
Structured push with explicit kinds (merge or replace). Use when you've already reshaped the data. |
sync_from_pendo |
Optional direct REST sync (needs PENDO_INTEGRATION_KEY). |
Resource: ontology://digest — a markdown digest of the whole ontology, ready to be pulled into context.
The pairing workflow (with Pendo MCP)
-
Seed the structure — ask Claude:
"List my product areas and features via Pendo, then register them in the ontology."
Claude calls Pendo MCP (
listProductAreas,listCountables,segmentList) and pipes each raw result straight intoingest_pendo_payload— no reshaping, no Pendo API key. (Alternatives:register_entitiesfor pre-shaped data, orPENDO_INTEGRATION_KEY+sync_from_pendofor direct REST sync.) -
Define what matters — ask:
"Define a concept 'Activation': accounts that used ≥3 core features in week 1. Map the entities it measures."
Claude drafts the concept, picks semantically-related entities from
get_entity_catalogue(plus thesuggest_linksfloor), and saves withupsert_concept. -
Let usage drive coverage — ask:
"What high-usage entities aren't covered by any concept?"
Claude joins
list_coverage_gapswith Pendo MCP usage (entityUsage) and proposes new concepts from the gaps. -
Ask grounded questions — from now on:
"How is Activation trending?"
Claude reads the concept (definition +
measurementHint+ measure pendoIds) and goes straight to the right Pendo MCP calls — no follow-up questions, no guessed IDs, your definition every time.
Design notes
- Phrase-matching is the floor, not the ceiling. Single-token name matching measured 119 false positives for "agent" in a real workspace; two-word phrases stay precise but can't see semantics. The model does the semantic mapping;
suggest_links/autoLinkguarantee the obvious matches are never missed. - Ontologies don't work on day 1. Meaning is distilled from use — questions asked, usage observed, definitions clarified. Start with structure + one or two concepts; let the flywheel run.
- Errors are results. Lookups return notes, not exceptions; a miss tells the model exactly which fallback to take.
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.