Skip to main content
Glama
Abhinav-Sriharsha

ashby-jobs

ashby-jobs

Search and browse any company's public Ashby job board from Claude Code.

Point it at a company's board slug — the {slug} in jobs.ashbyhq.com/{slug} — and it lists open roles, surfaces the most recently posted ones, and pulls full details for a single posting.

Requirements

  • uv

  • Python 3.14+

uv must be on your PATH before you install the plugin. The MCP server is launched as uv run, so if uv is missing the server fails to start and the tools simply never appear — check /mcp if the commands are there but nothing works. Python 3.14 and the dependencies are fetched by uv itself on first launch, which makes that first startup slow.

Related MCP server: JobSpy MCP Server

Install

Add this repo as a plugin marketplace, then install the plugin:

/plugin marketplace add Abhinav-Sriharsha/ashby-jobs-mcp
/plugin install ashby-jobs@ashby-jobs

For local development, point the marketplace at your checkout instead:

/plugin marketplace add /path/to/ashby-mcp

The MCP server starts automatically on install; no manual .mcp.json editing needed.

Commands

Commands are namespaced under the plugin name:

Command

Arguments

Does

/ashby-jobs:list-jobs

<job-board> [keyword]

Lists open roles, optionally filtered by title or department

/ashby-jobs:latest-jobs

<job-board> [department] [count]

Shows the most recently posted roles, newest first

/ashby-jobs:job

<job-board> <job-id>

Full details for one posting

/ashby-jobs:check-company

<company>

Says whether a company is on Ashby at all, and under which slug

/ashby-jobs:add-company

<job-board>

Tracks a company without looking up its jobs

/ashby-jobs:list-companies

Shows every tracked company

/ashby-jobs:remove-company

<job-board>

Stops tracking a company

/ashby-jobs:set-department

[keyword, ...]

Saves the default keywords used when searching and iterating

/ashby-jobs:iterate-list

[keyword] [hours]

Sweeps every tracked company for roles posted in the last 24 hours

/ashby-jobs:latest-jobs ramp Engineering 5
/ashby-jobs:list-jobs ramp backend
/ashby-jobs:job ramp b614563f-3ce6-4dca-b5ba-0e5a6c8bda27
/ashby-jobs:check-company Linear
/ashby-jobs:add-company ramp
/ashby-jobs:set-department engineer, ai, software engineer
/ashby-jobs:iterate-list

The two filters do not work the same way. keyword matches title and department loosely, so backend works and you can pass a comma-separated list. department on latest-jobs is an exact match against the board's own department names, so Engineering works but engineer returns nothing — run list-jobs first if you are not sure what a board calls its departments.

Default department

set-department saves the keywords that list_jobs and iterate_list fall back to when you do not pass your own. Pass several separated by commas — a job matching any one of them counts. They are matched against title and department, not against exact department names, so broad terms work on boards that have no such department: engineer matches OpenAI's Forward Deployed Engineering roles even though its board has no Engineering department.

/ashby-jobs:set-department engineer, ai, software engineer
/ashby-jobs:list-jobs openai            # filtered to those keywords
/ashby-jobs:list-jobs openai all        # the whole board anyway
/ashby-jobs:list-jobs openai research   # your keyword wins
/ashby-jobs:set-department              # clears it

Keywords match from a word start, not anywhere in the string. That is what keeps short ones usable — plain substring matching turns ai into a hit on Retail, Maintenance and Supply Chain, which is 28 junk results out of 66 on OpenAI's board. The end stays open, so prefixes still work: engineer matches Engineering and infra matches Infrastructure.

Because a saved default narrows results silently, both tools return keyword_source alongside their results — default when the saved value applied, argument when yours did, override for all, and none when nothing filtered.

Tools

The same functions are available to Claude directly, so you can just ask in plain language ("what's open at Ramp in engineering?") instead of using a command.

Tool

Arguments

list_jobs

job_board_name, keyword (optional)

get_latest_jobs

