Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
What a role really pays, including markets where the employer publishes no range.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"blind": {
"command": "uvx",
"args": [
"blind-mcp"
]
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add blind -- uvx blind-mcp프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"blind": {
"command": "uvx",
"args": [
"blind-mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"blind": {
"type": "stdio",
"command": "uvx",
"args": [
"blind-mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검
레지스트리 이름이 GitHub 계정 dheerajjha 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.2.0)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Tethered Trust
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Fit, compatibility and recall checks for AI agents before they buy: verdicts, evidence, receipts.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
Find out what a role actually pays — including in markets where the employer publishes nothing.
Renamed from
blind-mcpin 0.5.0. The Blind tools are still here (see
below), but reading published pay
bands is what this does, so the name now says so. The old GitHub URL
redirects; the old PyPI package points here.
BLIND_MCP_*environment
variables still work —
PAYBAND_*is preferred.
Colorado, California, New York, Washington and Illinois require a salary range on covered job postings. India, Singapore and most of the EU require none. So the same title, at the same company, in the same week, is posted with a band in Denver and without one in Bengaluru.
The band is still there. It is just attached to a different listing.
pay_bands(company="Databricks", role="forward deployed")
101 matching openings · band width ratio x1.37 · 33 publish no range
LEVEL TYPICAL BAND BANDS POSTS PRECISION mid 152,900–210,155 2 3 tight senior 182,000–250,208 1 58 tight lead 178,800–245,850 1 1 tight manager 211,800–291,300 4 5 tight senior_manager 232,900–320,200 1 1 tight
steps: mid→senior +19.1% · lead→manager +18.5% · manager→sr_mgr +9.9% silent: Remote-India, Seoul, London, Berlin, Amsterdam
Per level, because one range across seniorities is a number nobody is offered — undivided, that role reads as 140,400–320,200, a 2.3x spread covering five different jobs.
typical is the modal band. `distinct_bands` vs `postings` is the honest measure of evidence: 58 postings sharing one band is one data point advertised 58 times. precision flags how much a band actually narrows things — Databricks posts tight per-level bands, Figma posts a single x2.5 band spanning its whole ladder, and both are real.
That is the same employer, the same title, the same moment — a far better anchor for an unpublished number than any salary survey, and it takes one call.
Employers covered by transparency law in one country often post the same role in several. That is the closest thing to a controlled experiment you can get: same company, same title, same week.
pay_bands(company="Anthropic", role="software engineer")
MARKET PUBLISHED BAND POSTS ≈ IN USD vs US USD 405,000–485,000 78 — — GBP 325,000–390,000 10 438,206–525,847 1.08x EUR 235,000–295,000 2 271,165–340,399 0.69x
fx: ECB daily reference rates, 2026-09-15
The published figure is always kept; the conversion sits beside it, dated. Without it the comparison misleads — GitLab's Polish band reads as 272,000–408,000 against a US 139,200–235,200, which looks like Poland paying more and is actually 0.48x.
Reads the public job-board APIs — Greenhouse, Ashby, Lever, SmartRecruiters and Workday — plus a small number of employers who run their own endpoint. Documented, intended for machines, and stable — not scraping.
| Tool | What it does |
|---|---|
pay_bands(company, role, board=, max_lookups=) | Published bands per seniority, plus every currency the role is posted in, converted |
market_rate(role, companies, level=) | The same rung across several employers, sorted by midpoint |
job_openings(company, role=, with_pay_only=) | The underlying postings, with inferred level |
| Tool | What it does |
|---|---|
find(company, keyword, limit=, page=) | Search a company's Blind posts by keyword |
research(company, question, max_posts=) | Pick the topic, rank threads against the question, return them in full |
company_topics / company_posts / read_post | Listings and single threads |
These five are switched off unless you ask for them (PAYBAND_ENABLE_BLIND=1). A tool list is part of what a model reads before deciding what to do, and five entries that can currently only raise cost context and invite dead ends. The code and its tests are untouched, so the flag brings them straight back.
⚠️ Blind began returning 403 to all automated requests around September 2026.
This is site-wide bot protection, not a block on this project:
curland an
empty User-Agent are refused too, and only a browser User-Agent gets through.
robots.txtstill permits/company/, but the WAF does not.
We do not spoof a browser to get around it — that would be circumventing an
access control, and it is the first thing their next escalation defeats. The
Blind tools now raise
BlindBlockedwith an explanation rather than
returning empty results that would read as "no discussion found".
The pay tools are unaffected. See #12.
Measured, not estimated:
| Company | Board | Open roles | With a published range | |
|---|---|---|---|---|
| Company | Board | Open roles | With a published range | Currencies |
| --- | --- | --- | --- | --- |
| Databricks | Greenhouse | 880 | 471 (54%) | USD 451 · CAD 12 · EUR 8 |
| Anthropic | Greenhouse | 595 | 525 (88%) | USD 466 · GBP 44 · EUR 14 |
| Ramp | Ashby | 148 | 141 (95%) | USD 132 · CAD 6 · GBP 2 |
| Monzo | Greenhouse | 66 | 55 (83%) | GBP 47 · EUR 8 |
| Notion | Ashby | 127 | 83 (65%) | USD 71 · EUR 12 |
| Figma | Greenhouse | 156 | 101 (65%) | USD 101 |
| GitLab | Greenhouse | 224 | 94 (42%) | USD 85 · PLN 9 |
| Stripe | Greenhouse | 648 | 22 (3%) | USD 21 · EUR 1 |
| Freshworks | SmartRecruiters | 139 | on demand | USD |
| NVIDIA | Workday | 1,693 | on demand | USD, level-labelled |
| Cisco · Adobe · Salesforce · HPE · eBay | Workday | — | on demand | — |
| Atlassian | self-hosted | 287 | 122 (43%) | USD 119 · CAD 3 |
SmartRecruiters and Workday say on demand because they keep the range inside each posting rather than in the listing. Postings are filtered by title first and only the survivors are fetched, so a question about NVIDIA costs about forty requests instead of 1,693. max_lookups sets that budget, and anything beyond it is reported as not_checked_count — never as the employer publishing nothing.
Workday tenants are found by reading their robots.txt, which names the public career site in its Sitemap line. If the tenant differs from the company name, paste the careers URL or pass board="workday: / ".
SmartRecruiters company ids come from careers.smartrecruiters.com/ and are also guessed from the company name. Pass board="smartrecruiters: " when they differ.
Atlassian self-hosts and is reached by name, through its own endpoint. Its US roles publish three geographic zones (Zone A/B/C), which are reported as separate bands rather than collapsed — their union spans 1.6x and is nobody's offer.
Not covered: Google, Meta, Amazon and Apple, and most Indian-headquartered companies. Amazon and Netflix were probed and both serve clean JSON with no pay in it at all — their ranges exist only in rendered HTML. Apple answers 401. BoardNotFound explains the causes rather than just failing.
If a company *is* on one of these boards under a token you can't guess, read it out of their careers URL and pass it directly:
pay_bands("Some Rebranded Co", "engineer", board="greenhouse:theirslug")
Self-hosted Indian employers are still open in #13.
uv sync
Register with Claude Code:
uv tool install --editable . # puts `payband-mcp` on PATH
claude mcp add --scope user payband -- payband-mcp
Or in claude_desktop_config.json:
{
"mcpServers": { "payband": { "command": "uv", "args": ["run", "--directory", "/path/to/payband-mcp", "payband-mcp"] } } }
No — and you probably shouldn't. This was measured, not assumed:
Automatic Logout — we noticed a login from a new device or location (code 2009), with a redirect to /session-out.So a cookie buys no extra read access and costs you session stability. The only thing it would unlock is company-internal channels, which are gated to verified employees of that company.
If you still want it, set BLIND_COOKIE to your session cookie header (copy it from a logged-in browser request in DevTools). There is no login flow — the server only replays a cookie you supply, read once at startup and attached to each request. It is off by default, and the client raises immediately if Blind invalidates it rather than silently returning logged-out HTML.
The cookie itself is never written to disk, but responses fetched with it are cached under a separate auth/ directory so authenticated and anonymous results can never be served for each other. Don't commit the cookie.
Blind's robots.txt disallows /search/ for every user-agent, so this server has no search tool and refuses to fetch that path. It also:
User-Agent (no browser impersonation — Blind serves it a 200 anyway)robots.txt first and fails closed if it can't be readConfigure via PAYBAND_CACHE_DIR, PAYBAND_CACHE_TTL, PAYBAND_MIN_INTERVAL, PAYBAND_USER_AGENT.
The job boards get the same treatment. SmartRecruiters and Workday need one request per posting to read a range, so those are spaced 250ms apart behind a lock shared by all four workers — the workers overlap the board's latency without ever raising the rate we ask at — and the number of lookups is capped per question. Workday site discovery reads robots.txt and takes its word for what is public, including never treating a Disallowed path as a career site. Exchange rates are cached for a day, because the ECB publishes them once a working day.
Blind's Terms of Service restrict automated access. This reads public pages at human pace for personal research; bulk crawling is both a ToS problem and, given that Blind's value rests on anonymity, a privacy one. Don't build a dataset of posts joined to employers and nicknames.
Four things the output says that are easy to skim past:
wide means the employer published one range across several levels, so it narrows almost nothing.max_lookups.앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요