Only Hiring

io.github.hassanaziz0012由 GitHub 账号 hassanaziz0012 发布v1.0.0更新于 Nov 7, 2026

Search scam-scored hiring posts from Reddit's job subreddits: freelance, remote and contract work.

已验证Streamable HTTP可网页运行效率与工作流网页搜索与抓取

概览

AI 生成的概览

搜索 Reddit 招聘子版块的招聘帖,附带诈骗评分、薪资、技能、地点,并链接到 Reddit 原帖申请。

可以做什么
  • 按最新优先搜索 Reddit 招聘子版块的招聘帖,可按子版块筛选
  • 查看单个职位的完整信息:摘要、薪资、技能、语言、测试任务、申请方式,以及诈骗评分和风险信号
  • 列出收录的子版块及其在招职位数量和发布内容
适用场景
适合想浏览从 Reddit 汇总的自由职业、远程、兼职或合同岗位的人,也适合想判断某个 Reddit 招聘帖是否为骗局时参考。
运行要求
远程 MCP 端点;未声明需要安装包、账号、API 密钥或环境变量。申请需通过 Reddit 原帖完成。
安装前请注意
摘要和诈骗评分由语言模型生成,可能出错,应在 Reddit 上核实原帖。评分 0.4 及以上会显示警告,0.6 及以上默认隐藏,应把警告转告用户。该服务不会代替用户申请,已删除的帖子可能在下一次同步前仍然显示。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Only Hiring,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.hassanaziz0012%2Fonly-hiring/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "only-hiring": {
      "type": "http",
      "url": "https://onlyhiring.hassandev.me/mcp"
    }
  }
}

README

Only Hiring

[Only Hiring - Listed on Claude AI Directory] [mcptry]

A job board for Reddit's hiring subreddits, minus the noise.

About three in four posts on subreddits like r/forhire, r/slavelabour or r/DesignJobs are people advertising their own services, discussion or spam. This site lists only the posts where someone is actually hiring. Each job has a short summary, structured fields (pay, role, work mode, location, skills) and a link back to the original Reddit post, which is where you apply.

How it works

[private pipeline (not in this repo)]  scrape new posts → grade each post with a language model → sync to Postgres                                                                   │ writes                                                                   ▼                                                          Neon Postgres, `jobs` table                                                                   ▲ reads only                                                                   │[this repo, on Vercel]  Next.js reads the table server-side and renders the list
  • Collect. On a schedule, the pipeline reads the newest posts from about 19 hiring subreddits. Posts tagged [For Hire] or [Offer] are skipped.
  • Grade. A language model decides whether each post is hiring, writes a summary, extracts pay, skills and location, and gives it a scam score from 0 to 1.
  • Publish. Only hiring posts are written to the database. Of each post's body, only the opening lines (about 320 characters) are stored; the site shows its own summary and links to Reddit for the rest. Jobs whose Reddit post was deleted or removed are taken off the board.

The scraper and grader are not part of this repository. A separate, private pipeline collects and grades posts on a schedule and writes them to the database. This repo is only the website, and it only ever reads from the database.

Product rules

RuleValueWhere
Jobs older than this move to a collapsed "older posts" section14 dayssrc/lib/site.ts
Jobs at or above this scam score are hidden by default0.6src/lib/site.ts
Jobs at or above this scam score show a warning0.4src/lib/site.ts
Lists, counts and stats refreshafter every sync (refresh.sh), else dailysrc/lib/db.ts (cacheLife)
A job's page refresheswhen a sync adds, changes or removes it, when it expires, else monthlysrc/lib/db.ts (getJob)

Filtering, search and sorting run in the browser, since the dataset is small. Filters are kept in the URL, so filtered views can be shared. "Applied" marks are stored in the visitor's localStorage, or in their account if they sign in. Accounts are optional (email and password, or Google, via better-auth); signing in merges the browser's marks into the account. A signed-out visitor who marks a job or opens a post on Reddit is offered an account once, then not again for 14 days after dismissing it.

Running it locally

Requirements: Node 20+ and npm.

bash
npm installcp .env.example .env.local   # then set WEB_DATABASE_URL (and optionally REMOVAL_EMAIL)npm run dev

WEB_DATABASE_URL is a Postgres connection string for a role that can only SELECT from the jobs table.

DATABASE_URL is a second, separate Postgres database for accounts and their applied marks; create its tables with db/schema.sql. BETTER_AUTH_SECRET signs session cookies (openssl rand -base64 32).

GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET are optional and turn on "Continue with Google". They come from an OAuth client of type "Web application" in Google Cloud Console, with https://<your domain>/api/auth/callback/google as an authorized redirect URI (add http://localhost:3000/... for local use). The button is shown only when both are set at build time.

REMOVAL_EMAIL is optional config: the address shown for removal requests in the footer and on the About page. It is read on the server at build time. If it's unset, the site links to this repo's issue tracker instead.

RESEND_API_KEY is optional: it emails each message from the header's Feedback dialog to REMOVAL_EMAIL, sent from [email protected] (a domain verified in Resend). Messages are also stored in the accounts database's feedback table, so a failed email loses nothing (emailed stays false). Each IP can send 5 an hour.

On Vercel, set these in the project's environment variables for Production and Preview.

Without a reachable database the site still builds and renders a "the job list didn't load" state, then retries every minute.

