CuratorSearch
Server Details
Live museum and curatorial job listings from institutions' own careers pages, plus a salary archive.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: get_job retrieves a single listing by slug, institution_jobs lists all roles at a given institution, salary_transparency provides aggregate pay statistics, and search_jobs performs keyword-based searching. There is no overlap or ambiguity between these operations.
Tool names mix conventions: get_job and search_jobs follow a verb_noun pattern, while institution_jobs and salary_transparency are noun phrases. The inconsistency is noticeable but all names are still readable and descriptive, making this a moderate deviation rather than chaotic naming.
With only 4 tools, the server is tightly scoped to its purpose of searching and retrieving curatorial job listings. This is well within the ideal 3-15 range and each tool serves a necessary function without redundancy.
The server covers the core workflows: searching listings, viewing full details, drilling down by institution, and accessing salary transparency metrics. Minor gaps exist, such as no explicit pagination or filtering options beyond the default search behavior, but the surface is complete for a read-only job board.
Available Tools
4 toolsget_jobARead-onlyIdempotentInspect
One listing in full: description, stated salary, deadline, and the institution's original posting URL. Takes the slug from a curatorsearch.com/opportunities/ URL.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The listing's slug, or the whole curatorsearch.com/opportunities/<slug> URL -- either is accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The role's permanent page on curatorsearch.com. |
| title | Yes | Job title as advertised. |
| posted | Yes | ISO date the role was first seen on the board. |
| region | Yes | CuratorSearch world region. |
| salary | No | Pay exactly as the posting states it, or null -- most postings state none. |
| source | Yes | The institution's original posting, where applications are made. |
| status | Yes | 'live' while the role is open; anything else means the institution has taken it down. |
| category | Yes | CuratorSearch field, one of the category values. |
| deadline | No | Application deadline as an ISO date, or null if none is given. |
| location | No | City and country as stated, or null if the posting gives none. |
| description | No | The posting's own text, or null if the source gave none. |
| institution | Yes | Museum, gallery or organisation advertising the role. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful context beyond annotations by specifying what 'full' means: description, salary, deadline, and original posting URL. No contradictions with 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?
Two sentences, no filler, with the core purpose and input format front-loaded. Every sentence contributes meaningful guidance.
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-only tool with an output schema and rich annotations, this description is complete. An agent knows what to pass, what will be returned, and that the operation is safe and idempotent.
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%, and the input schema already documents that slug can be a slug or a full URL. The description reinforces that by mentioning the curatorsearch.com/opportunities/<slug> URL format, but it does not add meaning beyond the schema.
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?
Description states a specific action: get one full listing, enumerating the fields returned (description, salary, deadline, original posting URL). It clearly distinguishes itself from broader search/list tools by emphasizing 'One listing in full' and the slug-based identifier.
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?
Clear context is provided: use this tool when you have a specific slug or curatorsearch.com/opportunities/<slug> URL and need the full listing details. It does not explicitly name alternatives or exclusion criteria, but the use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
institution_jobsARead-onlyIdempotentInspect
Every role one museum or gallery currently has open on the board, by institution name.
| Name | Required | Description | Default |
|---|---|---|---|
| institution | Yes | The institution's name, e.g. 'Philadelphia Museum of Art'. Near-misses resolve; if nothing matches, the reply says so. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present only when no institution of that name is on the board. |
| page | No | That institution's page on curatorsearch.com. |
| results | Yes | Its open roles, newest first. |
| institution | Yes | The institution as the board names it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds modest context by emphasizing 'currently has open' and 'on the board,' but it doesn't reveal any deeper behavior such as freshness, ordering, or limits.
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?
The description is a single, compact sentence with no filler or repeated annotation content. The phrasing is slightly awkward ('Every role... has open') but the length and front-loading of the core idea are appropriate.
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-only tool with a full input schema and an output schema, the description plus structured data covers what an agent needs to call it. It stops short of a 5 because it doesn't explicitly mention when to use this over search_jobs, which would make it fully self-contained.
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%, and the institution parameter already includes near-miss resolution and failure behavior. The description adds only the general notion of 'by institution name,' which provides no new meaning beyond the schema.
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 the specific resource (open roles for one museum or gallery) and the key dimension (institution name), making its purpose clear. It lacks an explicit operative verb like 'list' or 'get', and it doesn't explicitly contrast itself with siblings like search_jobs, so it doesn't fully distinguish itself.
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 institution name' implies this tool is for a specific institution's open roles, giving a clear usage context. However, it never explicitly says when to prefer this over search_jobs, get_job, or salary_transparency, nor does it state any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
salary_transparencyARead-onlyIdempotentInspect
How many live museum and curatorial postings state a salary, and the median advertised figure among those that do -- the CuratorSearch Curatorial Pay Archive headline number, computed live.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | No | ISO date the figures were computed. |
| note | No | Present only when there is no salary data yet. |
| citation | No | How to cite these figures. |
| liveListings | No | Live roles on the board at the moment of the call. |
| percentStatingSalary | No | Percentage of those postings that state any pay at all. |
| medianAdvertisedEurPerYear | No | Median stated figure among those that do, annualised into euro. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description adds that the number is 'computed live' and that the median is only among postings 'that do' state a salary, clarifying the denominator. It does not contradict annotations. This gives useful behavioral context for a zero-parameter aggregate tool, though it stops short of describing refresh rates or data source caveats.
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?
The entire description is a single, front-loaded sentence that states the metric, scope, and live nature without any filler. The appended brand phrase 'CuratorSearch Curatorial Pay Archive' is brief and doesn't hurt.
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?
The tool has zero parameters, rich annotations, and an output schema, so the description does not need to detail return types. It fully captures what is calculated and the population it covers. No important calling-context information 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?
There are no parameters, and the schema coverage is trivially 100%; the baseline for zero-parameter tools is 4. The description therefore doesn't need to elaborate on parameter meanings.
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 exactly what the tool reports: the number of live museum/curatorial postings with a stated salary and the median advertised figure among those that do. It identifies the resource ('museum and curatorial postings') and distinguishes it from sibling tools like get_job or search_jobs by offering an aggregate statistic rather than job-level data. Though it lacks an explicit imperative verb, 'computed live' makes the operation clear.
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 for pay-transparency aggregate statistics, but it never explicitly says when to use this tool instead of get_job, institution_jobs, or search_jobs. There are no exclusions or alternative routing cues. The context of 'headline number' is clear enough but the comparison is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsARead-onlyIdempotentInspect
Search live museum, gallery and curatorial job listings, gathered daily from institutions' own career pages. Returns up to 20 roles, newest first, each with its curatorsearch.com page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many roles to return, 1 to 20. Defaults to 10. | |
| query | No | Free text matched against title, institution and location, e.g. 'registrar London'. Omit to browse everything. | |
| region | No | Restrict to one world region. | |
| category | No | Restrict to one field of work. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | How many live roles match, which may exceed the number returned. |
| results | Yes | The matching roles, newest first. |
| attribution | No | Source credit to quote when citing these results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond annotations: it states the freshness ('live', 'gathered daily'), the result cap ('up to 20 roles'), the ordering ('newest first'), and the output format ('each with its curatorsearch.com page'). These details are not in the annotations (readOnlyHint, openWorldHint, etc.) and help an agent anticipate result characteristics, though it does not cover edge cases like empty results.
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?
The description is exactly two sentences, with the primary verb and purpose front-loaded. The first sentence states what it searches and the data source; the second states key output behaviors. There is no redundancy or filler - every clause contributes to understanding the tool.
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 read-only search tool with all-optional parameters, an output schema, and annotations covering safety, the description is quite complete: it explains the data source, result cap, ordering, and output format. The only minor gaps are edge-case behavior (e.g., no matches) and explicit routing to siblings, but these are not critical given the sibling names and schema.
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% (all four parameters - limit, query, region, category - have descriptive text and enums). The description itself adds no parameter-specific meaning, so the baseline of 3 is appropriate per the rubric; the schema carries the full semantic weight for parameters.
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 uses a specific verb ('Search') and a concrete resource ('live museum, gallery and curatorial job listings') with a clear data source ('gathered daily from institutions' own career pages'). It distinguishes itself from siblings like get_job (which likely fetches a single job) and institution_jobs (which likely filters by institution) by describing a broad aggregated search across multiple institutions and job types.
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 this tool is for searching/browsing job listings broadly, but it gives no explicit guidance about when to prefer it over alternatives. It does not mention siblings or state exclusionary conditions (e.g., 'use get_job for a specific role ID'), so an agent must infer usage from the general purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
search_jobs1 field changed- changed
Input schema / properties / category / enumPrevious value: -[ - "Leadership", - "Curatorial", - "Education & Public Programmes", - "Archives", - "Collections", - "Conservation", - "Intern & Fellowship", - "Production", - "Other" -]New value: +[ + "Leadership", + "Curatorial", + "Education & Public Programmes", + "Archives", + "Collections", + "Conservation", + "Intern & Fellowship", + "Open Call & Residency", + "Production", + "Other" +]
4 tool updates
- Changed
get_job2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"The listing's slug, or the whole curatorsearch.com/opportunities/<slug> URL -- either is accepted." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "category": { + "description": "CuratorSearch field, one of the category values.", + "type": "string" + }, + "deadline": { + "description": "Application deadline as an ISO date, or null if none is given.", + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "The posting's own text, or null if the source gave none.", + "type": [ + "string", + "null" + ] + }, + "institution": { + "description": "Museum, gallery or organisation advertising the role.", + "type": "string" + }, + "location": { + "description": "City and country as stated, or null if the posting gives none.", + "type": [ + "string", + "null" + ] + }, + "posted": { + "description": "ISO date the role was first seen on the board.", + "type": "string" + }, + "region": { + "description": "CuratorSearch world region.", + "type": "string" + }, + "salary": { + "description": "Pay exactly as the posting states it, or null -- most postings state none.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "The institution's original posting, where applications are made.", + "type": "string" + }, + "status": { + "description": "'live' while the role is open; anything else means the institution has taken it down.", + "type": "string" + }, + "title": { + "description": "Job title as advertised.", + "type": "string" + }, + "url": { + "description": "The role's permanent page on curatorsearch.com.", + "type": "string" + } + }, + "required": [ + "title", + "institution", + "category", + "region", + "posted", + "url", + "status", + "source" + ], + "type": "object" +}
- Changed
institution_jobs2 fields changed- added
Input schema / properties / institution / descriptionAdded value: +"The institution's name, e.g. 'Philadelphia Museum of Art'. Near-misses resolve; if nothing matches, the reply says so." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "institution": { + "description": "The institution as the board names it.", + "type": "string" + }, + "note": { + "description": "Present only when no institution of that name is on the board.", + "type": "string" + }, + "page": { + "description": "That institution's page on curatorsearch.com.", + "type": "string" + }, + "results": { + "description": "Its open roles, newest first.", + "items": { + "properties": { + "category": { + "description": "CuratorSearch field, one of the category values.", + "type": "string" + }, + "deadline": { + "description": "Application deadline as an ISO date, or null if none is given.", + "type": [ + "string", + "null" + ] + }, + "institution": { + "description": "Museum, gallery or organisation advertising the role.", + "type": "string" + }, + "location": { + "description": "City and country as stated, or null if the posting gives none.", + "type": [ + "string", + "null" + ] + }, + "posted": { + "description": "ISO date the role was first seen on the board.", + "type": "string" + }, + "region": { + "description": "CuratorSearch world region.", + "type": "string" + }, + "salary": { + "description": "Pay exactly as the posting states it, or null -- most postings state none.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Job title as advertised.", + "type": "string" + }, + "url": { + "description": "The role's permanent page on curatorsearch.com.", + "type": "string" + } + }, + "required": [ + "title", + "institution", + "category", + "region", + "posted", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "institution", + "results" + ], + "type": "object" +}
- Changed
salary_transparency1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "asOf": { + "description": "ISO date the figures were computed.", + "type": "string" + }, + "citation": { + "description": "How to cite these figures.", + "type": "string" + }, + "liveListings": { + "description": "Live roles on the board at the moment of the call.", + "type": "integer" + }, + "medianAdvertisedEurPerYear": { + "description": "Median stated figure among those that do, annualised into euro.", + "type": "integer" + }, + "note": { + "description": "Present only when there is no salary data yet.", + "type": "string" + }, + "percentStatingSalary": { + "description": "Percentage of those postings that state any pay at all.", + "type": "number" + } + }, + "type": "object" +}
- Changed
search_jobs5 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Restrict to one field of work." - added
Input schema / properties / limit / descriptionAdded value: +"How many roles to return, 1 to 20. Defaults to 10." - changed
Input schema / properties / query / descriptionPrevious value: -"Free text matched against title, institution and location, e.g. 'registrar London'."New value: +"Free text matched against title, institution and location, e.g. 'registrar London'. Omit to browse everything." - added
Input schema / properties / region / descriptionAdded value: +"Restrict to one world region." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "attribution": { + "description": "Source credit to quote when citing these results.", + "type": "string" + }, + "results": { + "description": "The matching roles, newest first.", + "items": { + "properties": { + "category": { + "description": "CuratorSearch field, one of the category values.", + "type": "string" + }, + "deadline": { + "description": "Application deadline as an ISO date, or null if none is given.", + "type": [ + "string", + "null" + ] + }, + "institution": { + "description": "Museum, gallery or organisation advertising the role.", + "type": "string" + }, + "location": { + "description": "City and country as stated, or null if the posting gives none.", + "type": [ + "string", + "null" + ] + }, + "posted": { + "description": "ISO date the role was first seen on the board.", + "type": "string" + }, + "region": { + "description": "CuratorSearch world region.", + "type": "string" + }, + "salary": { + "description": "Pay exactly as the posting states it, or null -- most postings state none.", + "type": [ + "string", + "null" + ] + }, + "title": { + "description": "Job title as advertised.", + "type": "string" + }, + "url": { + "description": "The role's permanent page on curatorsearch.com.", + "type": "string" + } + }, + "required": [ + "title", + "institution", + "category", + "region", + "posted", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "How many live roles match, which may exceed the number returned.", + "type": "integer" + } + }, + "required": [ + "total", + "results" + ], + "type": "object" +}
4 tool updates
- First observed
get_job - First observed
institution_jobs - First observed
salary_transparency - First observed
search_jobs
Related MCP Connectors
Live jobs from Greenhouse, Lever, Ashby, Workable, Recruitee and Teamtailor, with normalised salary.
Live job listings from 20 ATS platforms plus SEEK, JobStreet, JobsDB, jobs.ch and The Muse
Search jobs on verified employer job boards. Every link is the employer's own posting.
Live jobs from employer career pages. Read-only. Hit Apply on theyond.com. You land on the employer.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables searching live job postings, aggregating labour-market slices, and reporting how long listings have been open, with filters for titles, location, salary, and more.443 npmMIT
- AlicenseAqualityAmaintenanceLive tech-hiring intelligence for AI agents. Search 130K+ open jobs collected daily from ~500 tech companies' own career sites â plus company hiring profiles, tech stacks, salary benchmarks, and skill trends. Five tools work with no account.3193 npmMIT
- AlicenseAqualityBmaintenanceEnables querying open job postings directly from company applicant-tracking systems (Greenhouse, Ashby, Lever), finding a company's job board, listing and comparing roles, and accessing salary data, all without scraping or API keys.334 PyPIMIT
- FlicenseNot gradedqualityDmaintenanceEnables querying real disclosed salary data across 20 regions, with tools to search jobs, retrieve salary statistics, and find similar roles.-
Glama MCP Gateway
Add one secure layer between your agents and this server.