mcpField
V
VidFare

VidFare

Remote
vidfare.comMedia & Design0Updated today

About VidFare

VidFare is an MCP server that provides a public catalog of AI video prices for clients comparing models or estimating clip costs. It also lists deals, and results include a source and last-checked date; unstated prices are not filled in.

Key features

  1. 01List video models
  2. 02Look up model prices
  3. 03Estimate clip costs
  4. 04Compare cheapest options
  5. 05List deals by status

Use cases

  1. 01Check prices for a model and resolution
  2. 02Estimate costs for a clip of a given length
  3. 03Compare lower-cost options under matching conditions
  4. 04Review live or upcoming deals

MCP support

It exposes five read-only tools over Streamable HTTP at `/mcp`, without authentication; results include a source URL and last-checked date.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://mcp.vidfare.com/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

Tools

Details

From the project README

VidFare MCP server

Public, read-only Model Context Protocol server for the VidFare price catalog. It speaks Streamable HTTP at /mcp, with no authentication. A client such as ChatGPT, Claude, or Cursor can list models, read prices, estimate a clip, and list deals. Every result includes the VidFare source URL, the last-checked date, and a vidfare.com page link. Those vidfare.com links also carry utm_source=mcp&utm_medium=tool&utm_campaign=vidfare_mcp.

The Worker is live at https://mcp.vidfare.com/mcp. Do not run wrangler login or wrangler deploy from this repository.

Data

The Worker fetches only:

  • https://vidfare.com/data/prices.json
  • https://vidfare.com/deals.json (the same JSON is also published at /data/deals.json)

Responses are cached for 5 minutes. If a fetch fails, or the catalog does not state a price for the request, the tool says so and does not fill in a number.

Tools

ToolArguments
list_modelsnone
get_model_pricesmodel (required), provider, resolution
estimate_costmodel, seconds (required). Optional: resolution, audio (with, without, on, off), input (t2v, i2v, ref2v, v2v, extend, lip-sync), plan, provider, used (1–100, default 100), apply_deals (default false), window_seconds (default 60)
cheapest_optionsseconds, resolution (both required). Optional: audio, input, used, apply_deals
list_dealsstatus: live (default), upcoming, ended, or all

A tools/call whose name is not one of those five returns a tool result with isError: true. The text names the five tools, tells the model to call tools/list, and links to https://vidfare.com/mcp/. The same fields are in structuredContent: requested_tool (sanitized), valid_tools, hint (tools/list), and docs. The echoed name has control characters removed, keeps only A-Z, a-z, digits, _, ., and -, and is cut at 64 characters.

The server negotiates protocol 2025-11-25. That revision lists an unknown tool as JSON-RPC error -32602. This Worker returns a tool result instead. Claude Desktop replaces a JSON-RPC error with a generic line, so the model never sees the tool list. isError text is the channel the spec says clients should give the model. Cursor and Claude Code can read a protocol error's message; Claude Code drops error.data, so the list is in the text.

A name that differs only by case, or by hyphens, underscores, and spaces, calls the real tool. CamelCase is included: cheapest-options, CheapestOptions, and GET_MODEL_PRICES all resolve. Separators are removed and the remaining letters and digits must equal the canonical name. A dot, any other character, or a different spelling does not match. There is no edit-distance matching. tools/list still returns the five canonical names. All five stay read-only.

estimate_cost uses the same row filter as the credit calculator (scripts/variations.py) and the same plan math as the calculator script: plan price ÷ credits × credits per clip, divided again by the share of credits actually used. API rows are billed seconds times the stated dollars per second. scripts/test_mcp_parity.py checks that against the site code.

Usage counts

Each request writes one Workers Analytics Engine point per JSON-RPC message. A batch of up to 20 messages writes one point each. A longer batch writes a single point with method batch. The write is env.USAGE?.writeDataPoint(...) with no await. A missing binding or a throw is ignored, so logging cannot change the response. Workers Analytics Engine is on the free tier. The dataset is created on the first write. There is no public stats URL.

Points written before this layout used blob1 as the tool name and blob2 as success or error. New points set blob8 to v2. Queries below keep those layouts apart.

index1 is the JSON-RPC method bucket. It is the sampling key. It is not a person, address, or client name.