Other scripts: npm run build, npm run start, npm run lint.

npm run dev and npm run build first run scripts/fetch-fonts.mjs, which downloads the Pilcrow Rounded font files from Fontshare into src/app/fonts/. That folder is gitignored on purpose; see License.

Code map

src/  app/    page.tsx              home: masthead + job board (server component)    jobs/[id]/page.tsx    job detail, prerendered for every job    about/page.tsx        how it works, scam scores, limits, removal requests    robots.ts, sitemap.ts, opengraph-image.tsx, icon.svg  components/    account/              sign-in dialog, header link, session sync    FeedbackNav.tsx       header Feedback link and dialog (posts to app/api/feedback)    board/                client-side filters, search, sorting, grouping    JobItem.tsx           one job in the list    JobDetail.tsx         the detail view  lib/    db.ts                 the only database code (server-only, cached)    jobs.ts               row type, defensive parsing, expiry and scam rules    labels.ts             human labels for enum-like columns    format.ts             pay, date and time formatting    applied.ts            the "applied" store: localStorage, or the account when signed in    auth.ts               better-auth config and the accounts database (server-only)    site.ts               site name, thresholds, removal contact

This app uses Next.js 16 with Cache Components enabled (cacheComponents: true), so caching is done with "use cache" and cacheLife rather than export const revalidate.

After each sync the pipeline runs refresh.sh, which sends /api/revalidate the jobs the sync added, changed or removed (from the pipeline's last_sync.json). Only those job pages are rebuilt: every rebuild writes the page, its prefetch segments and its image to Vercel's ISR cache, and the Hobby plan allows 200,000 writes a month. A deploy starts with a fresh cache anyway. Run ./refresh.sh --all to rebuild every job page after changing jobs outside the pipeline, such as by hand in the database.

Design direction

One motif: the square bracket. People on hiring subreddits mark a real job by starting the title with [Hiring]. That bracket is the site's only shape, and it appears in four places:

  • The name, only [hiring].
  • The headline, which gets "tagged" by two large brackets when the page loads. This is the only animation on the page that runs without a click.
  • The age of every job, shown in a bracket tag in the left gutter, like [3h].
  • Selected filters, which get bracketed like a post title.

Colour. One pair, each colour with one meaning. Mint is what we kept (the masthead, selected filters, the apply panel). Pink is what we flagged: scam warnings, the hidden-scams note, and the footer, which reminds you to check posts before you apply. Deep green is used only for actions. Everything else is near-white ground and near-black ink, with surfaces separated by tone instead of lines or shadows. Dark mode uses the same roles in a deep green-black, and follows prefers-color-scheme.

Type. One family, Pilcrow Rounded by the Indian Type Foundry, self-hosted. It is set bold, tight and lowercase for display, with regular weight for reading. There are five sizes and no more: small, body, lead, head and display.

Layout. The list reads like a menu: day headings with counts, job titles on the left and pay right-aligned on the same line, like prices. There are no cards, borders or shadows. On desktop, filters sit in a sticky rail. On phones, they open in a bottom sheet from a sticky search bar.

Motion. It answers what the visitor does: toggles, the filter sheet, bracket marks on selection. All of it respects prefers-reduced-motion.

The art direction was chosen with the frontend-design and taste-skill design skills. Keep new work inside these rules. Don't add a second shape, a third colour, a second typeface or decorative motion.

Known limitations

  • Deleted posts linger until the next pipeline run. Each run re-checks the jobs from the last 14 days and removes any whose Reddit post was deleted or removed. Older jobs aren't re-checked, so their links can go dead.
  • Pay is not converted. Amounts stay in the post's currency. Sorting by pay groups jobs by pay type and currency instead of comparing across them.
  • Grades can be wrong. Summaries, fields and scam scores come from a language model. The site says so and asks visitors to verify posts on Reddit.

Legal

This project is not affiliated with, endorsed by or sponsored by Reddit, Inc. Reddit is a trademark of Reddit, Inc. Only the opening lines of each Reddit post are stored and shown; every listing links to its original post. Removal requests go to the contact shown in the site footer.

License

The code is released under the MIT License.

The typeface, Pilcrow Rounded, is not covered by MIT. It belongs to the Indian Type Foundry and is licensed under the ITF Free Font License, which allows self-hosting on your own site but not redistributing the font files. That's why the files aren't in this repo: the build fetches your own copy from Fontshare, and that copy is subject to the same license.

来源:README.md,提交 5e344bd

工具

3

search_jobs

Search jobs

Search current hiring posts from Reddit's job subreddits, newest first. With no filters, returns the newest open jobs. Each result has pay, type, location, skills, any scam warning, the Only Hiring link and the Reddit link to apply.

输入参数rolelimitqueryregionskillsmin_paycurrencypay_typesubredditwork_modemax_scam_scoreemployment_type另有 1 个

get_job

Get a job

One job's full details: summary, pay, skills, languages, test task, how to apply, the opening of the post, and its scam score with the red flags behind it. Also answers "is this Reddit job post a scam?" for a post on the board.

输入参数id必填

list_subreddits

List subreddits

The subreddits Only Hiring reads, with how many open jobs each has and what gets posted there. Use a name as search_jobs' subreddit filter.

无需输入参数。

版本历史

1
  1. v1.0.0最新Nov 7, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分