job_board_name, department (optional), top_k (default 5)

get_job

job_board_name, job_id

check_company

company (slug or plain name)

add_company

company

list_companies

remove_company

company

set_department

department (empty clears it)

iterate_list

keyword (optional), hours (default 24)

list_jobs returns the matching jobs together with the board's live totals:

{
  "job_board": "openai",
  "total_open_jobs": 734,
  "matched_jobs": 383,
  "keywords": ["engineer", "ai", "software engineer"],
  "keyword_source": "default",
  "jobs": [ ... ]
}

iterate_list walks every tracked company. A board that fails to fetch is reported in errors rather than aborting the sweep, so one renamed slug does not cost you the rest of the results.

check_company answers from whether the board exists, not from whether it has postings — Ashby returns 404 for a slug nobody owns and 200 for a real board even when nothing is open. So a company with an empty board is still a yes, with open_jobs of 0:

{
  "company": "Acme Corp",
  "on_ashby": true,
  "job_board": "acmecorp",
  "board_url": "https://jobs.ashbyhq.com/acmecorp",
  "open_jobs": 12,
  "tried": ["Acme Corp", "acmecorp"]
}

It takes a plain company name as well as a slug: the name is retried as a few normalized slugs (acmecorp, acme-corp, and legal suffixes dropped), and job_board reports whichever one resolved, which is the slug the other tools want. tried lists what was attempted, so a false can be read for what it is — no board found under those names, not proof of absence. When Ashby cannot be reached, on_ashby is null rather than false, with an error explaining why; a timeout is not evidence that a company is off Ashby.

Each tool also ships an MCP prompt, available as /mcp__ashby-jobs__<tool_name> — the same operations, reachable without the plugin's short commands.

Tracked companies

Every company you look up with list_jobs is recorded in a small SQLite database, along with when it was first and last queried and how many times. add_company adds one up front without fetching any jobs, list_companies shows them, and remove_company drops one. Names are normalized to lowercase, so Ramp and ramp are one company.

The tracked list is what iterate_list sweeps. Removing a company only takes it out of that sweep — you can still look its jobs up directly, and doing so tracks it again.

The database lives at ~/.ashby-mcp/state.db — deliberately outside the plugin directory, so updating or reinstalling the plugin does not discard it. It also holds the default department set by set_department. Delete that file to reset both.

Tracking is best-effort inside list_jobs: if the database cannot be written, the job lookup still returns normally. add_company reports its errors, since recording the company is all it does.

Development

Run the server directly:

uv run ashby-mcp

It speaks MCP over stdio, so nothing may write to stdout except the protocol itself — a stray print() will corrupt the JSON-RPC stream. Use stderr for debugging output.

Available Tools

9 tools
add_companyA

Track a company by name without looking up its jobs yet.

Companies are tracked automatically whenever list_jobs runs; this is for adding one ahead of time. Names are matched case-insensitively.

Args: company: the company's slug from jobs.ashbyhq.com/{slug}

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 adds useful traits: no job lookup occurs, names match case-insensitively, and tracking can be done ahead of time. However, it does not disclose duplicate behavior, persistence effects, or what happens for an invalid or unknown slug.

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?

Three tight sentences plus an Args line with no filler. The main purpose is front-loaded, the timing context follows, and each sentence adds a distinct piece of needed information.

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 one-parameter tool with an output schema, the core purpose, parameter source, and matching behavior are covered, so the definition is largely complete. It falls slightly short by not saying whether duplicate companies are ignored/error and whether the slug must already exist in Ashby.

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

Parameters5/5

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

Schema has 0% description coverage and one generic string parameter, so this description must compensate. It does so by defining company as 'the company's slug from jobs.ashbyhq.com/{slug}', giving the agent an exact format and source. This is decisive for choosing the right value.

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 action and object: 'Track a company by name' and explicitly scopes it as 'without looking up its jobs yet,' which distinguishes it from list_jobs and job-lookup siblings. It names the exact resource and the intent.

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 gives a concrete usage condition: companies are normally tracked automatically when list_jobs runs, but this tool is for adding one ahead of time. This is clear when-to-use guidance, though it does not explicitly list exclusions or point to alternatives like check_company or remove_company.

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

