Remote Jobs MCP Server
OfficialYou can fetch remote job listings and retrieve taxonomy filter slugs from Jobicy, all read-only and without authentication.
get_jobs: Retrieve a structured list of up to 100 remote jobs, optionally filtered by location (geo), industry (industry), keyword (tag), and count; returns job details like title, company, description, and publication date.get_taxonomies: Get valid location or industry slugs to use as filters inget_jobs.
Jobicy Remote Jobs MCP
Connect an AI assistant to Jobicy to find public remote jobs, read individual vacancies, discover companies and career roles, and resolve Jobicy filter names. The production MCP service is hosted at https://jobicy.com/mcp. This repository also contains a standalone Node.js MCP server for clients and hosting platforms that run a local process. It uses only public Jobicy API endpoints and does not contain the site's backend.
Connect your MCP client
Streamable HTTP URL: https://jobicy.com/mcp
In an MCP client that accepts a remote server URL, add a server named jobicy and paste that URL. If the client asks for a transport, select Streamable HTTP. No Jobicy account or access token is required for these public, read-only tools.
Clients that use a JSON MCP configuration can use this example:
{
"mcpServers": {
"jobicy": {
"url": "https://jobicy.com/mcp"
}
}
}Older clients that support only SSE can connect to https://jobicy.com/mcp/sse with transport type sse. The client handles the associated /messages route. The MCP discovery document is also available.
After connecting, ask your assistant to list available MCP tools. You should see search_jobs, get_job, and the other tools below.
Related MCP server: jobs-mcp
Run the repository server
Requires Node.js 20 or newer. Install dependencies with pnpm install --frozen-lockfile, then run node server.js. The process speaks MCP over standard input and output; it is intended to be launched by an MCP client or hosting platform. No Jobicy credentials are required. All job, company, role, and taxonomy data comes from the public Jobicy APIs.
A client that supports local MCP commands can use:
{
"mcpServers": {
"jobicy": {
"command": "node",
"args": ["/absolute/path/to/remote-jobs-mcp-server/server.js"]
}
}
}For Glama's Dockerfile configuration, build the repository with pnpm install --frozen-lockfile and start the local process with mcp-proxy -- node server.js. Do not configure mcp-remote or the hosted /mcp URL as the container command: Glama's repository build runs the MCP process from this source. The live Jobicy endpoint remains available independently.
Find jobs
Use search_jobs for most searches. It returns compact vacancies without the full job description. For example, ask your assistant:
Find up to 10 remote backend engineering jobs open to candidates in the UK. Show the title, company, salary if available, and Jobicy link.
An equivalent tool call is:
{
"name": "search_jobs",
"arguments": {
"query": "backend engineer",
"geo": "uk",
"limit": 10
}
}The response contains jobs, jobCount, nextCursor, hasMore, and appliedFilters. jobCount counts only jobs in that response, not all matching jobs. To request another page, pass nextCursor back as cursor with the same filters. Treat the cursor as an opaque value; changing filters invalidates it.
For one vacancy's complete description, call get_job with its numeric id. The geo filter describes candidate eligibility: a country search may also include jobs open to its broader region or to candidates anywhere. Salary and logo fields are included only when public data is available.
Available tools
Tool | When to use it | Inputs |
| Search compact public job results with cursor pagination. | Optional |
| Read one full public vacancy. | Required |
| Find a short list of related vacancies. | Required |
| Find a specific public company or a small relevant set. This is a search, not a company directory. | At least one of |
| Read one public company profile. | Required |
| Find public jobs linked to one company. | Required |
| Read a Jobicy career role guide. | Required |
| Explore roles related to a career role. | Required |
| Turn a location or industry name into a Jobicy filter slug. | Required |
| Browse available public filter slugs and labels. | Required |
If a filter is obvious, call search_jobs directly. When unsure, use resolve_taxonomy: for example, United States resolves to usa, and Developer can resolve to engineering. If a match is uncertain, the tool returns candidates instead of guessing. Location labels in the new tools are shown without display emoji.
Legacy tools
Existing MCP clients can continue to use:
Tool | Inputs | Compatibility |
|
| Keeps the original full jobs feed and JSON in |
|
| Keeps the original JSON in |
New tools provide both structuredContent and readable JSON in content. All tools are read-only. Responses do not provide global job or company totals or Jobicy internal statistics.
Resources
Clients that support MCP Resources can read individual public entities using jobicy://jobs/{id}, jobicy://companies/{id}, and jobicy://roles/{slug}. Public reference lists are available at jobicy://taxonomies/locations and jobicy://taxonomies/industries. Resources supplement the tools; they do not expose an all-jobs or all-companies feed.
Help and security
Open a GitHub issue for connection or documentation problems. Report security concerns privately as described in SECURITY.md.
License
This documentation is available under the MIT License.
Available Tools
12 toolsget_companyARead-only
Get public details of one company by stable ID or slug, including its description, website, categories and headquarters when available.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| company | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds value beyond that by stating the data is 'public' and that fields are returned 'when available', warning the agent about optional/absent fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; purpose and the returned field set are both delivered immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with an output schema already documenting return shape and with safety hints in annotations, the description is nearly complete; only explicit guidance on choosing this over search_companies is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0%, so the description must carry the param burden, and it does: it explains the single 'id' can be a stable ID or a slug, matching the schema's oneOf integer/string union and adding the semantic that the ID is stable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (company) scoped to a single entity looked up by stable ID or slug, and enumerates the returned fields. This implicitly and clearly distinguishes it from the sibling search_companies, which handles multi-entity search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by stable ID or slug' implies a direct-lookup use case versus searching, but there is no explicit when-to-use guidance, no mention of when to prefer search_companies, and no stated prerequisites. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_jobsARead-only
Get compact public jobs for one published company. Cursor is opaque; pass it unchanged with the same companyId.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size, up to 50. | |
| cursor | No | Opaque continuation cursor. | |
| companyId | Yes | Public company ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| hasMore | Yes | |
| jobCount | Yes | Only the count in this response. |
| nextCursor | Yes | |
| appliedFilters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, non-destructive, closed-world profile, so the bar is lower. The description adds real behavioral context beyond them: results are 'compact' (lightweight payloads) and the cursor is opaque and must be passed unchanged with the same companyId, which tells the agent how pagination must be driven.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core purpose front-loaded and the cursor caveat immediately after. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is unnecessary, and annotations cover the safety profile; the description supplies the remaining critical operational detail (cursor reuse with the same companyId). It does not clarify pagination termination or what 'compact' omits, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema's 'Opaque continuation cursor' by specifying it must be passed unchanged and paired with the same companyId. It says nothing extra about limit or companyId, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), resource ('public jobs') and scope ('for one published company'), which clearly separates it from company-level siblings like get_company or search_companies. It does not explicitly distinguish itself from get_jobs, search_jobs, or get_similar_jobs, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'for one published company' implies the required precondition (you need a companyId for a published company), but there is no explicit when-to-use versus search_jobs/get_jobs guidance and no stated exclusions. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobARead-only
Fetch the full public description and details of one visible job by ID. Use after search_jobs when the complete vacancy is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Job ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, non-destructive, and non-open-world, so the description needn't repeat safety. The description adds that it fetches 'public description and details' of a 'visible job', implying access controls, but doesn't specify error cases or rate limits. With annotations covering basics, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, and front-loaded with purpose followed by usage condition. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema present), the description provides all necessary context: what it does, when to use it, and the scope. Annotations cover safety, and output schema handles return values, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single parameter 'id' is fully described. The description doesn't add format or semantics beyond 'by ID', which is redundant with the schema. Baseline 3 is correct when schema is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Fetch') and resource ('full public description and details of one visible job by ID'). It distinguishes from 'search_jobs' (bulk search) and 'get_jobs' (probably listing), allowing an agent to select the correct tool without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool: 'Use after search_jobs when the complete vacancy is needed.' This provides both the trigger (post-search) and the condition (full details required). Sibling tools are indirectly referenced, giving clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobsARead-only
Legacy-compatible public jobs feed. Keeps the original full job objects and JSON array in content.text. Use search_jobs for compact results and more filters. Geo means candidate eligibility: country, parent region, or globally available jobs may match. No authentication.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Public text. | |
| tag | No | Search keyword. | |
| count | No | ||
| search | No | Public text. | |
| keyword | No | Public text. | |
| category | No | Public text. | |
| industry | No | Public text. | |
| location | No | Public text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), yet the description adds genuinely useful behavior: it preserves original full job objects and a JSON array in content.text, and requires no authentication. The geo-eligibility rule (country, parent region, globally available) is non-obvious semantics not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what the tool is, then output format, then the sibling alternative, then the geo caveat. Dense and waste-free, though the telegraphic phrasing ("Geo means candidate eligibility") reads more like notes than polished documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description still adds the legacy content.text layout detail. The main residual gap is behavior around count/pagination and how the several filter parameters interact, which neither the schema nor the description resolves.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so the baseline is 3; the description exceeds it by clarifying that geo means candidate eligibility rather than a plain location filter, which the schema only labels as "Public text." It does not disambiguate the overlapping search/keyword/tag/category/industry parameters, leaving that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource and scope clearly ("Legacy-compatible public jobs feed") and explicitly contrasts itself with search_jobs, so an agent can distinguish it from the sibling that returns compact results. It stops short of a crisp verb+object statement like "retrieve full job objects," but the resource and its legacy nature are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use search_jobs for compact results and more filters" gives an explicit alternative plus the condition that selects it, and "Legacy-compatible" implies this is the choice when old-format payloads are needed. It does not spell out a full when-not-to-use case, but the routing guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roleARead-only
Get a public Jobicy career role guide by its /careers/ slug, including existing overview, skills, responsibilities and levels.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Career role slug. |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered without the description's help. The description adds the useful qualifier that the guide is 'public' (no auth implied), but the enumerated sections largely restate what the output schema already conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with no filler. Every clause either identifies the resource or scopes the input.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full annotation coverage and an output schema, the description is nearly sufficient. The only weakness is that the listed content sections duplicate what the output schema already defines, and no edge case (e.g. invalid or unknown slug) is mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is described as 'Career role slug.', so the baseline would be 3. The description goes slightly further by tying the slug to the '/careers/' URL path, which tells the agent where the identifier originates and what format to expect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('Jobicy career role guide') with the lookup key ('/careers/ slug'), which separates it from sibling tools like get_job, get_company and get_related_roles. It stops short of explicitly naming which sibling to use for adjacent needs, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when you already hold a /careers/ slug, but gives no when-to-use conditions, no prerequisites, and no reference to alternatives such as get_related_roles or get_taxonomies. Guidance is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_similar_jobsARead-only
Recommend a small set of public jobs related to one job. Deterministic score weights shared industry 3, type 2, level 2, location 1, title word 2. Scores are relevance weights, not probabilities.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Source job ID. | |
| limit | No | Maximum recommendations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds real behavioral context beyond them: results are limited to public jobs, ranking is deterministic, and scores are relevance weights rather than probabilities — a distinction that prevents misinterpreting the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the purpose front-loaded and no filler. The weight enumeration is terse and information-dense, though bare numbers ('type 2, level 2') are slightly cryptic without units.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the description covers the ranking semantics that the schema cannot. Only the absence of explicit routing guidance against siblings leaves a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (jobId, limit) are documented in the schema, so the baseline is 3. The description hints at result sizing ('small set') but adds no format or range detail beyond what the schema already supplies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Recommend a small set of public jobs related to one job.' The 'related to one job' scoping and 'public' qualifier distinguish it from get_jobs/search_jobs, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'related to one job' — an agent can infer this is for finding neighbors of a known job — but there is no explicit when-to-use guidance, no mention of when to prefer search_jobs or get_related_roles instead, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taxonomiesARead-only
Legacy-compatible location or industry lookup. Returns the original JSON in content.text. Call when a filter slug is uncertain; obvious values can go directly to search_jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered without the description. The description adds real context by noting it is legacy-compatible and where the payload lands ('original JSON in content.text'), though it omits auth requirements, rate limits and whether the returned set is paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the purpose front-loaded before the usage condition and the return-location detail. Slightly awkward phrasing around 'original JSON in content.text', but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup with an output schema, the core need is met: what it returns, how to get it, and when to call it. The missing piece is disambiguation from resolve_taxonomy/list_taxonomies, which an agent has no way to resolve from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and it is a two-value enum whose values (locations/industries) are fully self-describing. The description reinforces the split by framing the tool as a 'location or industry lookup', so semantic coverage is effectively complete despite 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb-implied resource ('location or industry lookup') and matches the enum values in the schema, so an agent knows exactly what data comes back. It differentiates itself from search_jobs, but says nothing about how it differs from its closest siblings, resolve_taxonomy and list_taxonomies, which is the overlap that matters most.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit when-to-use condition ('when a filter slug is uncertain') paired with a when-not/alternative ('obvious values can go directly to search_jobs'), which is more than most definitions offer. The guidance is undercut by not addressing resolve_taxonomy or list_taxonomies, the siblings an agent is most likely to confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_taxonomiesARead-only
List public filter slugs and labels for locations, industries, job types or job levels. No job or company counts are included.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | Public text. |
| terms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds a genuine scope limitation: no job or company counts are returned. That negative disclosure helps the agent know when this tool is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the core purpose is front-loaded ahead of the exclusion note. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the single enum param plus the count-exclusion note make the tool callable. The one missing piece is routing versus the sibling taxonomy tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the single parameter is a self-documenting enum whose four values the description restates verbatim. Nothing about format, defaults, or combining values is added, so this is baseline adequate rather than helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (public filter slugs and labels) and enumerates the four taxonomies covered. It does not distinguish itself from the sibling get_taxonomies, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives such as get_taxonomies or resolve_taxonomy, which look like close substitutes. Usage is only implied by the word 'filter'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_taxonomyARead-only
Resolve an ordinary location or industry name to a real Jobicy slug. Use when unsure of a slug; low-confidence matches return candidates without selecting one.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| query | Yes | Name, abbreviation or alias. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| type | Yes | Public text. |
| label | Yes | |
| query | Yes | Public text. |
| matchedBy | Yes | Public text. |
| candidates | Yes | |
| confidence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuine behavioral context beyond that: low-confidence matches return candidate slugs without auto-selecting one, which tells the agent to expect an ambiguous/plural result and to make the final choice itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero waste. Purpose is front-loaded and the failure-mode caveat follows immediately, so an agent gets the essentials in the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, yet the description still covers the one return behavior that matters (candidates on low confidence). For a two-parameter read-only resolver, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description only loosely maps to the two parameters ('location or industry name' corresponds to query/type). The schema already enumerates type and describes query as 'Name, abbreviation or alias', so the description adds little syntax or format detail; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Resolve) and resource (location or industry name to a Jobicy slug), so an agent knows exactly what transformation it performs. It doesn't name sibling tools like list_taxonomies or get_taxonomies, so it falls short of explicit sibling differentiation, but the 'when unsure of a slug' framing implicitly separates it from the list/get taxonomy tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when unsure of a slug' gives a clear selection condition that distinguishes it from direct taxonomy lookups. There is no explicit 'when not to use' or named alternative, but for a simple resolution helper the trigger condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesARead-only
Find specific public companies by name, company industry, or headquarters text. A search criterion is required. Returns at most 10 companies, with no cursor or overall count; this is not a company directory export.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Headquarters text, at least 3 characters. | |
| limit | No | Maximum 10 companies. | |
| query | No | Company name search, at least 3 characters. | |
| industry | No | Company category slug. |
Output Schema
| Name | Required | Description |
|---|---|---|
| companies | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: a hard cap of 10 results and the absence of a cursor or overall count, which tells the agent this cannot be paginated or used for counting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, then the required-criterion constraint, then the result limitation. Nothing is padded, though the result-cap sentence partially overlaps with the output schema and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is not needed, and the description covers scope, the result cap, and the absence of pagination. Its one weak spot is the mismatch with the schema's empty required list, which could lead an agent to call it with no criteria at all.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, making the baseline 3 appropriate. The description restates the three search facets but adds no syntax, matching, or slug-format guidance beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (find public companies) and enumerates the three searchable facets (name, industry, headquarters text), which matches the query/industry/geo parameters. It implicitly separates this search tool from the sibling get_company/get_company_jobs lookups, but never names them, so differentiation relies on the reader's inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"A search criterion is required" tells the agent a precondition, and "this is not a company directory export" rules out a bulk-enumeration use case. However, it never says when to prefer this over get_company or get_taxonomies, and the claim that a criterion is required conflicts with the schema's empty required list, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsARead-only
Search public remote jobs with compact results, without full descriptions. Geo uses candidate eligibility, including eligible parent regions and global jobs. Call directly when filters are clear; use resolve_taxonomy for uncertain slugs. Cursor is opaque: pass nextCursor unchanged with identical filters. jobCount counts this page only.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Location slug. | |
| limit | No | Page size, up to 50. | |
| query | No | Search terms, at least 3 characters. | |
| cursor | No | Opaque continuation cursor. | |
| company | No | Public company ID. | |
| jobType | No | Employment type slug. | |
| currency | No | ISO 4217 currency. | |
| industry | No | Job industry slug. | |
| jobLevel | No | Level slug. | |
| salaryMax | No | Maximum salary; match jobs with salaryMin at most this. | |
| salaryMin | No | Minimum salary; match jobs with salaryMax at least this. | |
| postedAfter | No | UTC date YYYY-MM-DD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| hasMore | Yes | |
| jobCount | Yes | Only the count in this response. |
| nextCursor | Yes | |
| appliedFilters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so the safety profile is covered. The description adds non-obvious behavioral context: geo resolves via candidate eligibility including parent regions and global jobs, cursors are opaque, and jobCount counts only the current page. This is meaningful disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short, front-loaded sentences, each carrying distinct information (scope, geo semantics, routing, cursor rule, page counting) with no filler or repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the tricky parts an agent must know: geo eligibility semantics, cursor handling, routing to resolve_taxonomy, and page-scoped jobCount. Nothing essential is missing for a 12-param search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: geo is not a plain slug match but an eligibility model (parent regions, global jobs), and cursor must be passed unchanged with identical filters. These additions lift it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb+resource ('Search public remote jobs') and adds a distinguishing scope note ('compact results, without full descriptions'), which signals it differs from a full-detail fetch. It does not explicitly name the closest sibling (get_jobs), so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit routing rule: 'Call directly when filters are clear; use resolve_taxonomy for uncertain slugs,' naming the alternative and the condition that selects it. It also supplies pagination usage guidance ('pass nextCursor unchanged with identical filters'), leaving little to inference.
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.
12 tool updates
v2.0.0- Added
get_company - Added
get_company_jobs - Added
get_job - Changed
get_jobs12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / categoryAdded value: +{ + "description": "Public text.", + "type": "string" +} - removed
Input schema / properties / count / descriptionRemoved value: -"Number of jobs to return, from 1 to 100. Default is 100." - changed
Input schema / properties / count / maximumPrevious value: -100New value: +200 - changed
Input schema / properties / geo / descriptionPrevious value: -"Location slug. Run get_taxonomies with type='locations' first to discover valid slugs."New value: +"Public text." - changed
Input schema / properties / industry / descriptionPrevious value: -"Industry slug. Run get_taxonomies with type='industries' first to discover valid slugs."New value: +"Public text." - added
Input schema / properties / keywordAdded value: +{ + "description": "Public text.", + "type": "string" +} - added
Input schema / properties / locationAdded value: +{ + "description": "Public text.", + "type": "string" +} - added
Input schema / properties / searchAdded value: +{ + "description": "Public text.", + "type": "string" +} - changed
Input schema / properties / tag / descriptionPrevious value: -"Search keyword, from 3 to 50 characters."New value: +"Search keyword." - added
Input schema / requiredAdded value: +[] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "jobs": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Added
get_related_roles - Added
get_role - Added
get_similar_jobs - Changed
get_taxonomies3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / type / descriptionRemoved value: -"Taxonomy type to fetch." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "type": "object" +}
- Added
list_taxonomies - Added
resolve_taxonomy - Added
search_companies - Added
search_jobs
2 tool updates
v0.1.5- Changed
get_jobs2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_taxonomies2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Input schema / additionalPropertiesRemoved value: -false
2 tool updates
v0.1.4- Changed
get_jobs6 fields changed- changed
Input schema / properties / count / descriptionPrevious value: -"Number of jobs to return (default 100)"New value: +"Number of jobs to return, from 1 to 100. Default is 100." - changed
Input schema / properties / geo / descriptionPrevious value: -"Location slug (e.g., 'europe', 'usa', 'uk')"New value: +"Location slug. Run get_taxonomies with type='locations' first to discover valid slugs." - changed
Input schema / properties / industry / descriptionPrevious value: -"Industry slug (e.g., 'dev', 'marketing')"New value: +"Industry slug. Run get_taxonomies with type='industries' first to discover valid slugs." - changed
Input schema / properties / tag / descriptionPrevious value: -"Search keyword (3-50 chars)"New value: +"Search keyword, from 3 to 50 characters." - added
Input schema / properties / tag / maxLengthAdded value: +50 - added
Input schema / properties / tag / minLengthAdded value: +3
- Changed
get_taxonomies1 field changed- added
Input schema / properties / type / descriptionAdded value: +"Taxonomy type to fetch."
2 tool updates
v0.1.0- First observed
get_jobs - First observed
get_taxonomies
TDQS
Scored across 12 tools
Most tools target distinct resources and actions, and descriptions explicitly differentiate the legacy tools (get_jobs, get_taxonomies) from their modern counterparts (search_jobs, list_taxonomies). The taxonomy trio (get_taxonomies, list_taxonomies, resolve_taxonomy) and the two job-search tools still require reading the descriptions to distinguish, but the guidance is clear.
All twelve tools follow a consistent verb_noun (or verb_noun_noun) snake_case pattern: get_job, search_jobs, list_taxonomies, resolve_taxonomy, get_company_jobs, etc. No mixed conventions or vague verbs.
Twelve tools is well within the ideal 3-15 range and each maps to a distinct facet of the domain (jobs, companies, roles, taxonomies). No tool feels redundant enough to be padding, aside from the intentional legacy-compatible pair.
The read-only surface covers jobs (search, detail, similar), companies (search, detail, jobs), roles (guide, related), and taxonomy resolution/lookup, giving solid lifecycle coverage for a public jobs API. Minor gap: no bulk/aggregate or saved-search style operations, but these are reasonable omissions for a read-only public feed.
Maintenance
Related MCP Connectors
Public MCP server for discovering open jobs. Search, filter, and get application links.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Search live startup jobs from Claude, Cursor, or ChatGPT via MCP. Free, no account needed.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceRemote jobs MCP server — search 100,000+ remote jobs, post listings, find candidates, and check salary benchmarks from Claude, ChatGPT, Cursor, and any MCP client. Free, no API key required.21MIT
- FlicenseNot gradedqualityDmaintenanceEnables searching for job opportunities across multiple platforms like Upwork, RemoteOK, and GitHub while automatically generating tailored application proposals based on keyword scoring. It includes tools for scanning all sources simultaneously and managing a professional profile for quick reference during applications.1-
- FlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI agents to search, analyze, and apply for Upwork jobs autonomously. It facilitates specialized job scoring, proposal submission, and integrated client messaging through a combination of browser automation and API access.1112-
- AlicenseBqualityBmaintenanceA fast, secure, and LLM-friendly Model Context Protocol (MCP) server that scrapes job listings from major platforms (LinkedIn, Indeed, Google) and converts them into structured Markdown format.11MIT