Atlas / MCP servers / databuddy-analytics / Databuddy

DatabuddyBLOCK

mcp/databuddy-analytics/databuddy

Open-source product analytics for startups: track visitors, events, funnels, and goals without cookies, and ask Databunny, the built-in AI analyst. Uptime, feature flags, and short links in the same dashboard.

Verdict
BLOCK
Grade
F
Trust score
29 /100
Exposed tools
56 35r · 14w · 7d
Transport
streamable-http
License
AGPL-3.0
Stars
1,200
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Understand how people use your product: where they come from, what they do, and where they drop off. Use that insight to decide what to build or improve next.

Databuddy is open-source product analytics for startups. One cookieless script tracks visitors, custom events, funnels, and goals, with opt-in error and web vitals tracking. Databunny, the built-in AI analyst, answers questions about your data and shows the query behind each answer. Feature flags, short links, and uptime monitoring run in the same dashboard.

  • Building a product? Try hosted Databuddy or follow the tracker setup guide.
  • Running your own stack? Read self-hosting below. A packaged release is still pending.
  • Want to help build Databuddy? Read the contributor guide. Bug reports and docs fixes count too.

Self-hosting

Run Databuddy on your server with Docker Compose. It sets SELFHOST=true, so events go straight to ClickHouse, while hosted billing and Databuddy's own telemetry are disabled. Email and AI are optional; see optional services.

Start your instance

These steps need a release with the databuddy-init image. None is published yet; check releases before starting. You'll need Git and Docker Compose for this setup.

git clone https://github.com/databuddy-analytics/Databuddy.git
cd Databuddy
git checkout YOUR_RELEASE_TAG
cp selfhost.env.example .env

In .env, set:

  • IMAGE_TAG to the release you checked out.
  • POSTGRES_PASSWORD, CLICKHOUSE_PASSWORD, and REDIS_PASSWORD to URL-safe passwords.
  • BETTER_AUTH_SECRET and DATABUDDY_ENCRYPTION_KEY to separate random secrets.

The template includes local URLs. Compose supplies database connections, SELFHOST, and browser settings; you don't need to repeat them in .env.

Generate each password

Read from source at commit 4aab6c49dc11OBSERVED · 2026-10-11
02

Exposed tools (56)