check_companyA

Check whether a company hosts its job board on Ashby.

Answers from whether the board exists, not from whether it has postings, so a company that is on Ashby but has nothing open right now still comes back as a yes with open_jobs of 0. on_ashby is null, never false, when Ashby could not be reached.

Args: company: the company's slug from jobs.ashbyhq.com/{slug}, or its plain name. A name is retried as a few normalized slugs, and the one that resolved comes back as job_board for use with the other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYes

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations present, the description carries the full behavioral burden and does so thoroughly. It discloses three non-obvious behaviors: the answer reflects board existence rather than posting availability (yes with open_jobs of 0), on_ashby is null—never false—when Ashby is unreachable, and plain names are retried as normalized slugs. These edge cases are exactly what an agent needs to interpret results correctly.

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?

Approximately four sentences, front-loaded with the core purpose, followed by two high-value semantic clarifications and a clean Args block. Every sentence earns its place; there is no filler, and the structure makes the behavioral caveats easy to absorb.

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's low complexity (one required parameter, no annotations, no output schema), the description is nearly complete. It documents input formats, the key output fields (on_ashby, open_jobs, job_board), and failure semantics. The only residual gap is that the exact return shape/type is left implicit rather than stated, and explicit sibling selection guidance is absent.

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

Parameters5/5

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

Schema description coverage is 0% and the schema merely types company as a string. The description fully compensates by explaining that the input accepts either a jobs.ashbyhq.com/{slug} slug or a plain name, that names are retried across normalized slugs, and that the resolved slug is surfaced as job_board. This is rich meaning the schema alone would never convey.

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 first sentence states a specific verb and resource: 'Check whether a company hosts its job board on Ashby.' This is immediately distinguishable from the sibling set — it is a presence verification tool, not a job-listing tool (list_jobs, get_job) or a company-management tool (add_company, remove_company).

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

Usage Guidelines3/5

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

Usage context is implied rather than stated. The line 'comes back as job_board for use with the other tools' suggests this is a prerequisite step before chaining other Ashby tools, and the existence-vs-postings clarification tells the caller how to interpret the result. However, there is no explicit when-to-use versus when-not-to-use guidance, alternative routing, or exclusions relative to siblings.

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

get_jobA

Get full details for one specific job posting, including its description.

Args: job_board_name: the company's slug from jobs.ashbyhq.com/{slug} job_id: the job's id, as returned by list_jobs

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
job_board_nameYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. The verb 'Get' implies a read-only retrieval, and the description states that results include the full description. However, it does not explicitly confirm non-mutation, auth requirements, or any rate limiting; for a simple getter this is adequate but minimal.

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 with the primary purpose, followed by a clean two-argument breakdown. Every line provides useful information with no redundancy 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?

For a straightforward read tool with no output schema and no annotations, the description covers the core purpose and parameter semantics well. It does not describe the exact return shape beyond 'full details including its description,' but this is acceptable given the tool's low complexity.

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

Parameters5/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, and it does. It explains job_board_name as the company slug from the URL pattern jobs.ashbyhq.com/{slug} and job_id as returned by list_jobs, adding essential provenance and format details absent from the bare schema titles.

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 ('Get') and resource ('full details for one specific job posting') and explicitly notes the inclusion of the job description. This distinguishes it from sibling tools like list_jobs and get_latest_jobs, which target collections or recent postings.

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 parameter note that job_id is 'the job's id, as returned by list_jobs' establishes a clear workflow: call list_jobs first, then get_job for details. This provides clear context for when to use the tool, though it does not explicitly name alternatives or exclusion conditions.

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

get_latest_jobsA

Get the most recently posted jobs for a company, optionally filtered to one department.

