Skip to content

⫻ 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

const socket = new WebSocket("wss://api.meslzy.com/relay/v1/socket");
const tools = [  {    "name": "search_notes",    "description": "Full-text search of the person's notes",    "inputSchema": {      "type": "object",      "properties": {        "query": {          "type": "string"        }      },      "required": [        "query"      ]    },    "annotations": {      "readOnlyHint": true    }  },];
socket.onopen = () => {  socket.send(JSON.stringify({    type: "hello",    protocol: 1,    token: LINK_TOKEN,    app: { name: "Notes", version: "1.0.0" },    tools,  }));};
socket.onmessage = async (event) => {  const frame = JSON.parse(event.data);
  if (frame.type === "ready") {    console.log("Connected to Relay, paused:", frame.paused);  }
  if (frame.type === "call") {    const text = await run(frame.tool, frame.arguments);
    socket.send(JSON.stringify({      type: "result",      id: frame.id,      content: [{ type: "text", text }],    }));  }};

⫻ 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.

Setup steps

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

Setup steps

Cursor and the rest

Cursor's mcp.json, the MCP Inspector and any client that speaks Streamable HTTP, no OAuth needed.

Setup steps

⫻ 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.