35 read · 14 write · 7 destructive. Blast radius: 7 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
AlarmsreadAlert rules and notifications for metrics and conditions across your organization.
AnnotationsdestructiveTimeline annotations for marking events on charts. Create, update, and delete annotations tied to specific time ranges and chart contexts.
AutocompletereadAutocomplete suggestions for analytics filters: page paths, custom events, browsers, countries, UTM params, and more. Used to power filter dropdowns and search.
BusinessreadSynthetic complimentary subscription
CheckoutreadComplete a purchase
DatabuddyreadLive uptime, incident history, and service health for public Databuddy status pages.
EventsreadTrack pageviews and custom events
FeedbackwriteSubmit and manage product feedback tied to your organization.
FlagswriteFeature flags for gradual rollouts and A/B testing. Create, update, and evaluate flags scoped to websites or organizations.
FunnelsreadFunnel conversion analysis. Define multi-step funnels, track conversions, and analyze funnel performance by referrer.
GeographicreadView visitor locations on a map
GoalsreadConversion goals and analytics. Define goals (custom events, page views, etc.), track conversions, and retrieve goal analytics.
LinksdestructiveShort link creation and management. Create, list, update, and delete short links with custom slugs. API keys require read:links or write:links scope.
OrganizationsreadOrganization management: avatar, invitations, billing context, and usage.
SDKsreadJavaScript, React, Vue, Swift
SignupwriteCreate an account
StatusPagereadPublic status pages, incidents, and monitor visibility settings. API keys require read:status_pages or write:status_pages scope.
TrackerreadTracker script version metadata and integrity hashes for supported client integrations.
UptimereadUptime monitor creation, updates, pause/resume controls, and manual checks. API keys require read:monitors or write:monitors scope.
UsersreadTrack individual user behavior and sessions
WebsitesdestructiveWebsite management: create, list, update, delete websites; transfer between organizations; configure settings, tracking, and data export.
add_users_to_flagwriteTarget user IDs or emails on a feature flag. mode=append (default) adds one rule; mode=replace deletes every existing rule first. confirmed=false (default) previews.
capabilitiesreadReturn get_data query types, date presets, categories, and a schema summary.
create_annotationwriteCreate a chart annotation. confirmed=false (default) returns a preview without writing; confirmed=true creates it.
create_flagwriteCreate a feature flag, inactive and boolean unless configured. confirmed=false (default) returns a preview without writing; confirmed=true creates it.
create_funnelwriteCreate a funnel for a website. confirmed=false (default) returns a preview without writing; confirmed=true creates it.
create_goalwriteCreate a conversion goal. confirmed=false (default) returns a preview without writing; confirmed=true creates it.
create_linkwriteCreate a short link in the website
databuddyreadDatabuddy MCP server for product analytics: visitors, events, funnels, goals, errors, Web Vitals, feature flags, short links, and Databunny investigations.
delete_annotationdestructiveDelete a chart annotation. confirmed=false (default) returns the annotation without deleting it; confirmed=true deletes it.
delete_goaldestructiveDelete a conversion goal. confirmed=false (default) returns the goal without deleting it; confirmed=true deletes it.
delete_linkdestructiveDelete a short link. confirmed=false (default) returns the link without deleting it; confirmed=true deletes it.
get_datareadQuery Databuddy
get_funnel_analyticsdestructiveReturn per-step conversion and drop-off for one funnel, by funnelId from list_funnels. range is the window measured. time_series holds at most the latest 90 points.
get_funnel_analytics_by_referrerreadReturn one funnel
get_goal_analyticsreadReturn entered and completed counts and the conversion rate for one goal, by goalId from list_goals.
get_investigationreadGet one durable investigation, including its current status, evidence-backed observations, and human replies. The ID may come from Slack or list_investigations.
get_schemareadReturn the analytics tables with column names and types as a reference.
internal_error_testreadTest that internal exception text is not returned to callers.
list_annotationsreadList chart annotations for a website: text, time range, tags, color, and visibility.
list_flagsreadList feature flags with their status, rollout, rules, and variants: a website
list_funnelsreadList funnels for a website with their steps and filters. Funnel IDs are used by get_funnel_analytics.
list_goalsreadList conversion goals for a website with their type, target, and filters. Goal IDs are used by get_goal_analytics.
list_insightsreadList published insights for an organization or website: title, summary, evidence, impact, and the recorded next step (null when no step was recorded, when a later finding for the same case superseded it, or when the case resolved).
list_investigationsreadList the latest investigation per subject, with status and IDs. Cases with a dashboard analysis or verification queued or running are left out until it finishes, and an older case may appear instead; get_investigation reads one by ID.
list_link_foldersreadList short-link folders for the website
list_linksreadList short links for the website
list_websitesreadList the websites this account can access, with IDs, names, domains, and organizations. Website-scoped tools accept websiteId, websiteName, or websiteDomain.
literal_string_inputreadTest that literal string inputs reach the handler unchanged.
orpc_error_testreadTest that ORPC errors keep their message and details.
reply_to_investigationwriteAdd a clarification to an existing investigation. It is answered from the case
search_linksreadFind short links across the full catalog matching a substring on name, slug, target URL, or external ID, newest first.
update_annotationwriteUpdate an annotation
update_flagwriteUpdate a feature flag
update_goalwriteUpdate a conversion goal. confirmed=false (default) returns the current goal and the changes without writing; confirmed=true applies them.
update_linkwriteUpdate a short link. confirmed=false (default) returns the current link and the changes without writing; confirmed=true applies them.
03

Trust audit