Args: job_board_name: the company's slug from jobs.ashbyhq.com/{slug} department: optional exact department name to filter to, e.g. "Engineering". Leave blank to include all departments. top_k: how many of the most recent postings to return (default 10)

ParametersJSON Schema
NameRequiredDescriptionDefault
top_kNo
departmentNo
job_board_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden. It explains that results are sorted by recency, top_k controls count, and department is an exact filter, but it is silent on return format, error behavior, and whether the company must already exist in the system.

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 a single purpose sentence, followed by a compact Args list. Every sentence contributes either behavioral meaning or parameter semantics; there is no filler.

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

Completeness3/5

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

The tool has an output schema, so return-value documentation is not required, and all parameters are covered. However, it doesn't clarify how this relates to sibling company-management tools (e.g., whether add_company is a prerequisite), nor does it state what happens for invalid slugs or missing departments.

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

Parameters5/5

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

Schema description coverage is 0%, so the parameter explanations in the Args block are essential. Each parameter gets a meaningful explanation beyond the bare schema: the slug format, the 'exact department name' filter, and the default top_k behavior.

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

Purpose4/5

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

The opening sentence names the operation precisely: get the most recently posted jobs for a company, optionally filtered by department. This distinguishes it from siblings like get_job or list_jobs, but it never explicitly contrasts those alternatives.

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

Usage Guidelines3/5

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

The description gives clear context on what the tool does and how to use the optional filters ('Leave blank to include all departments'), but it doesn't say when to prefer this over list_jobs or get_job, nor mention any prerequisites or exclusions.

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

iterate_listA

Check every tracked company and return the jobs posted in the last 24 hours.

Args: keyword: optional text to filter by, matched against job title and department (case-insensitive). Accepts several comma-separated keywords and returns jobs matching any of them. Leave blank to use the department saved by set_department, or pass "all" to include every department. hours: how far back to look (default 24)

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNo
keywordNo

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries full responsibility for behavioral disclosure. It explains keyword matching semantics and the hours window, but omits side effects, what happens when no companies are tracked, behavior with no matches, and potential execution cost of checking every company.

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 a clear one-sentence summary followed by compact, information-dense parameter documentation. Every sentence contributes meaningful detail with no redundancy.

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

Completeness3/5

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

For a two-optional-parameter tool with no output schema or annotations, the description covers the main behavior and parameters. However, it leaves edge cases unspecified (no tracked companies, no saved department, no matches) and does not describe the return format, which is more burden because no output schema exists.

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

Parameters5/5

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

The schema provides only types and defaults with 0% coverage, so the description must compensate. It fully explains keyword semantics: case-insensitive matching against job title/department, comma-separated OR behavior, blank meaning set_department, and 'all' meaning every department. It also clarifies the hours parameter's meaning and default.

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

Purpose4/5

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

The description clearly states the operation: iterate over tracked companies and return jobs posted in the last 24 hours. It is specific and uses a verb+resource pattern, but it does not explicitly differentiate itself from siblings like list_jobs or get_latest_jobs, relying instead on the 'tracked company' and time-window phrasing.

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

Usage Guidelines2/5

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

The description explains how to use parameters (keyword, hours) but never states when to prefer iterate_list over sibling tools, nor does it give exclusions or alternatives. There is no direct guidance on tool selection.

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

list_companiesA

Show every company currently saved in the tracked company list.

These are the boards iterate_list sweeps. A company lands here either from add_company or from any list_jobs lookup.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/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 adds useful context that the list is the target of iterate_list sweeps and is populated by add_company or any list_jobs lookup, revealing the list's provenance and mutability. It does not disclose return format, ordering, or pagination, but for a read-only 0-param listing the core behavior is clear.

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

Conciseness3/5

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

The first sentence is front-loaded and precise. The second sentence adds valuable context but is grammatically awkward ('These are the boards iterate_list sweeps'), which costs it a top conciseness score.

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

Completeness3/5

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

