The open-source form analytics platform — track form views, submissions & conversions, with funnels, UTM attribution and an MCP server.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 28 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
add_domain
-
create_api_key
-
create_funnel
-
create_utm_template
-
create_webhook
-
delete_funnel
-
delete_project
-
delete_utm_template
-
delete_webhook
-
get_breakdown
-
get_forms
-
get_funnel
-
get_project
-
get_series
-
get_stats
-
list_api_keys
-
list_funnels
-
list_projects
-
list_utm_templates
-
list_views
-
list_webhooks
-
query_events
-
remove_domain
-
revoke_api_key
-
rotate_project_secret
-
tracking_checkup
-
update_funnel
-
update_utm_template
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 366bec9 · analyzer v33 · 4d ago
danger signals2
- suspicious endpoint 93.184.216.34 relakeinc-trell-366bec9/apps/api/test/ssrf.test.ts :19
"https://93.184.216.34/hook", // public literal IPv4 - suspicious endpoint 169.254.169.254 (cloud metadata) relakeinc-trell-366bec9/apps/api/test/ssrf.test.ts :31
["http://169.254.169.254/latest/meta-data/", "url must not point at a private or internal address"],
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 258
filesystem 7
- fs relakeinc-trell-366bec9/apps/api/src/app.ts :2
import { readFile } from "node:fs/promises"; - fs relakeinc-trell-366bec9/apps/api/src/mcp-stdio.ts :1
import { existsSync } from "node:fs"; - fs (weak) relakeinc-trell-366bec9/apps/api/test/sdk.test.ts :2
import { readFileSync } from "node:fs"; - fs (weak) relakeinc-trell-366bec9/apps/web/scripts/e2e.ts :10
import { existsSync, readFileSync, createWriteStream, unlinkSync } from "node:fs"; - fs (weak) relakeinc-trell-366bec9/scripts/ensure-prod-tunnel.mjs :29
import { existsSync, readFileSync } from "node:fs"; - fs (weak) relakeinc-trell-366bec9/scripts/generate-icons.mjs :15
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs (weak) relakeinc-trell-366bec9/scripts/generate-pwa-icons.mjs :20
import { mkdirSync, writeFileSync } from "node:fs";
shell / exec 2
- shell (weak) relakeinc-trell-366bec9/apps/web/scripts/e2e.ts :9
import { spawn, type ChildProcess } from "node:child_process"; - shell (weak) relakeinc-trell-366bec9/scripts/ensure-prod-tunnel.mjs :28
import { spawn } from "node:child_process";
network 25
- net relakeinc-trell-366bec9/apps/api/src/index.ts :2
import { createServer } from "node:http"; - net relakeinc-trell-366bec9/apps/api/src/lib/ssrf.ts :2
import { isIP } from "node:net"; - net relakeinc-trell-366bec9/apps/api/src/lib/webhook-delivery.ts :193
res = await fetch(currentUrl, { - net relakeinc-trell-366bec9/apps/mcp/src/http.ts :2
import type { IncomingMessage, ServerResponse } from "node:http"; - net (weak) relakeinc-trell-366bec9/apps/mcp/test/http.test.ts :2
import { createServer } from "node:http"; - net relakeinc-trell-366bec9/apps/web/public/sw.js :58
const network = fetch(request) - net (weak) relakeinc-trell-366bec9/apps/web/scripts/e2e.ts :73
const r = await fetch(url, { cache: "no-store" }); - net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/_components/ProjectContext.tsx :73
const res = await fetch(`/api/projects/by-slug?slug=${encodeURIComponent(slug)}`); - net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/api/page.tsx :53
fetch(`/api/projects/${project.id}/api-keys`) - net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/billing/plans/page.tsx :86
const res = await fetch("/api/checkout", { - net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/domains/page.tsx :34
const res = await fetch(`/api/projects/${project.id}/domains`, { - net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/tracking/page.tsx :52
const res = await fetch("${INGEST_URL}", {
show 13 more
- net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/utm-templates/page.tsx :35
fetch(`/api/projects/${project.id}/utm-templates`) - net relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/webhooks/page.tsx :54
fetch(`/api/projects/${project.id}/webhooks`) - net relakeinc-trell-366bec9/apps/web/src/app/api/chat/route.ts :105
const res = await fetch(`${args.provider.baseUrl}/chat/completions`, { - net relakeinc-trell-366bec9/apps/web/src/app/pricing/page.tsx :52
const res = await fetch("/api/checkout", { - net relakeinc-trell-366bec9/apps/web/src/components/ChatWidget.tsx :539
const res = await fetch("/api/chat/command", { - net relakeinc-trell-366bec9/apps/web/src/components/CreateProjectModal.tsx :30
const res = await fetch("/api/projects", { - net relakeinc-trell-366bec9/apps/web/src/components/OnboardingFlow.tsx :27
const res = await fetch("/api/onboarding", { - net relakeinc-trell-366bec9/apps/web/src/components/ProjectSettings.tsx :96
const res = await fetch(`/api/projects/${projectId}`); - net relakeinc-trell-366bec9/apps/web/src/components/ProjectSidebar.tsx :71
fetch(`/api/projects/${project.id}`) - net relakeinc-trell-366bec9/apps/web/src/lib/apiClient.ts :25
const res = await fetch(url, { headers: { authorization: `Bearer ${sk}` }, cache: "no-store" }); - net relakeinc-trell-366bec9/apps/web/src/lib/hooks.ts :22
queryFn: () => fetch("/api/projects").then((r) => r.json() as Promise<ProjectsResponse>), - net (weak) relakeinc-trell-366bec9/scripts/ensure-prod-tunnel.mjs :30
import net from "node:net"; - net (weak) relakeinc-trell-366bec9/scripts/generate-icons.mjs :6
* `fetch(new URL("./...", import.meta.url))`, which breaks when the package is
secrets 12
- secrets relakeinc-trell-366bec9/apps/web/src/app/[slug]/settings/tracking/page.tsx :56
authorization: "Bearer " + process.env.TRELL_SECRET_KEY, - secrets relakeinc-trell-366bec9/apps/web/src/app/api/chat/command/route.ts :111
const oauthSecret = process.env.MCP_OAUTH_SECRET ?? ""; - secrets relakeinc-trell-366bec9/apps/web/src/app/api/chat/context/route.ts :24
const oauthSecret = process.env.MCP_OAUTH_SECRET ?? ""; - secrets relakeinc-trell-366bec9/apps/web/src/app/api/chat/route.ts :135
const oauthSecret = process.env.MCP_OAUTH_SECRET ?? ""; - secrets relakeinc-trell-366bec9/apps/web/src/app/api/onboarding/route.ts :18
const encKey = process.env.TRELL_ENC_KEY; - secrets relakeinc-trell-366bec9/apps/web/src/app/api/portal/route.ts :8
accessToken: process.env.POLAR_ACCESS_TOKEN!, - secrets relakeinc-trell-366bec9/apps/web/src/app/api/projects/[id]/rotate-secret/route.ts :26
const encKey = process.env.TRELL_ENC_KEY; - secrets relakeinc-trell-366bec9/apps/web/src/app/api/projects/route.ts :28
const encKey = process.env.TRELL_ENC_KEY; - secrets relakeinc-trell-366bec9/apps/web/src/app/api/webhooks/polar/route.ts :8
webhookSecret: process.env.POLAR_WEBHOOK_SECRET!, - secrets relakeinc-trell-366bec9/apps/web/src/lib/apiClient.ts :10
const encKey = process.env.TRELL_ENC_KEY; - secrets relakeinc-trell-366bec9/apps/web/src/lib/auth.ts :22
if (!process.env.AUTH_GOOGLE_ID || !process.env.AUTH_GOOGLE_SECRET) { - secrets relakeinc-trell-366bec9/apps/web/src/lib/polar.ts :4
accessToken: process.env.POLAR_ACCESS_TOKEN!,
database 11
- db (weak) relakeinc-trell-366bec9/apps/api/scripts/seed-events.ts :1
import { PrismaClient } from "@prisma/client"; - db (weak) relakeinc-trell-366bec9/apps/api/scripts/seed.ts :1
import { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/api/src/analytics/funnel.ts :1
import type { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/api/src/app.ts :6
import type { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/api/src/index.ts :4
import { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/api/src/mcp-stdio.ts :6
import { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/api/src/repositories/prisma.ts :1
import { Prisma, PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/api/src/routes/ingest.ts :4
import type { PrismaClient } from "@prisma/client"; - db (weak) relakeinc-trell-366bec9/apps/web/scripts/e2e.ts :13
import { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/web/src/lib/authz.ts :1
import type { PrismaClient } from "@prisma/client"; - db relakeinc-trell-366bec9/apps/web/src/lib/prisma.ts :1
import { PrismaClient } from "@prisma/client";
tool registrations 28
- list_projects relakeinc-trell-366bec9/apps/mcp/src/server.ts :92
- get_project relakeinc-trell-366bec9/apps/mcp/src/server.ts :96
- get_stats relakeinc-trell-366bec9/apps/mcp/src/server.ts :104
- tracking_checkup relakeinc-trell-366bec9/apps/mcp/src/server.ts :112
- get_series relakeinc-trell-366bec9/apps/mcp/src/server.ts :120
- get_breakdown relakeinc-trell-366bec9/apps/mcp/src/server.ts :128
- get_forms relakeinc-trell-366bec9/apps/mcp/src/server.ts :136
- query_events relakeinc-trell-366bec9/apps/mcp/src/server.ts :144
- list_funnels relakeinc-trell-366bec9/apps/mcp/src/server.ts :152
- get_funnel relakeinc-trell-366bec9/apps/mcp/src/server.ts :156
- list_views relakeinc-trell-366bec9/apps/mcp/src/server.ts :160
- list_webhooks relakeinc-trell-366bec9/apps/mcp/src/server.ts :164
show 16 more
- list_utm_templates relakeinc-trell-366bec9/apps/mcp/src/server.ts :172
- list_api_keys relakeinc-trell-366bec9/apps/mcp/src/server.ts :176
- create_funnel relakeinc-trell-366bec9/apps/mcp/src/server.ts :185
- update_funnel relakeinc-trell-366bec9/apps/mcp/src/server.ts :189
- delete_funnel relakeinc-trell-366bec9/apps/mcp/src/server.ts :197
- create_utm_template relakeinc-trell-366bec9/apps/mcp/src/server.ts :201
- update_utm_template relakeinc-trell-366bec9/apps/mcp/src/server.ts :205
- delete_utm_template relakeinc-trell-366bec9/apps/mcp/src/server.ts :209
- add_domain relakeinc-trell-366bec9/apps/mcp/src/server.ts :213
- remove_domain relakeinc-trell-366bec9/apps/mcp/src/server.ts :221
- create_webhook relakeinc-trell-366bec9/apps/mcp/src/server.ts :229
- delete_webhook relakeinc-trell-366bec9/apps/mcp/src/server.ts :237
- create_api_key relakeinc-trell-366bec9/apps/mcp/src/server.ts :241
- revoke_api_key relakeinc-trell-366bec9/apps/mcp/src/server.ts :250
- delete_project relakeinc-trell-366bec9/apps/mcp/src/server.ts :258
- rotate_project_secret relakeinc-trell-366bec9/apps/mcp/src/server.ts :266
declared dependencies 3
- prettier@^3.6.2
- turbo@^2.4.0
- typescript@^5.7.0
perm:untrusted 1
- untrusted (weak) relakeinc-trell-366bec9/apps/mcp/test/http.test.ts :123
const meta = await (await fetch(`${url}/.well-known/oauth-protected-resource`)).json();
transport_posture 1
- binds all interfaces (0.0.0.0) relakeinc-trell-366bec9/apps/api/src/index.ts :42
createServer((req, res) => void listener(req, res)).listen(mcpPort, "0.0.0.0", () => {