Skip to main content
Glama
pmsorhaindo

reddit-mcp

by pmsorhaindo

reddit-mcp

MCP-коннектор для Reddit Data API в режиме только для чтения для OAuth через connect-card Cursor / Grok Bot. Работает как Cloudflare Worker, который использует MCP Streamable HTTP и пробрасывает токен Authorization: Bearer вызывающей стороны на https://oauth.reddit.com.

Репозиторий: https://github.com/pmsorhaindo/reddit-mcp

Архитектура

Cursor / Grok Bot
   │  OAuth (connect-card) against Reddit authorize/token
   │  then MCP JSON-RPC with Bearer access token
   ▼
Cloudflare Worker (this repo)
   │  POST /mcp  → tools/list, tools/call
   │  GET  /.well-known/oauth-*  → discovery pointing at Reddit
   ▼
https://oauth.reddit.com  (User-Agent from env, Bearer passthrough)

Маршрут

Назначение

GET / или /health

Проверка живости (liveness) + карта эндпоинтов

POST /mcp

MCP Streamable HTTP (JSON-RPC: initialize, tools/list, tools/call)

GET /.well-known/oauth-authorization-server

Метаданные OAuth AS (authorize/token Reddit)

GET /.well-known/oauth-protected-resource

Метаданные защищённого ресурса для этого URL MCP

GET /callback

Только лендинг для разработки — не обменивает коды

Почему минимальный JSON-RPC (а не полный MCP SDK)?

@modelcontextprotocol/sdk изначально ориентировался на Node.js-транспорты. Этот Worker реализует нативный для Workers, лёгкий интерфейс Streamable HTTP JSON-RPC (initialize / tools/list / tools/call), который подходит Cursor/Grok для вызова инструментов, без Durable Objects и хранилищ сессий. Это согласуется со сквозной передачей Bearer-токена: Worker никогда не хранит refresh-токены Reddit.

Инструменты

Tool

Reddit API

Scopes

get_me

GET /api/v1/me

identity

list_subscriptions

GET /subreddits/mine/subscriber

mysubreddits

get_user_history

GET /user/{user}/{overview|submitted|comments}

history, read

get_subreddit_feed

GET /r/{sub}/{hot|new|top|rising|controversial}

read

search_reddit

GET /search или /r/{sub}/search

read

Все инструменты возвращают компактный JSON (текстовые поля усекаются). limit по умолчанию — 25, максимум — 100.

Rate Limiting

  • Исходящие вызовы к Reddit сериализуются в рамках каждого изолята Worker (цепочка промисов).

  • Заголовки ответа X-Ratelimit-Remaining / X-Ratelimit-Reset учитываются перед следующим вызовом.

  • HTTP 429 / 503 вызывают ограниченные повторные попытки с Retry-After или экспоненциальной задержкой.

Безопасность секретов

Никогда не коммитьте настоящие секреты.

  • Надёжный .gitignore покрывает .env, .dev.vars, .wrangler/, node_modules/, dist/, credentials*.json, .mcp-auth/.

  • Коммитятся только примеры env-файлов: .dev.vars.example, .env.example.

  • В wrangler.toml нет встроенных секретов.

  • Ошибки и console логи никогда не включают заголовки Authorization, токены или секретные значения env.

  • Payload ошибок инструментов — только статус/сообщение, без тел ответов вышестоящих сервисов, которые могут засветить учётные данные.

Related MCP server: reddit-mcp

Настройка приложения Reddit

  1. Создайте Reddit app на https://www.reddit.com/prefs/apps (тип web app или installed app — зависит от вашего клиента).

  2. Добавьте redirect URI:

    • http://localhost:8787/callback — локальный wrangler / ручное тестирование

    • https://www.cursor.com/agents/mcp/oauth/callback — connect-card Cursor

  3. Запросите scopes (через запятую в authorize URL Reddit):

    • identity,read,mysubreddits,history

  4. Запишите client_id / client_secret для OAuth-клиента (Cursor / ваш секрет-менеджер). Не помещайте их в этот репозиторий или в wrangler.toml.