For a simple, zero-parameter, read-only listing tool with no output schema, the description conveys the core behavior and the list's relationship to sibling tools. The main omission is the return value shape (e.g., IDs vs names), which is not specified anywhere and could require inference by the agent.

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 tool has zero parameters and schema coverage is vacuously 100%, so the baseline is 4. The description therefore needs no parameter details and does not add misleading parameter information.

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 first sentence, 'Show every company currently saved in the tracked company list,' uses a specific verb and resource and clearly scopes the result to the tracked-list with no filtering. This distinguishes it from job-focused siblings like list_jobs and mutation tools like add_company/remove_company.

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

Usage Guidelines3/5

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

The description clarifies that this is the board list used by iterate_list and how companies enter it, which implies when to use it (to inspect the tracked working set). However, it never explicitly tells the agent when not to use it or names an alternative for other needs, so guidance is implied rather than explicit.

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

list_jobsA

List open job postings for a company's public Ashby job board, optionally filtered to titles or departments containing a keyword. Also returns the board's current total number of open postings.

Args: job_board_name: the company's slug from jobs.ashbyhq.com/{slug} keyword: optional text to filter by, matched against job title and department (case-insensitive). Accepts several comma-separated keywords and returns jobs matching any of them. Leave blank to use the department saved by set_department, or pass "all" to list the whole board.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordNo
job_board_nameYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral disclosure burden. It does well by explicitly describing case-insensitive matching, comma-separated keyword handling, the 'any keyword' match semantics, the blank-keyword fallback to set_department, and the 'all' escape hatch. It also mentions the returned count. Minor omissions like error behavior or pagination are acceptable given the tool's simplicity.

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 well-structured: two introductory sentences establish the core action and return value, followed by a concise argument list. Every sentence adds meaningful information, and the most important information about what the tool does is front-loaded. No filler or redundant restatement of the tool name.

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 tool with no annotations and no output schema, the description provides solid coverage of its inputs, behavior, and a key return value (total count). It lacks an explicit description of the posting object's shape, but the phrase 'list open job postings' implies a collection of job records, and the sibling set provides enough context for an agent to use the tool correctly. Overall, the description is nearly complete for a simple list operation.

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

Parameters5/5

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

The input schema provides only types and a default, with 0% schema description coverage. The description fully compensates by defining job_board_name as the company's slug from jobs.ashbyhq.com/{slug} and by thoroughly explaining keyword semantics, including filtering target, case-insensitivity, multiple keywords, and special reserved values. This gives an agent everything needed to fill both parameters correctly.

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: 'List open job postings for a company's public Ashby job board.' It also clearly states it returns the total number of open postings, and the keyword filter behavior distinguishes it from sibling tools like get_job or get_latest_jobs. This is unambiguous and not a tautology.

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 explains when to use the tool: for any public Ashby job board, optionally filtered by keyword. It also gives concrete usage guidance for the keyword parameter, including the special values 'blank' and 'all', and references set_department as a way to persist a department filter. It does not explicitly name alternative tools or say when not to use it, but the context strongly implies the intended use.

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

remove_companyB

Remove a company from the tracked company list.

Args: company: the company's slug, matched case-insensitively

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/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 does add one useful behavioral detail: the company slug is matched case-insensitively. However, it does not disclose what happens if the company is not tracked, whether removal is reversible, or what the output or error behavior will be.

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 brief and front-loaded, with no filler. The core action appears first, and the parameter explanation is compact and directly useful.

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

Completeness3/5

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

For a simple one-parameter removal tool, this is minimally adequate. The agent can identify the argument and matching behavior, but the description omits edge-case behavior like removing a non-existent company and any prerequisites for removal, leaving some ambiguity.

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 provides only the string type for 'company,' with 0% schema description coverage. The description compensates by explaining that company is the slug and is matched case-insensitively, adding meaningful semantics beyond the raw schema.

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

Purpose4/5

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

