Skip to main content
Glama
dheerajjha

blind-mcp

by dheerajjha

payband-mcp

tests good first issues python license

Find out what a role actually pays — including in markets where the employer publishes nothing.

Renamed from blind-mcp in 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.

The same job, in every market the employer posts it in

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.

Tools

Pay

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

Culture — not registered by default

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: curl and an empty User-Agent are refused too, and only a browser User-Agent gets through. robots.txt still 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 BlindBlocked with an explanation rather than returning empty results that would read as "no discussion found".

The pay tools are unaffected. See #12.

Related MCP server: sec-mcp

Coverage

Measured, not estimated:

Company

Board

Open roles

With a published range

Company

Board

Open roles

With a published range

---

---

---

---

Databricks

Greenhouse

880

471 (54%)

Anthropic

Greenhouse

595

525 (88%)

Ramp

Ashby

148

141 (95%)

Monzo

Greenhouse

66

55 (83%)

Notion

Ashby

127

83 (65%)

Figma

Greenhouse

156

101 (65%)

GitLab

Greenhouse

224

94 (42%)

Stripe

Greenhouse

648

22 (3%)

Freshworks

SmartRecruiters

139

on demand

NVIDIA

Workday

1,693

on demand

Cisco · Adobe · Salesforce · HPE · eBay

Workday

—

on demand

Atlassian

self-hosted

287

122 (43%)

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:<tenant>/<site>".

SmartRecruiters company ids come from careers.smartrecruiters.com/<company-id> and are also guessed from the company name. Pass board="smartrecruiters:<company-id>" 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.

Install

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"]
    }
  }
}

Do I need to log in?

No — and you probably shouldn't. This was measured, not assumed:

  • Post bodies, full comment threads, Blind's AI comment summaries, company listings, topic pages, reviews and salary pages all return HTTP 200 anonymously, with no gating.

  • Driving an authenticated session with automation tripped Blind's anomaly detection after roughly six navigations: 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.

Being a good citizen

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:

  • sends an honest User-Agent (no browser impersonation — Blind serves it a 200 anyway)

  • caches every response on disk for 6h, so repeat questions cost zero requests

  • spaces requests ~1.5s apart

  • fetches robots.txt first and fails closed if it can't be read

Configure 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.

Reading the output

Four things the output says that are easy to skim past:

  • distinct_bands vs postings — 58 postings sharing one band is one data point advertised 58 times.

  • precision — wide means the employer published one range across several levels, so it narrows almost nothing.

  • not_checked_count — postings whose range we did not look at, kept apart from ones the employer genuinely left blank. Raise max_lookups.

  • on_target_earnings_excluded — sales roles often publish OTE, which is base plus commission. Those are reported separately, never averaged into a base band.

Converted figures are estimates on a dated exchange rate, and adjust for neither cost of living nor tax. The published figure in its own currency is the fact; the conversion is there so the comparison is not nonsense.

Blind is anonymous and unverified. Weight claims by the commenter's employer (company on each comment) and treat a single loud voice as one data point. In testing, the Roku India RTO answer was corroborated by two independent commenters and an unrelated Glassdoor review — that's when it's worth trusting.

Contributing

Small project, easy to contribute to. The most useful change is a board we can't reach yet — each adapter is a whole category of employer the tool can suddenly answer for, and two of the last three releases were built by outside contributors doing exactly that. Non-US employers most of all, since markets that publish nothing are the whole point.

Next most useful: a band that's wrong. A number that looks authoritative and isn't is the worst failure this project has, and every serious bug so far has been one. Those get priority over new coverage.

Maintainers: see MAINTAINING.md.

Start with good first issues, then CONTRIBUTING.md. Issues are labelled by size (size: XS is under 30 minutes) and mentored means ask questions in the thread and you'll get walked through it. Claim one in a comment and it's assigned to you. First review within 48 hours — reviewed by running it, not just reading it.

Two hard rules, both explained in CONTRIBUTING: don't commit captured Blind pages (fixtures are generated), and don't weaken robots/cache/throttle for speed.

Publishing

mcp-name: io.github.dheerajjha/payband-mcp

See RELEASING.md.

License

MIT

Available Tools

5 tools
company_postsA

List posts about a company, optionally narrowed to one topic.