OAuth discovery assumptions

  • Файл /.well-known/oauth-authorization-server объявляет:

    • authorization_endpoint: https://www.reddit.com/api/v1/authorize

    • token_endpoint: https://www.reddit.com/api/v1/access_token

  • Этот Worker не выполняет обмен authorization-code и не хранит refresh-токены.

  • Cursor/Grok выполняют OAuth с Reddit (используя учётные данные приложения Reddit, которые вы настроили в клиенте), а затем отправляют Authorization: Bearer <access_token> в MCP-запросах.

  • issuer в метаданных — это origin этого Worker, чтобы MCP-клиенты могли найти документацию по базовому URL MCP; authorize/token по-прежнему выполняются на Reddit.

  • Reddit scopes традиционно разделяются запятыми в authorize URL — клиенты должны объединять их соответственно.

Деплой на Cloudflare

Предпосылки: Node 22+, аккаунт Cloudflare, Wrangler авторизован (npx wrangler login).

git clone https://github.com/pmsorhaindo/reddit-mcp.git
cd reddit-mcp
npm install

# Local secrets (gitignored)
cp .dev.vars.example .dev.vars
# edit USER_AGENT — must identify you per Reddit API rules

npm run typecheck
npm run dev          # http://127.0.0.1:8787

# Production secret (not committed)
npx wrangler secret put USER_AGENT
npm run deploy

Пример формата USER_AGENT (только плейсхолдер):

cloudflare-worker:reddit-mcp:0.1.0 (by /u/YOUR_REDDIT_USERNAME)

После деплоя запомните URL на workers.dev или кастомный домен, например https://reddit-mcp.<account>.workers.dev.

Добавление MCP-сервера (Cursor / Grok)

Настройте AddMcpServer (или их аналог) со connect-card:

Поле

Значение

URL

https://<your-worker>/mcp

Auth

OAuth (connect-card)

Scopes

identity read mysubreddits history

Клиент должен использовать ваш Reddit app client id/secret и redirect URI Cursor выше. После авторизации, вызовы инструментов MCP должны включать access-токен Reddit в Bearer-заголовке; этот Worker передаёт его дальше.

Смоук-тесты

Replace $BASE and $TOKEN locally — не коммитьте токены.

BASE=http://127.0.0.1:8787
TOKEN=reddit_access_token_here

# Health
curl -sS "$BASE/health"

# OAuth metadata
curl -sS "$BASE/.well-known/oauth-authorization-server"
curl -sS "$BASE/.well-known/oauth-protected-resource"

# MCP initialize
curl -sS -X POST "$BASE/mcp" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}'

# tools/list
curl -sS -X POST "$BASE/mcp" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

# tools/call get_me (requires valid Bearer)
curl -sS -X POST "$BASE/mcp" \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_me","arguments":{}}}'

Ожидается: результат JSON-RPC; get_me возвращает компактные поля профиля. Отсутствие Bearer → ошибка JSON-RPC Unauthorized без утечки заголовков.

Скрипты

Скрипт

Команда

npm run dev

wrangler dev

npm run deploy

wrangler deploy

npm run typecheck

tsc --noEmit

Вне области видимости

  • Публикация, голосование, сообщения, модерация или Ads API

  • Хранение refresh-токенов Reddit или client secrets на Worker

  • Выполнение обмена OAuth-кода на /callback

  • Полные MCP resources/prompts/sampling/elicitation sessions

  • Мультитенантные token vaults / Durable Object session stores

  • Гарантия глобальной координации rate-limit между изолятами (лимиты — на изолят + заголовки Reddit)

Лицензия

Приватная / не публикуется, если вы не добавите файл лицензии.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that provides both read-only and authenticated access to Reddit content and interactions without requiring a developer API key. It enables users to browse posts, search subreddits, and perform write actions like commenting and voting by leveraging browser session cookies.
    8
    1
    The Unlicense
  • F
    license
    Not graded
    quality
    D
    maintenance
    A read-only Model Context Protocol server that enables browsing subreddits, searching within subreddits, retrieving comment trees, and looking up user activity on Reddit via natural language.
  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only MCP server that connects to the Reddit Data API to search posts, browse subreddits, read comments, view user profiles, and check trending content through the Model Context Protocol.
    12
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server for public Reddit content using TypeScript. Enables listing posts, fetching post details and comments, and searching Reddit.
    32
    2
    MIT

Latest Blog Posts

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/pmsorhaindo/reddit-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server