The description states a specific action and resource: 'Remove a company from the tracked company list.' This clearly identifies the tool's function and is distinct from siblings like list_companies or add_company, though it does not explicitly name an alternative.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives like add_company or list_companies. The usage context is only implied by the tool name and the phrase 'tracked company list,' with no exclusions or prerequisites.

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

set_departmentA

Set the default department or keyword used when searching and iterating.

Accepts several comma-separated keywords, e.g. "engineer, ai, software engineer", and a job matching any one of them counts. Each is matched case-insensitively from a word start in a posting's title or department, so broad terms work on boards that have no department by that name: "engineer" finds "Engineering" roles, while "ai" finds "Applied AI" without dragging in "Retail" or "Maintenance".

Args: department: the keyword or comma-separated keywords to save. Pass an empty string to clear it and go back to searching every department.

ParametersJSON Schema
NameRequiredDescriptionDefault
departmentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden, and it delivers: it explains comma-separated keyword matching, case-insensitive word-start matching, OR semantics across keywords, and that an empty string clears the default. It also uses 'save' and 'go back to searching every department' to disclose the persistent state change.

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 core purpose and then expands into matching semantics, examples, and parameter details. Each sentence adds necessary information for correct use, and the structure is easy to scan despite the length.

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?

The description covers purpose, parameter syntax, matching behavior, edge cases, and clearing behavior. Since an output schema is present and the tool has only one simple parameter, nothing essential is missing for an agent to invoke it correctly.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully compensates by explaining the single department parameter in depth: how to pass multiple keywords, how matching works, examples, and the special empty-string clearing behavior. This far exceeds the bare schema definition.

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 action: 'Set the default department or keyword used when searching and iterating.' This clearly identifies the resource (the saved filter) and the verb (set), and the tool is readily distinguishable from sibling tools like list_jobs and get_job.

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 states the tool affects searching and iterating, giving clear context for when it applies. It does not explicitly name alternative tools or conditionally exclude them, but the usage context is strong enough for an agent to infer when to call this setter versus listing or fetching jobs.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv0.1.0
    • First observedadd_company
    • First observedcheck_company
    • First observedget_job
    • First observedget_latest_jobs
    • First observediterate_list
    • First observedlist_companies
    • First observedlist_jobs
    • First observedremove_company
    • First observedset_department

TDQS

A3.9/5.0
Disambiguation3/5

Most tools are distinct, but list_jobs and get_latest_jobs both return sets of jobs from a single board with overlapping filtering capabilities, so an agent could easily pick the wrong one. iterate_list is distinguishable as a cross-company sweep, and get_job/check_company/company management are clear.

Naming Consistency4/5

The dominant verb_noun pattern is consistent: list_jobs, get_job, add_company, remove_company, list_companies, set_department. Minor deviations are get_latest_jobs using 'get' instead of 'list' and iterate_list being a less standard verb, but the overall pattern remains predictable.

Tool Count5/5

Nine tools is well-scoped for a job-board-focused server. Each tool maps to a meaningful operation: single-board lookup, detail retrieval, company checking, tracking management, and cross-company iteration.

Completeness4/5

The server covers the main job-board workflow: check a company, list jobs, get details, track companies, and sweep for recent postings. Minor gaps exist, such as no explicit way to enumerate departments and no update operation for tracked companies, but these are workable limitations rather than dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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
    Not graded
    quality
    A
    maintenance
    Enables job search and scraping across multiple job boards (LinkedIn, Indeed, Glassdoor, etc.) with advanced filtering, directly from Claude Desktop or other MCP clients.
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects your Ashby recruiting data to Claude, enabling natural language queries and management of candidates, applications, jobs, interviews, offers, and team information.
    16
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables searching real job listings from multiple job boards (Indeed, LinkedIn, Glassdoor, Google Jobs, etc.) through a single MCP tool, designed for use as a custom connector in Claude Cowork.
    -

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/Abhinav-Sriharsha/ashby-jobs-mcp'

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