mcp-fetch-worker
mcp-fetch-worker
Универсальный MCP-коннектор для ботов и агентов, которым нужно вызывать ваши self-hosted API, не передавая им долгоживущие учётные данные.
Поместите Cloudflare Access перед этим Worker с включённым Managed OAuth, и боты вроде Grok Bot или OpenClaw смогут подключаться через Dynamic Client Registration (DCR). Вы одобряете доступ при первом подключен бота и можете отозвать его в любой моментего из Access. Бот получает ограниченный токен, связанный с коннектором, а не общий API-ключ, который можно использовать где-то ещё.
Production MCP URL: https://<your-domain>/mcp
Зачем это нужно
Управлямые боты хорошо работают с вызовами инструментов, но большинство homelab- и self-hosted-приложений не имеют встроенного MCP-сервера. Можно было бы:
Использовать сервисные токены: постоянный доступ через пользовательские заголовки. Нормально для скриптов; рискованно для ботов, которым вы не полностью доверяете.
Дать боту Chrome: он открывает вашь веб-интерфейс, вы проходите SSO, и так каждыйраз. Работает, но сжигает токены and не масштабируется.
Создавать MCP-сервер для каждо приложения: правильно, но для Home Assistant API или случайного внутреннегодашборда это слишком много работы.
Этот Worker — середина пути: тонкий MCP-коннектор, который предоставляет один-единственный инструмент http_fetch. Укажите его на API того же оригисходящего (уже за Access), и бот сможет делатGET/POST-запросы с одобренным вами OAuth-токеном. На другой стороне не нужен отдельный MCP-сервер.
Подробное описание — в стате First World Problem: How do I grant my bots access to my stuff without it wrecking everything?.
Related MCP server: Cloudflare Control
Как это работает
Bot (Grok Bot, OpenClaw, Cursor, …)
→ OAuth via Cloudflare Access Managed OAuth (you approve)
→ MCP at /mcp (this Worker)
→ http_fetch to allowed origins on your domain
→ Access JWT forwarded on outbound requestsAccess обрабатвает аутентифкацию: Managed OAuth + DCR. Этот Worker не являето OAuth-серверам; он проверяет
Cf-Acess-Jwt-Assertion, который передаёт Access.Этот Worker предоставляет Streamable HTTP MCP с одним инструментом:
http_fetch.Ваши API находяться на той же origin и стоят за Access. Создайте политики Linked App Token, чтобы передаваемый JWT принимался ниже по цепочке.
Исходящие запросы по умолчанию ограничены origin самого Worker (ALLOWED_ORIGINS переопределяет это).
Что он делает
Предоставляет MCP на
/mcp(и/sseкак устаревший алиас) через Agents SDKcreateMcpHandlerРаскрывает один инструмент,
http_fetch, для GET/POST-запросов к разрешённым originsПроверяет
Cf-Access-Jwt-Assertionпротив JWKS вашей команды, когда заданыCF_ACCESS_TEAM_DOMAINиCF_ACCESS_AUDПередаёт токен доступа вызывающего на исходящих запросах (
Cf-Access-Jwt-Assertion,Cf-Access-Token,Authorization: Bearer)
Деплой
npm install
npm run cf-typegen # regenerate Env types from wrangler.jsonc
npx wrangler deployКонфигурация находится в wrangler.jsonc. Журналы Workers Logs и трассировки включены по умолчанию через блок observability.
Кастомный домен (Custom domain route)
Добавьте route Worker в wrangler.jsonc (или в панели управления):
"routes": [
{
"pattern": "example.com/mcp*",
"zone_name": "example.com"
}
]Затем передеплойте. MCP-эндпойн — https://<иоur-domain>/mcp.
Convenient environment variables
Задайте в wrangler.jsonc vars, в качестве secrets (wrangler secret put), или в .dev.vars — в .dev для локальной разработки. см. .dev.vars.example):
Variable | Required | Description |
| Продакшн |
|
| Продакшн | AUD-тего из вашего приложени Access |
| Нет | Разреешённый список fetch-запросов через запятую (default: origin of Worker) |
| Нет | Обрезать тела ответов больше этого размера (по умолч. 65536) |
| Нет | JSON-объект с стандартными исходящими заголовками (секрет; см. ниже) |
Когда CF_ACCESS_* не заданы, Worker продолжаer обслуживать MCP (полезно для wrangler dev), но не проверяет Access JWT. В проде задайте обе переменные.
Стандартные заголовки для API-ключей
Храните дополнительные исходящие заголовки как секрет Worker, чтобы http_fetch мог вызывать API, требования ключ, не передавая секреты в чат и не зашивая один API в Worker:
wrangler secret put DEFAULT_HEADERS
# paste: {"X-Api-Key":"your-key-here"}Для локальной разработки задайте непустое значение в wrangler.jsonc vars, передайте --var DEFAULT_HEADERS='{"X-Api-Key":"..."}' в wrangler dev или используйте wrangler secret put на задеплоенном Worker. Когда настроено secrets.required, .dev.vars загружает только указанные имена секретов, поэтому поместите DEFAULT_HEADERS в vars или используйте --var локально.
DEFAULT_HEADERS должен быть JSON-объектом со строковыми значениями, например {"X-Api-Key":"..."}. При каждом вызове http_fetch эти заголовки объединяются с исходящим запросом. Заголовки из tool-вызова переопределяют значения по умолчанию при конфликте имен. Передача JWT Access (Cf-Access-Jwt-Assertion, Cf-Access-Token, Authorization) всегда приоритетна и не может быть переопределена значениями по умолчанию.
Пустой или не заданный DEFAULT_HEADERS не добавляет никаких заголовков.
Настройка Cloudflare Access
Добавьте self-hosted приложение Access для вашего MCP URL (например,
https://<егоome>/mcpили путь, покрывающий/mcp*)Включите Managed OAuth для приложения (Advanced settings); это включат DCR для MCP-клиентов
Скопируйте тего AUD приложения в
CF_ACESS_AUDУстановите
CF_ACESS_TEAM_DOMAINваш team domain (напримерhttps://<team>.cloudflare.com)Настройте Access-политики для того, кто может подключиться: временнные, на основе electrical почты или любые другие по вашей модели одобрения
Для downstream API, Lражённых Access на это же origin, создайте политики Linked App Token для этих приложений, чтобы переданный переданный JWT принимался.
Настройка клиента MCP
Вставьте этот URL в Cursor, Grok Bot, OpenClaw или любой клиент Streamable HTTP MCP:
https://<your-domain>/mcpИспользуйте транспор Streamable HTTP (не устаревший SSE). Клиент пройдёт OAuth через Access Managed OAuth at first connect; this is your human-in-the-loop (человек в цике) шаг одобрения.
Локальная раз work
npm run devMCP доступен at htt://localhost:8о87/mc b without Access validation.
http__fetch tool
{
"url": "/api/example",
"method": "GET"
}url: абсолютный URL или path in same originMethod:GET(default) orPOSTheaders: необязательные extra headers (перекрываюDEFAULT_HEDERSwhen conflict)body: optional POST body
DEFAULT_HEDERS (secret) applied first; tool headers override them. Access JⅣWT headers are always applied last.
Returns JSON with status, headers, body, and a truncated flag.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to dynamically discover and invoke containerized tools that can be registered at runtime without redeployment. Built on Cloudflare Workers with scale-to-zero containers for secure, isolated tool execution.
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Cloudflare infrastructure including DNS records, cache purging, SSL settings, Workers, and analytics through the Cloudflare API. Eliminates dashboard context-switching by allowing natural language control of domain management and infrastructure operations.
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to create and manage short URLs via the MCP protocol, with OAuth authentication through Cloudflare Access.12Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables deploying a remote MCP server on Cloudflare Workers with OAuth, allowing MCP clients like Claude Desktop to call tools over the internet.
Related MCP Connectors
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
The bridge from K2 agents through Wrangler to your master AI - safe, approval-gated Cloudflare ops.
SaaS intelligence for AI agents. 5 unified tools cover 1,000+ services with 91-96% token savings.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jkpe/mcp-fetch-worker'
If you have feedback or need assistance with the MCP directory API, please join our Discord server