Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Xyz MCP

by artlu99version 1.0.0i★ –iRuns in the cloud
Registry namexyz.forkcaster/mcp

Install

Overview

Description from the maker (original English)

Resolve Farcaster casts to deep-link URLs for any supported Farcaster client app. No auth.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

Install

Pick the AI app you use, then copy the settings.

Before you install

You need

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Works in Claude on the web, desktop and mobile:

  1. Open Settings → Connectors
  2. Press Add custom connector
  3. Paste the address below and press Add
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Add2https://…3
https://forkcaster.xyz/mcp

Run this in your terminal

claude mcp add --transport http forkcaster https://forkcaster.xyz/mcp

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "forkcaster": {
      "url": "https://forkcaster.xyz/mcp"
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "forkcaster": {
      "type": "http",
      "url": "https://forkcaster.xyz/mcp"
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

ChatGPT connects only to servers on the internet:

  1. Open ChatGPT on the web → Settings → Connectors (Apps)
  2. Press Create or Add (some plans need Developer mode under Advanced first)
  3. Paste the address below, give it a name and save
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Create2https://…3
https://forkcaster.xyz/mcp

Menu names can differ slightly by plan and over time.

Your choice stays on this device in a cookie; no account needed.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Tool names and descriptions exactly as the server reported them on Nov 7, 2026. The maker wrote them, not us; we show them as plain text.

  • get_cast_link

    Resolve a Farcaster cast — identified by username/fid + short hash, or by its full 40-hex hash — and return the URL that opens it in a target Farcaster client app (or all supported apps). Also returns the author's signed-contract status; URLs are returned regardless of signed sta

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified against the domain forkcaster.xyz (the registry checks domain ownership)

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • ✓ Pass

    Endpoint responds

    Responded in 131 ms (HTTP 200)

  • – Not applicable

    Sign-in with OAuth

    No sign-in needed

  • ✓ Pass

    No hidden instructions in tool descriptions

    Read 1 tool descriptions and found no hidden instructions to the AI

Compared with others in Otheri

  • More stars than 0% of the other 32727 servers in this category
  • Published to the registry more recently than 71% of the other 32727 servers in this category
  • Basic checks equal to or better than 100% of the other 32727 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Xyz MCP safe?

It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs in the maker’s cloud. Connect over the internet with nothing to install, but what you send passes through the maker’s servers.

Is it still maintained?

The GitHub repo last changed –, and the latest version (1.0.0) reached the registry 16 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.

What can I use instead?

In the same category: Spec Driven Development, Remote Desktop Commander, Foliosio

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Spec Driven Development

by formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

Runs on your computer★ 440MITUpdated 14 months ago
Install

Remote Desktop Commander

by desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

Runs in the cloud★ 211Updated 2 days ago
Install

Foliosio

by foliosio.com

Read your support inbox, tag conversations and save draft replies from your AI agent. Never sends.

Runs in the cloudUpdated today
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

forkcaster — agent brief

Audience: coding agents. Prefer facts over prose. Update this file when architecture or commands change.

Intent

Micro-site that mirrors Farcaster cast URLs for sharing without the Farcaster app.

  • Pattern: /{username}/{castHash} where castHash matches 0x[0-9a-fA-F]+ — short or full form
  • Examples: /zoo/0x895ecc74 and /decent-artlu/0xbb54368f → SSR cast card + links
  • Data: raced across a fleet of sources (worker/cast-source.ts + worker/shim.ts on the shared worker/race.ts kernel) — see "Cast source race" below. shim (https://shim.artlu.xyz/wc/{username}/{hash}, owner-run Snapchain reader with a keep-warm cron) anchors completeness and hosts the ban-signal read (/signed/{fid} — fleet-raced like every shim read); farcaster.tv is fast but quote-blind; raw nodes haatz/snap.farcaster.xyz:3381 are embed-complete but text-blind (the gateway strips the mention placeholder characters from text — shim owns the @username substitution — so mention-bearing raw wins are held until canonical text settles or is proven unavailable) and get the fid by racing the shim fleet's /f/{username} against their own /v1/userNameProofByName (first numeric answer wins, loser aborted; the shim-side winner is labeled with its fleet member id), plus a full hash requirement (castById 400s on short hashes). All upstream calls are capped at 5s.
  • Missing cast: a consensus miss — every miss-authoritative source consulted and missed — ⇒ 404 page; every source errored ⇒ link-only page (200). No single source's miss is a verdict. All upstream calls are capped at 5s (AbortSignal.timeout) — shim's cold sharded lookups can otherwise hang 15s+; timeout ⇒ unreachable. Strict statuses are the JSON variant's job (see below)
  • Banned accounts: embeds render for everyone — but some clients hide unsigned authors. Since Oct 15, 2026 (Network School takeover), accounts must accept the "social smart contract" (Network Code); acceptance is an on-chain access NFT. Shim exposes it: GET https://shim.artlu.xyz/signed/{fid} → {"signed":true|false}. Unsigned authors: registry clients flagged requiresSigned (e.g. farcaster) are suppressed from the action row; the check fails open — unknown state suppresses nothing
  • farcaster.tv as a cast data source is quote-blind (it drops {castId} embeds) and unofficial — it races as the partial tier only (700ms HTML box, client-side quote fill-in). react-farcaster-embed's own default endpoint is farcaster.tv — always pass castData so it never fetches. The live stats row (replies/recasts/likes) is still fetched client-side from farcaster.tv — it sends access-control-allow-origin: * and answers for unsigned authors too; any failure just leaves the row absent

Architecture

The system is a waypoint layer over Farcaster: every public URL shape maps to exactly one canonical surface, and every page answers one question — *which app opens this?* There is no database, no KV, and no edge cache on this side — data is raced across a fleet of sources on every request. The product is the routing verdict, not stored content.

Cloudflare Worker (Hono; dual-domain; registration-order routing)

├─ routes: cast · profile · casts-page · aliases · mcp · /transparency · /api · /t ├─ RESOLUTION KERNEL — worker/race.ts │ staggerDelays · collectTerminals · collectiveRace │ ├─ raceShimProbe — every shim-shaped read (profiles, quotes, signed, │ │ aliases, MCP): cloud + the potato fleet │ └─ raceCast — provider roster (shim ∥ potatos ∥ haatz ∥ snap ∥ │ farcaster.tv) + completeness box + race telemetry ├─ SOURCES: shim (cloud) · potato fleet (replicas) · haatz/snap (raw │ nodes) · farcaster.tv (partial, quote-blind) ├─ RENDERERS: resolve once, render twice — SSR HTML + strict JSON twin ├─ STATEFUL LAYER: fc_client cookie → last-used badge, auto-open, pill │ order (client-side writes; the server only reads) └─ TELEMETRY: one anonymous Analytics Engine datapoint per resolve → offline snapshots → /transparency

Verdicts are collective — no single host is the source of truth. Fleet legs start staggered (tiny random steps behind the leader; a fast winner cancels the stragglers before they fire). The first affirmative answer wins; a consulted miss (asked, no data) is a vote — not-found settles only when every miss-authoritative leg has consulted and missed; errors surface only when every leg errored. Any one host — including cloud shim — can die without changing a single verdict. The price is deliberate: a true miss resolves as fast as the slowest leg, not the fastest.

Consumer-matched strictness. HTML fails open — a human always gets a page (found → card, partial → self-healing card, unreachable → link-only). JSON is the strict record (404 / 503 + Retry-After, availability-gated fields, quotes never dropped). Chat link-preview bots get HTML + OG meta unconditionally: negotiation is ?format=json / Accept, never UA sniffing, and SSR output is byte-identical for every device.

Design laws (enforced everywhere; detail in the sections below):

  • Waypoint law — one surface per account; aliases redirect, never render.
  • Identity law — the fname is the PRIMARY handle everywhere; ENS names are attestations.
  • Echo-the-valid-input — first-party links carry the gate-validated route input; display, OG, and client targets carry the primary.
  • Privacy: no identifiable tracking, only analytics. One anonymous click datapoint per client selection; the negative list (no cast IDs, no usernames, no IPs, no UA strings, no identifiers) is verbatim-checkable in worker/track.ts and declared on /transparency. Pages make no third-party requests — logos are self-hosted because a hotlinked logo would leak every visitor's IP to that client's servers. The one cookie carries a client slug, nothing else.
  • Personalization is client-side on cast pages. The page shell (the client sheet's pills included, gates applied) is cookie-blind server-side; SHELL_SCRIPT reads the local fc_client cookie and applies the last-used badge, the resolution-first primary ("Open in X" — a direct anchor with the pill's exact wiring — beside a muted "More apps" sheet trigger), and the auto-open state machine after parse (the sheet's auto-open toggle syncs from the same cookie). That is what makes the full page — cookie-holders included — servable from the 12h edge shell; profiles cache 10 minutes (they are mutable) under the same client-side model. Bump SHELL_SALT in worker/edge-cache.ts to invalidate every shell (there is no global purge; v3 dropped the pre-sheet UI — bare pill row + on-page auto-open chip; v4 reached cached shells with the Safari-safe sheet CSS; v5 reached them with the kind-aware chooser copy and single-offer bare-row shape).
  • Registry as the one roster — clients and their verification provenance are enumerated exactly once, in worker/client-registry.ts.

Stack

LayerChoiceNotes
Runtime / package mgrBunlockfile: bun.lock; scripts use bun run
UI (landing)Preact 11SPA assets; entry src/main.tsx
Cast pagesHono on Cloudflare WorkerSSR in worker/
Cast dataProvider race (cast-source.ts)shim ∥ farcaster.tv ∥ haatz ∥ snap ∥ shim-potato fleet — first validated win; completeness box for HTML, complete-leg fleet roster for JSON; see "Cast source race" below
URL embed cardsunfurl.artlu.workers.devcalled via the UNFURL service binding (workers.dev→workers.dev fetch is blocked, CF error 1042); GET /?u={url} → OG title/description/image (cached, fails open to hostname-only)
Cast embedreact-farcaster-embedrendering only — castData always supplied, never fetches
Live statsclient-side script → farcaster.tvLIVE_STATS_SCRIPT in cast-scripts.ts; fills the SSR-stripped stats slot from the browser; fails silent (row absent); the SSR data path is fleet-raced server-side
SSRpreact-render-to-stringafter await FarcasterEmbed({ castData })
BundlerVite 8@preact/preset-vite + @cloudflare/vite-plugin
LintBiomebun run lint
Typecheckbun checktsc-compatible, built into Bun; no typescript pkg
Testsbun:testbun test (cast route + client registry)

Commands

bun install

bun run dev # wrangler dev (local worker + assets) bun run build # vite build → dist/ bun run typecheck # bun check (tsc-compatible; reads tsconfig*.json) bun run deploy # build + wrangler deploy bun run lint # biome lint . bun test # worker tests (cast route + client registry) bun run cf-typegen # wrangler types → worker-configuration.d.ts

Layout

/

├── index.html # SPA shell → /src/main.tsx ├── vite.config.ts # preact + cloudflare + react→preact aliases ├── wrangler.jsonc # main=worker/index.ts; not_found_handling=none ├── public/farcaster-embed.css # linked from SSR HTML ├── public/logos/ # per-client marks for the action row ├── quilcast-router-shortcut.md # the iOS/macOS share-sheet router: mapping, build/sign, distribution ├── shortcuts/ # generated .shortcut artifact (unsigned; bun run shortcut:quilcast) ├── worker/ │ ├── index.ts # Hono app; export { app }; default { fetch } │ ├── client-registry.ts # client registry (verified templates; zero-dep, vendored-able) │ ├── clients.ts # fc_client cookie binding (last-used + auto-open prefs) │ ├── shim.ts # shim identity client (routes, ShimCast/ShimUser, /wc /h /f /u /user /casts-and-replies /signed, /refresh as the index warmer; fleetBases parses the fleet var) │ ├── race.ts # fleet-race kernel: RaceLeg, staggerDelays, collectTerminals, collectiveRace — shared by cast-source + shim │ ├── cast-source.ts # provider race: shim ∥ potato fleet ∥ haatz ∥ snap ∥ farcaster.tv (+ the /~/{hash} hash-only rescue); fleet stagger + collective miss parity │ ├── cast-page.tsx # resolve (race) → render orchestration: SSR / 404 / link fallback │ ├── cast-data.ts # pure Shim → embed-data mapping + embed helpers │ ├── cast-actions.tsx # client sheet — chooser shapes (single-offer bare row / trigger + dialog), pills byte-identical inside │ ├── cast-scripts.ts # inline client scripts (TRACK/CLIENT/DEEPLINK/AUTO/LIVE_STATS/QUOTE_FILL) │ ├── profile-page.tsx # profile landings: resolve-once/render-twice, waypoint law │ ├── warpcast.ts # Warpcast channel API client (zod contract; /v1/channel — keyless, first-party) │ ├── channel-page.tsx # channel landings: resolve-once/render-twice, waypoint law │ ├── shell.tsx # shared page frame (head/meta/CSS/footer) — cast pages + profiles + /transparency │ ├── cast-ref.ts # MCP cast-ref: zod contract + shim-direct resolution │ ├── mcp.ts # MCP SDK v2 server factory (get_cast_link) — only SDK import site │ ├── cast-route.test.ts # bun:test; mock.module + exact-URL fetch mock │ ├── clients.test.ts # registry unit tests: templates, gating, signed rule, deeplinks │ ├── cast-source.test.ts # race unit tests: eligibility, box, miss/error, abort, adapter mapping │ ├── race-stats-store.ts # lmdis snapshot read-through TTL cache (10min TTL / stale 24h / 2s cap) │ ├── fid-race-store.ts # mirror of the above for the "Author id races" snapshot (key fid-race) │ ├── vendor/lmdis-sdk.ts # vendored lmdis SDK (Upstash-shaped seam; get/set only) │ └── shims/server-only.ts # empty stub for Next.js marker package ├── scripts/ │ ├── race-stats.ts # offline stats job: AE SQL → snapshot → lmdis (dotenvx env; --dry) │ ├── race-stats-lib.ts # pure query builders (fixture-

Only the beginning is shown; read the rest in the repo

Ask PopNx