BLOCKgrade F · trust 29/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryFAIL
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (13 observation(s))
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
packages/notifications/src/providers/payload-utils.ts
payload-utils.ts
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/slack/src/slack/thread-queue.ts:14
eval(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/shared/src/ssrf-guard.ts:7
"metadata.google.internal",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/shared/src/ssrf-guard.ts:9
"169.254.169.254",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
apps/uptime/src/actions.ts:275
rejectUnauthorized: false,
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHSupply chain · supply.typosquat · CWE-829, CWE-1357
packages/devtools/package.json
preact ~ react
Why it matters. dependency name one edit from a popular package
Fix. verify the package; likely typosquat
HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
.agents/skills/databuddy-internal/SKILL.md:44
- Slack OAuth lives in `apps/api`, but slash commands/events require `apps/slack` to be running too; local `bun run dev:dashboard` runs dashboard + API only, so use `bun run dev:slack` when working on
Why it matters. asks the agent to read credentials
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/dashboard/fonts/lt-superior-mono/bold.otf
bold.otf
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/dashboard/fonts/lt-superior-mono/medium.otf
medium.otf
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/dashboard/fonts/lt-superior-mono/regular.otf
regular.otf
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/dashboard/fonts/lt-superior-mono/semibold.otf
semibold.otf
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/dashboard/fonts/lt-superior/bold.otf
bold.otf
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.cursor/skills/copywriting
.cursor/skills/copywriting
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.cursor/skills/frontend-design
.cursor/skills/frontend-design
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.cursor/skills/react-doctor
.cursor/skills/react-doctor
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.cursor/skills/seo-audit
.cursor/skills/seo-audit
Why it matters. link not followed
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
apps/insights/src/evals/injection.ts:253
exfiltrated: boolean;
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
apps/insights/src/evals/injection.ts:1537
function exfiltrates(brief: Brief): boolean {
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
apps/insights/src/evals/injection.ts:1835
exfiltrated: outcome ? exfiltrates(outcome) : false,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/dashboard/next.config.ts:127
? "http://localhost:* http://127.0.0.1:* ws://localhost:* ws://127.0.0.1:*"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/dashboard/next.config.ts:130
? "http://localhost:* http://127.0.0.1:*"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:80
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/databuddy_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/dashboard-e2e.yml:48
DATABUDDY_E2E_BASE_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/dashboard-e2e.yml:57
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/health-check.yml:408
-e DATABASE_URL=postgresql://postgres:postgres@localhost:5432/databuddy_test \

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 4aab6c49dc11full audit observations/trust-audit/mcp-server/databuddy-analytics__databuddy.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-114aab6c49dc11BLOCKF29first audit
05

Questions

What is the @databuddy/sdk MCP server?

Open-source product analytics for startups: track visitors, events, funnels, and goals without cookies, and ask Databunny, the built-in AI analyst. Uptime, feature flags, and short links in the same dashboard.

What tools does @databuddy/sdk expose?

56 in total: 35 read-only, 14 that write, and 7 that can delete or overwrite (Annotations, Links, Websites, delete_annotation, delete_goal). Every one is listed on this page with its risk.

Is @databuddy/sdk safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (29/100) and found 7 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 7 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @databuddy/sdk need?

It reads AI_GATEWAY_API_KEY, AUTUMN_SECRET_KEY, AUTUMN_WEBHOOK_SECRET, BETTER_AUTH_COOKIE_DOMAIN, BETTER_AUTH_SECRET, BETTER_AUTH_URL, BUNNY_API_KEY, BUNNY_STORAGE_ACCESS_KEY, CONTEXT_DEV_API_KEY, DATABUDDY_API_KEY, DATABUDDY_E2E_TEST_KEY and DATABUDDY_ENCRYPTION_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does @databuddy/sdk run?

It speaks streamable-http, so it runs as a service you connect to over the network.

How current is this page?

The grade is for one exact copy of the source (4aab6c49dc11), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement