streamable-httpMITupdated 3mo ago
A zero-signup link-unfurl / link-preview API. No account, no API key โ one GET request.
What can you do with openunfurl?
OpenUnfurl
A zero-signup link-unfurl / link-preview API. No account, no API key โ one GET request.
Give it any public URL, get back clean preview metadata (title, description, image, siteName, favicon, Open Graph / Twitter Card, oembed) as JSON. Built so autonomous AI agents can use it as a tool โ an agent has no human to do a signup.
Live: https://openunfurl.vercel.app
Quick start
curl "https://openunfurl.vercel.app/api/unfurl?url=https://github.com"
Sample response:
{
"url": "https://github.com",
"resolvedUrl": "https://github.com/",
"title": "GitHub ยท Build and ship software on a single, collaborative platform",
"description": "Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.",
"image": "https://github.githubassets.com/assets/campaign-social-031d6161fa10.png",
"siteName": "GitHub",
"type": "object",
"favicon": "https://github.githubassets.com/favicons/favicon.svg",
"oembed": null,
"fetchedAt": "2026-05-17T00:00:00.000Z",
"engine": "static-html-v0.1",
"note": "v0.1 parses static HTML only โ no JS/SPA render"
}
Any missing field is null. Errors return JSON with an error key and an
appropriate HTTP status (400 bad/blocked/missing URL, 422 fetch failed,
429 rate limited, 405 wrong method).
JavaScript
const base = "https://openunfurl.vercel.app";
const r = await fetch(
base + "/api/unfurl?url=" + encodeURIComponent("https://example.com")
);
const meta = await r.json(); // { title, description, image, favicon, ... }
Use as an MCP tool (AI agents / Claude / Cursor / LLM clients)
OpenUnfurl is also a remote MCP server, so an agent can call it as a tool with no signup, no API key, no OAuth.
- Endpoint:
https://openunfurl.vercel.app/api/mcp - Transport: Streamable HTTP, stateless (POST JSON-RPC 2.0, single
application/jsonresponse โ no sessions, no SSE) - Exposes exactly one tool:
unfurlโ input{ "url": "https://example.com" }, returns the same preview JSON as the REST endpoint (also asstructuredContent)
Drop this into any MCP client config (Claude Desktop, Cursor, or any client that speaks the Streamable HTTP transport):
{ "mcpServers": { "openunfurl": { "url": "https://openunfurl.vercel.app/api/mcp" } } }
Quick smoke test:
curl -s -X POST https://openunfurl.vercel.app/api/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"unfurl","arguments":{"url":"https://example.com"}}}'
Over MCP, an upstream error comes back as a tool result with isError: true.
Why
Managed link-preview alternatives โ Microlink, OpenGraph.io, LinkPreview.net,
Unfurl.io, LinkPeek โ all gate even their free tier behind a signup and/or an
API key. OpenUnfurl does not: it's a single anonymous GET (or one MCP
tools/call). That's especially useful to autonomous agents, which have no
human in the loop to complete a signup or paste in a key.
Limitations
- v0.1 parses static HTML only โ no headless browser, no JS-rendered SPAs.
If a site renders its
<meta>tags client-side you get the static fallback. - Best-effort per-instance IP rate limit โ a soft abuse brake, not a guarantee (serverless instances are ephemeral and not shared).
- SSRF-guarded โ rejects localhost / private / reserved IP ranges.
- MIT licensed and self-hostable โ see below.
Self-host โ it's zero-dependency files
The entire API is two single zero-dependency Node serverless functions:
api/unfurl.js (REST) and api/mcp.js (remote
MCP). No npm install, no cheerio/jsdom. Deploy the folder to Vercel
(zero-config /api detection) or drop the handlers into any Node serverless
runtime.
git clone https://github.com/SolvoHQ/openunfurl
cd openunfurl
npx vercel --prod
License
MIT โ see LICENSE.
Install
Add openunfurl to your client. Pick the one you use.
claude mcp add --transport http openunfurl https://openunfurl.vercel.app/api/mcpcodex mcp add openunfurl --url https://openunfurl.vercel.app/api/mcp{
"mcpServers": {
"openunfurl": {
"url": "https://openunfurl.vercel.app/api/mcp"
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
{
"servers": {
"openunfurl": {
"type": "http",
"url": "https://openunfurl.vercel.app/api/mcp"
}
}
}Add to `.vscode/mcp.json` in your workspace.
{
"mcpServers": {
"openunfurl": {
"url": "https://openunfurl.vercel.app/api/mcp"
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"openunfurl": {
"serverUrl": "https://openunfurl.vercel.app/api/mcp"
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance13/25
- Trust16/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 107 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 6 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint โ no local install
Version history
| Versions | Published |
|---|---|
| 0.1.0Latest | May 17, 2026 |