⫻ MCP for apps without a server
Make your app an MCP server without running one
Your desktop, CLI or local-first app opens one WebSocket and registers its tools. Each user pastes a personal URL into ChatGPT or Claude, and every tool call is relayed to the running app.
1,000 free calls per project every month · ChatGPT · Claude · Cursor · any MCP client
⫻ your app
⫻
one WebSocket, about 30 lines
⫻ their chat
notes
which notes mention invoices?
Used search_notes · 3 notes match
Three notes mention invoices: Q3 invoices, Invoice template and Unpaid invoices.
02 / 04
how it works
⫻ how it works
Three steps, no server
No MCP server to write, no OAuth to host and nothing to deploy. Your running app does the work; Relay gives it a public address.
01
Create a project
You get a publishable key. It can create links and nothing else, so it is safe to ship inside your app.
02
Connect your app
Call POST /links once per person and keep the link token and the URL. Open the socket and send hello with your tools.
03
The user pastes one URL
They add it to ChatGPT or Claude. Each tool call reaches your app as call, and your app answers with result.
⫻ Use it to
Search a person's local notes and documents
Read and edit a desktop app's projects
Run a command-line tool on their machine
Query a local database or spreadsheet
Control a home server or self-hosted tool
Draft straight into a local-first editor
03 / 04
hosts
⫻ hosts
Where people already chat
Each person gets one URL. It works in any host that speaks MCP over Streamable HTTP, with no sign-in to set up.
ChatGPT
Add a custom MCP server, paste the URL and choose No authentication. Read-only tools run without a confirmation prompt.
Claude
A custom connector on claude.ai shows up in Claude Desktop and the mobile apps too. Claude Code takes one command.
claude mcp add --transport http
Cursor and the rest
Cursor's mcp.json, the MCP Inspector and any client that speaks Streamable HTTP, no OAuth needed.
⫻ Your app must be running
Relay forwards each call to the running app and never answers in its place. A call to a closed app answers at once with a message asking the person to open it, and it is never charged.
04 / 04
pricing
⫻ pricing
1,000 calls free per project, every month
One call is one tool call that reaches your running app. Past the free allowance, calls are paid from your credit balance, the same balance every app here uses. No subscription.
⫻ Every month
1,000
calls free per project
The allowance starts over each calendar month, separately for every project. Unused calls do not carry over.
⫻ After that
1 credit
per 500 calls
One credit is taken from your balance as each new block of 500 calls starts.
⫻ App not running
0
credits, always
A call to a closed app answers at once and never counts. Neither do tool lists, pings or open sockets.
⫻ The fine print
01
One call is one tool call that reaches your running app. A call that times out or is cancelled after it arrived still counts.
02
Calls refused for a paused link, a busy app, invalid arguments or the per-minute limit never count.
03
A call lost because the app's socket dropped is taken off the month's count.
04
Set a spend cap per project. Past the cap, or with no free calls and no credits left, calls answer with an error the model can explain. Nothing fails silently.