The universal remote for AI: one MCP install gives agents 450+ callable endpoints across 60+ integrations, plus persistent cross-session memory. Works with Claude, ChatGPT, Cursor, and any MCP client.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
no tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed v0.3.99 · analyzer v18 · 8h ago
danger signals1
- suspicious endpointapi.telegram.orgpackage/dist/telegram-tool.js:4
const TELEGRAM_API_BASE = "https://api.telegram.org";
evidence-backed
findings quoted directly from the published source artifact — not inferred
last analysis: too-large · showing evidence from the last successful analysis (6d ago)
filesystem 4
- fs package/dist/__tests__/server-manifest.test.js :1
import { readFileSync } from "node:fs"; - fs package/dist/client.js :1
import * as fs from "fs"; - fs package/dist/memory/instrumentation.js :18
import * as fs from "fs"; - fs package/dist/memory/local.js :10
import * as fs from "fs";
shell / exec 3
- shell package/dist/legalpass-tool.js :76
while ((match = pattern.exec(text)) !== null) { - shell package/dist/local-catalog-handlers.js :525
while ((m = re.exec(input)) !== null) { - shell package/dist/qc-tool.js :164
while ((m = hrefPattern.exec(html)) !== null && links.length < 20) {
network 133
- net package/dist/abn-tool.js :7
const res = await fetch(url, { - net package/dist/abuseipdb-tool.js :14
const res = await fetch(`${ABUSEIPDB_BASE}${path}?${qs}`, { - net package/dist/airtable-tool.js :17
response = await fetch(url, { - net package/dist/algolia-tool.js :21
const res = await fetch(url.toString(), { - net package/dist/alphavantage-tool.js :18
const response = await fetch(url.toString()); - net package/dist/amazon-tool.js :87
const response = await fetch(url, { method: "POST", headers, body: bodyStr }); - net package/dist/amber-tool.js :15
const res = await fetch(`${AMBER_BASE}${path}${qs}`, { - net package/dist/anthropic-tool.js :54
const res = await fetch(`${ANTHROPIC_API_BASE}${path}`, { - net package/dist/asana-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/assemblyai-tool.js :61
const res = await fetch(url.toString(), { - net package/dist/australiapost-tool.js :15
const res = await fetch(`${AUSPOST_BASE}${path}${qs}`, { - net package/dist/bandsintown-tool.js :25
response = await fetch(url.toString(), { - net package/dist/bgg-tool.js :13
const res = await fetch(`${BGG_BASE}${path}`, { - net package/dist/bluesky-tool.js :8
const res = await fetch(`${BSKY_HOST}/xrpc/com.atproto.server.createSession`, { - net package/dist/bungie-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/calendly-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/carboninterface-tool.js :14
const res = await fetch(`${CI_BASE}${path}`, { - net package/dist/chessdotcom-tool.js :7
const res = await fetch(`${CHESS_BASE}${path}`, { - net package/dist/circleci-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/clickup-tool.js :23
response = await fetch(url.toString(), { - net package/dist/client.js :32
const response = await fetch(fetchUrl, { - net package/dist/clockify-tool.js :31
response = await fetch(url.toString(), { - net package/dist/cohere-tool.js :14
const res = await fetch(`${COHERE_API_BASE}${path}`, { - net package/dist/coingecko-tool.js :14
const response = await fetch(url.toString(), { headers }); - net package/dist/coinmarketcap-tool.js :17
const response = await fetch(url.toString(), { - net package/dist/convertkit-tool.js :26
const res = await fetch(url, { - net package/dist/crews-tool.js :30
const res = await fetch(url, init); - net package/dist/datadog-tool.js :19
const res = await fetch(url.toString(), { - net package/dist/deepl-tool.js :21
const res = await fetch(`${base}${path}`, { - net package/dist/deezer-tool.js :6
const res = await fetch(`${DEEZER_BASE}${path}`, { - net package/dist/discogs-tool.js :13
const res = await fetch(url, { - net package/dist/discord-tool.js :12
const res = await fetch(`${DISCORD_API}${path}`, { - net package/dist/domain-tool.js :14
const res = await fetch(`${DOMAIN_BASE}${path}`, { - net package/dist/ebay-tool.js :27
response = await fetch(EBAY_TOKEN_URL, { - net package/dist/ebird-tool.js :19
const res = await fetch(url.toString(), { - net package/dist/elevenlabs-tool.js :57
const res = await fetch(`${EL_API_BASE}${path}`, { - net package/dist/email-tool.js :70
fetch = imap.fetch(source, opts); - net package/dist/espn-tool.js :6
const res = await fetch(`${ESPN_BASE}${path}`, { - net package/dist/etsy-tool.js :24
response = await fetch(url.toString(), { - net package/dist/eventbrite-tool.js :32
response = await fetch(url.toString(), init); - net package/dist/exchangerate-tool.js :12
const res = await fetch(path, { - net package/dist/feedly-tool.js :32
response = await fetch(url.toString(), { - net package/dist/figma-tool.js :12
const res = await fetch(url, { - net package/dist/flyio-tool.js :22
response = await fetch(url.toString(), { - net package/dist/foursquare-tool.js :23
response = await fetch(url.toString(), { - net package/dist/fpl-tool.js :7
const res = await fetch(`${FPL_BASE}${path}`, { - net package/dist/gdelt-tool.js :11
const res = await fetch(url, { - net package/dist/genius-tool.js :20
const response = await fetch(url.toString(), { - net package/dist/github-tool.js :26
response = await fetch(url.toString(), { - net package/dist/gitlab-tool.js :25
response = await fetch(url.toString(), { - net package/dist/groq-tool.js :13
const res = await fetch(`${GROQ_BASE}${path}`, { - net package/dist/guardian-tool.js :12
const res = await fetch(`${GUARDIAN_BASE}${path}?${qs}`); - net package/dist/gumroad-tool.js :21
const res = await fetch(url.toString(), { - net package/dist/hackernews-tool.js :7
const res = await fetch(`${HN_BASE}${path}`, { - net package/dist/haveibeenpwned-tool.js :17
const res = await fetch(`${HIBP_BASE}${path}${qs}`, { - net package/dist/heygen-tool.js :14
const res = await fetch(`${HG_API_BASE}${path}`, { - net package/dist/higgsfield-tool.js :14
const res = await fetch(`${HF_API_BASE}${path}`, { - net package/dist/hunter-tool.js :15
const res = await fetch(`${HUNTER_BASE}${path}?${qs}`, { - net package/dist/igdb-tool.js :22
const res = await fetch(`${TWITCH_TOKEN_URL}?client_id=${encodeURIComponent(clientId)}&client_secret=${encodeURIComponent(clientSecret)}&grant_type=client_credentials`, { method: "POST" }); - net package/dist/instapaper-tool.js :88
response = await fetch(url, { - net package/dist/ipapi-tool.js :9
const response = await fetch(url, { headers: { "Accept": "application/json" } }); - net package/dist/ipaustralia-tool.js :15
const res = await fetch(`${IPAU_BASE}${path}${qs}`, { - net package/dist/keychain-secure-input.js :8
import { createServer } from "http"; - net package/dist/keychain-tool.js :22
const res = await fetch(url, { - net package/dist/kling-tool.js :14
const res = await fetch(`${KLING_API_BASE}${path}`, { - net package/dist/lastfm-tool.js :16
const res = await fetch(`${LASTFM_BASE}/?${qs}`); - net package/dist/lego-tool.js :25
const res = await fetch(url.toString(), { - net package/dist/lemonsqueezy-tool.js :14
const res = await fetch(`${LS_API_BASE}${path}`, { - net package/dist/lichess-tool.js :12
const res = await fetch(url.toString(), { - net package/dist/line-tool.js :7
const res = await fetch(`${LINE_API_BASE}${path}`, { - net package/dist/linear-tool.js :10
response = await fetch(LINEAR_API, { - net package/dist/mailchimp-tool.js :21
const res = await fetch(url.toString(), { - net package/dist/mapbox-tool.js :15
const res = await fetch(url.toString()); - net package/dist/mastodon-tool.js :26
const res = await fetch(url, init); - net package/dist/meal-tool.js :6
const res = await fetch(`${MEALDB_BASE}${path}`, { - net package/dist/memory/agent.js :22
const res = await fetch(url, { - net package/dist/memory/conflicts.js :189
const res = await fetch(`${CONFLICT_API_BASE}/api/memory-admin?action=conflict_detect`, { - net package/dist/memory/db.js :34
const res = await fetch(`${MEMORY_API_BASE}/api/memory-admin?action=config`, { - net package/dist/memory/device.js :26
const res = await fetch(`${MEMORY_API_BASE}/api/memory-admin?action=device_check`, { - net package/dist/memory/embeddings.js :140
const res = await fetch("https://api.openai.com/v1/embeddings", { - net package/dist/memory/load-events.js :41
await fetch(`${MEMORY_API_BASE}/api/memory-admin?action=log_tool_event`, { - net package/dist/memory/supabase.js :53
const res = await fetch("https://api.openai.com/v1/chat/completions", { - net package/dist/memory/tool-awareness.js :290
const res = await fetch(`${MEMORY_API_BASE}/api/memory-admin?action=tool_detect`, { - net package/dist/mistral-tool.js :14
const res = await fetch(`${MISTRAL_API_BASE}${path}`, { - net package/dist/mixpanel-tool.js :25
const res = await fetch(url.toString(), { - net package/dist/monday-tool.js :13
const res = await fetch(MONDAY_BASE, { - net package/dist/monica-tool.js :34
response = await fetch(url.toString(), { - net package/dist/musicbrainz-tool.js :15
const response = await fetch(url.toString(), { - net package/dist/nasa-tool.js :15
const res = await fetch(url.toString()); - net package/dist/neon-tool.js :22
response = await fetch(url.toString(), { - net package/dist/newsapi-tool.js :13
const res = await fetch(url, { - net package/dist/notion-tool.js :34
response = await fetch(url.toString(), { - net package/dist/nudgeonly-tool.js :521
const res = await fetch(`${OPENROUTER_BASE}${path}`, { - net package/dist/numbers-tool.js :9
const res = await fetch(url, { - net package/dist/nvd-tool.js :14
const res = await fetch(`${NVD_BASE}?${qs}`, { headers }); - net package/dist/omdb-tool.js :21
const response = await fetch(url.toString()); - net package/dist/openai-tool.js :63
const res = await fetch(`${OPENAI_API_BASE}${path}`, { - net package/dist/openaq-tool.js :19
const res = await fetch(url.toString(), { headers }); - net package/dist/openexchangerates-tool.js :18
const response = await fetch(url.toString()); - net package/dist/openf1-tool.js :12
const res = await fetch(url.toString(), { - net package/dist/openfoodfacts-tool.js :7
const res = await fetch(url, { - net package/dist/openlibrary-tool.js :13
const response = await fetch(url.toString(), { - net package/dist/openmeteo-tool.js :30
const res = await fetch(`${GEO_BASE}/search?name=${encodeURIComponent(city)}&count=1&format=json`, { headers: { "User-Agent": "UnClickMCP/1.0 (https://unclick.io)" } }); - net package/dist/pagerduty-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/pandascore-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/paypal-tool.js :30
response = await fetch(`${baseUrl(cfg)}/v1/oauth2/token`, { - net package/dist/perplexity-tool.js :47
const res = await fetch(`${PERPLEXITY_API_BASE}${path}`, { - net package/dist/pika-tool.js :14
const res = await fetch(`${PIKA_API_BASE}${path}`, { - net package/dist/pinecone-tool.js :13
const res = await fetch(`${PINE_BASE}${path}`, { - net package/dist/pinterest-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/plaid-tool.js :26
response = await fetch(url, { - net package/dist/podcastindex-tool.js :34
const response = await fetch(url.toString(), { - net package/dist/postman-tool.js :17
response = await fetch(url.toString(), { - net package/dist/postmark-tool.js :20
const res = await fetch(url.toString(), { - net package/dist/ptv-tool.js :24
const res = await fetch(url, { - net package/dist/pushover-tool.js :17
const res = await fetch(`${PUSHOVER_API_BASE}${path}.json`, { - net package/dist/qc-tool.js :2
// Pure computation with native fetch(). No external dependencies. - net package/dist/quickbooks-tool.js :32
response = await fetch(url, { - net package/dist/radiobrowser-tool.js :8
const res = await fetch(url, { - net package/dist/raindrop-tool.js :31
response = await fetch(url.toString(), { - net package/dist/rawg-tool.js :21
const res = await fetch(url.toString(), { - net package/dist/readwise-tool.js :33
response = await fetch(url.toString(), { - net package/dist/reddit-tool.js :3
// No external dependencies - uses global fetch (Node 18+). - net package/dist/render-tool.js :22
response = await fetch(url.toString(), { - net package/dist/replicate-tool.js :14
const res = await fetch(`${REPLICATE_API_BASE}${path}`, { - net package/dist/resend-tool.js :13
const res = await fetch(`${RESEND_BASE}${path}`, { - net package/dist/restcountries-tool.js :10
const response = await fetch(url.toString(), { - net package/dist/riot-tool.js :27
const res = await fetch(url, { - net package/dist/runway-tool.js :14
const res = await fetch(`${RW_API_BASE}${path}`, { - net package/dist/seatgeek-tool.js :12
const res = await fetch(`${SEATGEEK_BASE}${path}?${qs}`); - net package/dist/segment-tool.js :22
const res = await fetch(`${SEGMENT_TRACK_BASE}${path}`, { - net package/dist/sendgrid-tool.js :16
const res = await fetch(url.toString(), { - net package/dist/sendle-tool.js :20
const res = await fetch(`${SENDLE_BASE}${path}`, {
secrets 60
- secrets package/dist/abuseipdb-tool.js :7
const key = String(args.api_key ?? process.env.ABUSEIPDB_API_KEY ?? "").trim(); - secrets package/dist/alphavantage-tool.js :7
const key = (process.env.ALPHAVANTAGE_API_KEY ?? "").trim(); - secrets package/dist/amber-tool.js :8
const key = String(args.api_key ?? process.env.AMBER_API_KEY ?? "").trim(); - secrets package/dist/asana-tool.js :7
const key = String(args.api_key ?? process.env.ASANA_API_KEY ?? "").trim(); - secrets package/dist/australiapost-tool.js :8
const key = String(args.api_key ?? process.env.AUSPOST_API_KEY ?? "").trim(); - secrets package/dist/bungie-tool.js :8
const key = String(args.api_key ?? process.env.BUNGIE_API_KEY ?? "").trim(); - secrets package/dist/calendly-tool.js :7
const key = String(args.api_key ?? process.env.CALENDLY_API_KEY ?? "").trim(); - secrets package/dist/carboninterface-tool.js :8
const key = String(args.api_key ?? process.env.CARBONINTERFACE_API_KEY ?? "").trim(); - secrets package/dist/client.js :140
const raw = process.env.UNCLICK_API_KEY; - secrets package/dist/coingecko-tool.js :11
const apiKey = (process.env.COINGECKO_API_KEY ?? "").trim(); - secrets package/dist/coinmarketcap-tool.js :7
const key = (process.env.COINMARKETCAP_API_KEY ?? "").trim(); - secrets package/dist/crews-tool.js :11
const key = process.env.UNCLICK_API_KEY?.trim(); - secrets package/dist/discogs-tool.js :27
const token = String(args.token ?? process.env.DISCOGS_TOKEN ?? "").trim(); - secrets package/dist/domain-tool.js :8
const key = String(args.api_key ?? process.env.DOMAIN_API_KEY ?? "").trim(); - secrets package/dist/ebird-tool.js :8
const key = String(args.api_key ?? process.env.EBIRD_API_KEY ?? "").trim(); - secrets package/dist/eventbrite-tool.js :10
(process.env.EVENTBRITE_TOKEN ?? "").trim() || - secrets package/dist/exchangerate-tool.js :9
return String(args.api_key ?? process.env.EXCHANGERATE_API_KEY ?? "").trim() || null; - secrets package/dist/flyio-tool.js :57
const apiKey = String(args.api_key ?? process.env.FLY_API_KEY ?? "").trim(); - secrets package/dist/foursquare-tool.js :10
(process.env.FOURSQUARE_API_KEY ?? "").trim() || - secrets package/dist/genius-tool.js :7
const token = process.env.GENIUS_ACCESS_TOKEN?.trim() ?? ""; - secrets package/dist/guardian-tool.js :21
const key = String(args.api_key ?? process.env.GUARDIAN_API_KEY ?? "").trim(); - secrets package/dist/haveibeenpwned-tool.js :10
const key = String(args.api_key ?? process.env.HIBP_API_KEY ?? "").trim(); - secrets package/dist/hunter-tool.js :8
const key = String(args.api_key ?? process.env.HUNTER_API_KEY ?? "").trim(); - secrets package/dist/igdb-tool.js :12
const clientSecret = String(args.client_secret ?? process.env.IGDB_CLIENT_SECRET ?? "").trim(); - secrets package/dist/ipaustralia-tool.js :8
const key = String(args.api_key ?? process.env.IPAUSTRALIA_API_KEY ?? "").trim(); - secrets package/dist/keychain-tool.js :261
const apiKey = String(process.env.UNCLICK_API_KEY ?? "").trim(); - secrets package/dist/lastfm-tool.js :25
const key = String(args.api_key ?? process.env.LASTFM_API_KEY ?? "").trim(); - secrets package/dist/lego-tool.js :13
const key = String(args.rebrickable_api_key ?? process.env.REBRICKABLE_API_KEY ?? "").trim(); - secrets package/dist/memory/__tests__/bitemporal.test.js :89
const LIVE = !!(process.env.SUPABASE_URL && process.env.SUPABASE_SERVICE_ROLE_KEY); - secrets package/dist/memory/__tests__/hybrid-search.test.js :68
const savedKey = process.env.OPENAI_API_KEY; - secrets package/dist/memory/__tests__/load-memory-invalidation.test.js :63
const LIVE = !!(process.env.SUPABASE_URL && process.env.SUPABASE_SERVICE_ROLE_KEY); - secrets package/dist/memory/agent.js :11
const apiKey = process.env.UNCLICK_API_KEY; - secrets package/dist/memory/conflicts.js :184
const apiKey = process.env.UNCLICK_API_KEY; - secrets package/dist/memory/db.js :27
const CENTRAL_SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY; - secrets package/dist/memory/device.js :22
const apiKey = process.env.UNCLICK_API_KEY; - secrets package/dist/memory/embeddings.js :64
const hasKey = Boolean(process.env.OPENAI_API_KEY); - secrets package/dist/memory/handlers.js :15
return process.env.UNCLICK_API_KEY_HASH ?? null; - secrets package/dist/memory/instrumentation.js :53
const key = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_ANON_KEY; - secrets package/dist/memory/load-events.js :21
const apiKey = process.env.UNCLICK_API_KEY; - secrets package/dist/memory/supabase.js :49
const apiKey = process.env.OPENAI_API_KEY; - secrets package/dist/memory/tenant-settings.js :36
const apiKey = process.env.UNCLICK_API_KEY; - secrets package/dist/memory/tool-awareness.js :283
const apiKey = process.env.UNCLICK_API_KEY; - secrets package/dist/monday-tool.js :7
const key = String(args.api_key ?? process.env.MONDAY_API_KEY ?? "").trim(); - secrets package/dist/nasa-tool.js :7
return String(args.api_key ?? process.env.NASA_API_KEY ?? "DEMO_KEY").trim(); - secrets package/dist/neon-tool.js :53
const apiKey = String(args.api_key ?? process.env.NEON_API_KEY ?? "").trim(); - secrets package/dist/newsapi-tool.js :26
const key = String(args.api_key ?? process.env.NEWS_API_KEY ?? "").trim(); - secrets package/dist/nudgeonly-tool.js :281
const key = String(args.api_key ?? process.env.OPENROUTER_API_KEY ?? "").trim(); - secrets package/dist/nudgeonly-tool.test.js :208
const previous = process.env.OPENROUTER_API_KEY; - secrets package/dist/nvd-tool.js :28
const key = String(args.api_key ?? process.env.NVD_API_KEY ?? "").trim(); - secrets package/dist/omdb-tool.js :7
const key = process.env.OMDB_API_KEY?.trim() ?? ""; - secrets package/dist/openaq-tool.js :8
return String(args.api_key ?? process.env.OPENAQ_API_KEY ?? "").trim(); - secrets package/dist/pandascore-tool.js :8
const key = String(args.api_key ?? process.env.PANDASCORE_TOKEN ?? "").trim(); - secrets package/dist/pinterest-tool.js :7
const token = String(args.access_token ?? process.env.PINTEREST_ACCESS_TOKEN ?? "").trim(); - secrets package/dist/podcastindex-tool.js :9
const apiKey = process.env.PODCASTINDEX_API_KEY?.trim() ?? ""; - secrets package/dist/ptv-tool.js :10
const apiKey = process.env["PTV_API_KEY"] ?? "4feb0abc-01a2-438f-a1ac-602e4bce0df1"; - secrets package/dist/rawg-tool.js :8
const key = String(args.api_key ?? process.env.RAWG_API_KEY ?? "").trim(); - secrets package/dist/render-tool.js :57
const apiKey = String(args.api_key ?? process.env.RENDER_API_KEY ?? "").trim(); - secrets package/dist/resend-tool.js :7
const key = String(args.api_key ?? process.env.RESEND_API_KEY ?? "").trim(); - secrets package/dist/riot-tool.js :8
const key = String(args.api_key ?? process.env.RIOT_API_KEY ?? "").trim(); - secrets package/dist/sendle-tool.js :9
const key = String(args.api_key ?? process.env.SENDLE_API_KEY ?? "").trim();
declared dependencies 22
- @iarna/toml@^2.2.5
- @modelcontextprotocol/sdk@^1.15.1
- @supabase/supabase-js@^2.103.0
- @types/imap@^0.8.43
- @types/nodemailer@^8.0.0
- ajv@^8.20.0
- csv-parse@^6.2.1
- csv-stringify@^6.7.0
- fast-xml-parser@^5.5.10
- imap@^0.8.19
- js-yaml@^4.1.1
- marked@^18.0.2
- nodemailer@^8.0.5
- turndown@^7.2.4
- zod@^4.4.1
- @types/js-yaml@^4.0.9
- @types/node@^25.6.0
- @types/turndown@^5.0.6
- @unclick/wizard@*
- tsx@^4.19.2
- typescript@^6.0.3
- vitest@^4.1.6