topic accepts a bare keyword from company_topics (e.g. "india", "wlb").

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
topicNo
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It clearly discloses a read-only listing behavior and adds an important constraint: `topic` must be a bare keyword from company_topics, not an arbitrary string. It does not detail pagination or ordering, but these are minor for this straightforward query and the output schema defines the result format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two focused sentences: the first states the primary purpose, the second clarifies the only non-obvious parameter. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool, the description covers the key behavior and the topic constraint, and an output schema exists to define the response shape. It falls slightly short of full completeness because the pagination parameters are undocumented, but the defaults and names make them reasonably inferable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It only documents `topic` (with examples), while leaving `page`, `limit`, and `company` unaddressed. `company` is required and inferable, and `page`/`limit` have defaults, but their semantics (e.g., page size, offset) are not defined anywhere in the schema or description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific verb 'List' and the resource 'posts about a company', making the core action unambiguous. It also states the optional narrowing by topic, which distinguishes it from sibling tools like company_topics (which presumably lists topics) and read_post (which reads a single post).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes the context: use this tool to list posts about a company, with an optional topic filter. It also directs the agent to source `topic` values from company_topics, giving a concrete prerequisite. However, it does not explicitly contrast with alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

company_topicsA

List the discussion topics Blind itself suggests for a company.

These are the highest-signal entry points -- e.g. Roku exposes india, wlb, culture, layoffs, interview, rsu. Use one as the topic for company_posts.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that this is a read-only listing operation and explains the selection behavior: topics are 'Blind itself suggests' and are 'highest-signal entry points.' This adds meaningful behavioral context, although it does not mention potential edge cases such as companies with no suggested topics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core statement appears in the first sentence, followed by a helpful purpose rationale and concrete examples. Every sentence earns its place, and the reference to company_posts adds actionable guidance without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with an output schema, the description covers the main usage flow: retrieve suggested topics, then pass one to company_posts. The main gap is the missing company identifier format, but the overall tool behavior and integration with the sibling are sufficiently explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needed to compensate by explaining the `company` parameter, but it only says 'for a company.' It does not clarify the expected format (e.g., display name vs. slug), case sensitivity, or whether the company must match a known entity. The Roku example is about topic values, not the parameter format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a clear resource ('discussion topics Blind itself suggests for a company'). It includes concrete examples (Roku's topics: india, wlb, culture, layoffs) and explicitly connects to the sibling company_posts by explaining that one of these topics should be used as its `topic`, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly tells the agent when to use this tool: to get the highest-signal entry points before calling company_posts. It explicitly names the relevant sibling and how the result should be consumed. It does not enumerate exclusions or alternatives like read_post/find/research, so it stops just short of full explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

findA

Find a company's posts about one keyword.

This is how you search Blind. The company topic path accepts any keyword, so find("Intuit", "maternity") returns exactly the maternity threads -- which paging the main listing will not surface, since they can be years deep. Prefer one distinctive noun ("maternity", "rto", "refresher"); vague words like "policy" match hundreds of loosely-related posts.

Returns no posts when nothing matches, rather than falling back to the generic listing, so an empty result is a real answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
companyYes
keywordYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses exact-match behavior on the topic path, the no-fallback empty-result semantics, and the risk of vague keywords, which are non-obvious and useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the one-sentence purpose, followed by only behaviorally relevant details. Every sentence adds information (example, keyword guidance, empty-result meaning) without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-style search with three parameters and an output schema, the description covers the important invocation distinctions, result semantics, and fallback behavior. Nothing necessary for a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% property descriptions, so the description must compensate. It richly explains the keyword parameter and illustrates company/keyword with the Intuit/maternity example, though the limit parameter is left to inference from its name and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Find a company's posts about one keyword') and the examples make the exact scope unmistakable. It also contrasts with the generic 'main listing' by saying this returns keyword-specific threads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly positions itself as the way to search Blind and gives concrete keyword-selection advice. It mentions the 'main listing' as an alternative that fails to surface old threads, but it does not name sibling tools or state explicit when-not-to-use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_postA

Read one Blind post in full.

