MCP server
Hosted MCP server
A single hosted Model Context Protocol server that gives any MCP-capable agent five to-text tools — YouTube transcripts, transcription, OCR, web-to-Markdown, and file conversion. No install, no local models.
Streamable HTTP · https://mcp.textify.me/mcp
What it is
The server speaks MCP over streamable
HTTP and authenticates with an
API key sent as a bearer
header (Authorization: Bearer atx_…) — the same key the REST API uses.
Tool discovery is keyless; tool calls that cost credits spend from the same balance as the REST API,
so create a key
and you're set.
Connect a client
Claude Code
Add the server over HTTP with your API key as a header:
claude mcp add --transport http textify https://mcp.textify.me/mcp \
--header "Authorization: Bearer atx_YOUR_API_KEY" Claude.ai (custom connector)
- Open Settings → Connectors → Add custom connector.
- Name it Textify and paste the URL
https://mcp.textify.me/mcp. - Authenticate with your API key as an
Authorization: Bearer atx_YOUR_API_KEYheader. If your client can't attach a header to a remote connector, use the npm shim (stdio) below, which passes the key for you; the tools then appear in chat.
Cursor
Add to ~/.cursor/mcp.json (or a project .cursor/mcp.json):
{
"mcpServers": {
"textify": {
"url": "https://mcp.textify.me/mcp",
"headers": {
"Authorization": "Bearer atx_YOUR_API_KEY"
}
}
}
} Any streamable-HTTP client
Generic MCP client config — point it at the URL and pass your key as a header:
{
"mcpServers": {
"textify": {
"type": "http",
"url": "https://mcp.textify.me/mcp",
"headers": {
"Authorization": "Bearer atx_YOUR_API_KEY"
}
}
}
} Local config via the npm shim (stdio)
For editors that only speak stdio, the @textifyme/mcp package bridges
to the hosted server:
{
"mcpServers": {
"textify": {
"command": "npx",
"args": ["-y", "@textifyme/mcp"],
"env": { "TEXTIFY_API_KEY": "atx_YOUR_API_KEY" }
}
}
} Running locally
wrangler dev
in apps/mcp and use http://127.0.0.1:8788/mcp as the URL. Local mock mode answers
without real provider keys.
Tools
Five tools, each mapping to a REST endpoint and billed the same way. Schemas below are rendered from the server's tool manifest.
youtube_transcript
1 credit per videoFetch the caption track for a public YouTube video and return it as text plus timestamped segments. Captions only — never downloads the video.
1 credit with captions; 3 if the video has none and falls back to provider ASR; cached transcripts are free.
| Field | Type | Description |
|---|---|---|
| url required | string | YouTube watch/share URL or 11-character video id. |
| lang optional | string | Optional ISO language code (e.g. "en"). |
| ai_fallback optional | boolean | When true (default), a caption-less video is transcribed with AI (3 credits, needs a key). Set false to only return existing captions, for free. (default: true) |
{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
} {
"videoId": "dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"language": "en",
"text": "Never gonna give you up Never gonna let you down"
} transcribe_audio
15 credits per audio-hourRun cloud speech-to-text over an audio URL and return the transcript with timestamped segments.
Billed per audio-hour, prorated. duration_sec is required so the job can be priced up front.
| Field | Type | Description |
|---|---|---|
| audio_url required | string | Publicly reachable URL of the audio file. |
| duration_sec required | number | Audio length in seconds (required — prices the per-audio-hour job). |
| language optional | string | Optional ISO language hint; omit to auto-detect. |
{
"audio_url": "https://cdn.example.com/interviews/ep-42.mp3",
"duration_sec": 372
} {
"language": "en",
"durationSec": 372,
"text": "Welcome back to the show..."
} ocr_image
1 credit per image or pageExtract text from an image URL — photos, screenshots, receipts, and handwriting.
1 credit per image.
| Field | Type | Description |
|---|---|---|
| image_url required | string | Publicly reachable URL of the image. |
{
"image_url": "https://cdn.example.com/receipts/2026-07-01.jpg"
} {
"text": "WHOLE FOODS MARKET\nBananas 1.29\nOat milk 4.49\nTOTAL 5.78",
"confidence": 0.98
} file_to_markdown
1 credit per fetchConvert a digital Word/docx, PowerPoint/pptx, spreadsheet/xlsx, or EPUB at a URL into clean Markdown. PDF is not supported — use the in-browser PDF tool, or ocr_image for scanned pages.
1 credit per converted file.
| Field | Type | Description |
|---|---|---|
| file_url required | string | Publicly reachable URL of the document (docx/pptx/xlsx/epub). |
{
"file_url": "https://cdn.example.com/reports/q2-2026.docx"
} {
"kind": "docx",
"format": "markdown",
"text": "# Q2 2026 Report\n\n## Summary\n..."
} webpage_to_markdown
1 credit per fetchFetch a public web page and return the main article as clean Markdown — no nav, ads, or clutter. SSRF-guarded.
1 credit per fetch; cached pages (24h) are free.
| Field | Type | Description |
|---|---|---|
| url required | string | The public web page URL to convert. |
{
"url": "https://example.com/blog/shipping-fast"
} {
"title": "Shipping Fast Without Breaking Things",
"wordCount": 812,
"markdown": "# Shipping Fast Without Breaking Things\n\n..."
} Agent-flow example: summarize a YouTube video
Once the server is connected, an agent can chain the tools on its own. Ask it to summarize a talk, and it fetches the transcript first, then writes the summary from the returned text — no scraping, no manual copy-paste:
"Summarize this talk in three bullets: https://www.youtube.com/watch?v=dQw4w9WgXcQ"
// The agent calls the MCP tool:
{
"name": "youtube_transcript",
"arguments": { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }
}
// Textify returns the transcript, which the agent then summarizes:
{
"videoId": "dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"language": "en",
"text": "Never gonna give you up Never gonna let you down"
} You can drive the same flow programmatically from the Claude Messages API using its MCP connector — Textify runs the tool server-side and hands the transcript back to the model to summarize:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const message = await client.beta.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
betas: ["mcp-client-2025-11-20"],
mcp_servers: [
{
type: "url",
name: "textify",
url: "https://mcp.textify.me/mcp",
authorization_token: "atx_YOUR_API_KEY",
},
],
tools: [{ type: "mcp_toolset", mcp_server_name: "textify" }],
messages: [
{
role: "user",
content:
"Fetch the transcript of https://www.youtube.com/watch?v=dQw4w9WgXcQ and summarize it in 3 bullets.",
},
],
});
console.log(message.content);