FieldValues
blob1 methodinitialize, tools/list, tools/call, notifications/*, other, or batch
blob2 toolThe canonical tool name on tools/call, otherwise unknown. An alias is stored as that canonical name. The raw spelling is never stored. none for every other method
blob3 clientCoarse client bucket, at most 40 characters. See below
blob4 argsComma-separated argument names on tools/call, such as model,seconds. Empty when there are none. Never the values
blob5 httpGET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, or other
blob6 status2xx, 3xx, 4xx, 5xx, or other
blob7 probe1 when the user-agent bucket is a known probe, otherwise 0
double1The same probe flag as a number, 1 or 0
blob8Layout marker v2
blob9alias when tools/call used a safe alias. Omitted on every other v2 row, so blob1–blob8 stay in place

On initialize, blob3 comes from params.clientInfo.name and a short version when those are present. The name is lowercased, punctuation becomes hyphens, and the label is cut to 40 characters. A recognisable product becomes a fixed bucket such as ai:cursor, ai:claude, ai:chatgpt, or ai:openai. An email address, IP, or UUID becomes other. Every other request uses the user-agent bucket instead, and the raw user agent is never stored.

User-agent buckets:

  • probe:<name> for directory and liveness probes: mcpbeat, AgentRank, alalanet, histor, EveryMCP, mcptry, Glama, MCPWatch, and similar checkers (Smithery, PulseMCP, mcp.so, UptimeRobot, Pingdom, Checkly, StatusCake, Better Stack, kube-probe, GoogleHC).
  • ai:<name> for known AI clients: ChatGPT, OpenAI, Claude, Anthropic, Cursor, Copilot, Perplexity, Windsurf, Gemini, DeepSeek, Mistral, Grok, Cline, Replit, Devin, Aider.
  • generic:<lib> for node, python-httpx, python-requests, Go-http-client, undici, coda-agent-runtime, Talaria, and curl.
  • other when none of those match.

likely_probe follows the user-agent bucket, including when initialize also sent a client name. An empty user agent is other and not a probe.

Not stored: IP addresses, the raw user agent, any other header, the request or response body, argument values, the question, session ids, country, and the raw tool name. An unknown name is the bucket unknown. An alias is the canonical tool name, with blob9 set to alias. Counts are requests, not unique people, visits, or sponsor impressions. A retry adds another point. Requests with X-VidFare-Test: 1, and requests to localhost or 127.0.0.1 (wrangler dev), are not written.

wrangler.jsonc binds USAGE to the dataset vidfare_mcp_usage. Deploying that binding uses the existing Worker deploy token (Workers Scripts Edit or Workers Admin, Workers Routes Edit, and Zone Read). It does not need Analytics Read. Reading the counts does. Create a separate token with Account → Account Analytics → Read, scoped to the VidFare account. Do not put that token in the repo.

Daily counts for the last 7 days, by method, tool, and client bucket, with probe and non-probe splits. SUM(_sample_interval) is the count:

curl "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/analytics_engine/sql" \
  --header "Authorization: Bearer <API_TOKEN>" \
  --data "SELECT toDate(timestamp) AS day, blob1 AS method, blob2 AS tool, blob3 AS client, SUM(_sample_interval) AS requests, SUM(_sample_interval * double1) AS probes, SUM(_sample_interval) - SUM(_sample_interval * double1) AS non_probes FROM vidfare_mcp_usage WHERE blob8 = 'v2' AND timestamp > NOW() - INTERVAL '7' DAY GROUP BY day, method, tool, client ORDER BY day, method, tool, client"

The same query is what scripts/mcp_usage.py runs (default 30 days):

CLOUDFLARE_ACCOUNT_ID=... CLOUDFLARE_API_TOKEN=... python3 scripts/mcp_usage.py

Local

cd mcp-server
npm install
npm test
npx wrangler dev

wrangler dev stays on this machine. It does not deploy.

Cursor can use mcp-server/.mcp.json. Put the same JSON in a project's .cursor/mcp.json. The URL is https://mcp.vidfare.com/mcp.

Registry

server.json is the MCP Registry document. The name is com.vidfare/vidfare. The remote is streamable-http at https://mcp.vidfare.com/mcp.

Namespace verification for com.vidfare is HTTP. The site serves the published proof record at https://vidfare.com/.well-known/mcp-registry-auth. The file is one line, v=MCPv1; k=ed25519; p=<public key>. The private key is not in this repo.

The site build copies the file into dist/.well-known/ and writes dist/.nojekyll. actions/upload-pages-artifact leaves dot paths out unless include-hidden-files is true. Both deploy workflows set that, so the URL answers 200 with no redirect.

Deploy later

Token, one Cloudflare account (the account that owns vidfare.com) and one zone (vidfare.com only):

ScopePermissionWhy
Account, Workers productWorkers AdminThe first wrangler deploy creates the Worker. A token that can only edit an existing Worker cannot create this one. In the legacy token form this permission is still labeled Account → Workers Scripts → Edit; that legacy permission also creates scripts. If the new role picker is shown, choose Workers Admin on the Workers product, not Editor.
Zone vidfare.comWorkers Routes → EditAttaches the custom domain mcp.vidfare.com. Current docs call this Workers Routes Write.
Zone vidfare.comZone → ReadWrangler looks up the zone id for vidfare.com.

Do not add Workers KV, R2, Tail, Account Settings, DNS, or user membership permissions. The only binding is the Analytics Engine dataset vidfare_mcp_usage.

DNS record on vidfare.com, created in the dashboard (the token above does not edit DNS):

TypeNameContentProxy
AAAAmcp100::Proxied

That is the proxied hostname a Worker custom domain uses. wrangler.jsonc sets the route to custom domain mcp.vidfare.com. After the record exists, npx wrangler deploy from this directory publishes the Worker. It still needs CLOUDFLARE_API_TOKEN in the environment, not in the repo.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.