Returns the body, Blind's own AI summary of the comment thread, and the comments with each commenter's employer -- which is how you weigh a claim (an answer from someone at the company differs from a passer-by).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
max_commentsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It usefully describes the return payload (body, AI summary, comments with employer context) and the reasoning behind it. However, it does not disclose that max_comments limits how many comments are returned, despite the schema's default of 40, which could mislead an agent into expecting all comments.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core action comes first, then the return contents, then a concise rationale for the employer data. Every sentence contributes useful information without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose, the return values, and the practical use case (weighing claims). Since an output schema exists, return format details are not required here. The main gap is the lack of any mention of max_comments or URL expectations, which keeps it just short of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the two parameters. It implies that 'url' identifies a single post, but it never explains the expected URL format or the meaning/behavior of 'max_comments'. This leaves both parameters underspecified beyond their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Read one Blind post in full'), which clearly distinguishes it from sibling list/search tools like company_posts and find. It also specifies what the tool returns, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a clear use case: retrieving a single post by URL in order to read its full content and comments. It does not explicitly contrast with sibling tools or state when not to use it, but the 'one post in full' framing provides enough context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

researchA

Answer a question about a company by pulling the most relevant threads.

Probes the distinctive words in the question against Blind's keyword-scoped company pages, merges the hits, then returns the best threads in full with Blind's own AI summary and the comments that actually address the question.

Ask naturally: "how many days in office in India", "what is the maternity leave policy", "do they require a PhD".

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYes
questionYes
max_postsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the internal process (probing distinctive words, merging hits) and the exact output shape (best threads in full, Blind's AI summary, comments that address the question). This goes well beyond a generic 'research' label, though it does not mention error conditions or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient and well-structured: a one-sentence summary, a two-sentence mechanism/outcome explanation, and example queries. Every sentence earns its place and there is no redundant fluff. The key purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema and three simple parameters, the description covers the core purpose, mechanism, and return contents clearly. It is slightly incomplete for an agent because it does not explain the meaning of max_posts or explicitly differentiate from sibling tools, but it is still usable as-is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It effectively explains 'company' and 'question' through the purpose sentence and the example prompts, but 'max_posts' is never mentioned or contextualized. The compensation is partial: the two main parameters are clear, but the third is not addressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pairing: "Answer a question about a company by pulling the most relevant threads." It clearly differentiates itself from the sibling tools (company_topics, company_posts, read_post, find) by describing a cross-thread research capability that merges hits and returns a curated answer with AI summary and relevant comments. The natural-language examples reinforce what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description strongly implies when to use this tool: whenever you have a natural-language question about a company, with examples showing the expected phrasing ("Ask naturally: ..."). However, it does not explicitly name alternatives or state when NOT to use this tool in favor of a sibling, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedcompany_posts
    • First observedcompany_topics
    • First observedfind
    • First observedread_post
    • First observedresearch

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation4/5

The tools generally occupy distinct layers: topic discovery, listing, keyword search, question answering, and full post reading. The only mild overlap is between company_posts and find, since both return company posts, but their input styles (curated topic vs arbitrary keyword) make the split understandable.

Naming Consistency3/5

Names are readable and consistently lowercase, but the pattern is mixed: company_topics and company_posts are noun-style resources, read_post is verb_noun, and find/research are bare verbs. There is no single predictable naming convention across the set.

Tool Count5/5

Five tools is a well-scoped size for a read-only Blind search and research server. Each tool serves a meaningful step in the workflow without unnecessary bloat or duplication.

Completeness5/5

The toolset covers the full read-oriented workflow: discover company topics, list posts, search by keyword, ask a natural-language research question, and read a full post with comments. There are no obvious gaps for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables searching and analyzing H-1B visa sponsoring companies using U.S. Department of Labor data. Supports filtering by job role, location, and salary with natural language queries to find direct employers and export results.
    16
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to SEC EDGAR data through natural language, including company filings, financial statements, and company info, without requiring an API key.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables querying open job postings directly from company applicant-tracking systems (Greenhouse, Ashby, Lever), finding a company's job board, listing and comparing roles, and accessing salary data, all without scraping or API keys.
    3
    22 PyPI
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables asking what companies are hiring right now by querying live job postings from their applicant-tracking system board APIs (Greenhouse, Lever, Ashby, Recruitee, Rippling, Personio), with filters, parsed location, remote flag, and structured salary.
    3
    MIT