CuratorSearch

Live museum and curatorial job listings from institutions' own careers pages, plus a salary archive.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
80%
Naming quality
90%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,596Tokens (tool definitions)
~4.3 KBTypical response size
Moderate attention impact (1.25% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "jobs": {
      "url": "https://curatorsearch.com/mcp"
    }
  }
}

Remote endpoints

https://curatorsearch.com/mcpstreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search_jobs(query, category, region, limit)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Free text matched against title, institution and location, e.g. 'registrar London'. Omit to browse everything."
    },
    "category": {
      "type": "string",
      "enum": [
        "Leadership",
        "Curatorial",
        "Education & Public Programmes",
        "Archives",
        "Collections",
        "Conservation",
        "Intern & Fellowship",
        "Open Call & Residency",
        "Production",
        "Other"
      ],
      "description": "Restrict to one field of work."
    },
    "region": {
      "type": "string",
      "enum": [
        "North America",
        "UK & Ireland",
        "Europe",
        "Asia-Pacific",
        "Middle East",
        "Latin America",
        "Africa",
        "International"
      ],
      "description": "Restrict to one world region."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 20,
      "description": "How many roles to return, 1 to 20. Defaults to 10."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "total": {
      "type": "integer",
      "description": "How many live roles match, which may exceed the number returned."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Job title as advertised."
          },
          "institution": {
            "type": "string",
            "description": "Museum, gallery or organisation advertising the role."
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "City and country as stated, or null if the posting gives none."
          },
          "category": {
            "type": "string",
            "description": "CuratorSearch field, one of the category values."
          },
          "region": {
            "type": "string",
            "description": "CuratorSearch world region."
          },
          "salary": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pay exactly as the posting states it, or null -- most postings state none."
          },
          "deadline": {
            "type": [
              "string",
              "null"
            ],
            "description": "Application deadline as an ISO date, or null if none is given."
          },
          "posted": {
            "type": "string",
            "description": "ISO date the role was first seen on the board."
          },
          "url": {
            "type": "string",
            "description": "The role's permanent page on curatorsearch.com."
          }
        },
        "required": [
          "title",
          "institution",
          "category",
          "region",
          "posted",
          "url"
        ]
      },
      "description": "The matching roles, newest first."
    },
    "attribution": {
      "type": "string",
      "description": "Source credit to quote when citing these results."
    }
  },
  "required": [
    "total",
    "results"
  ]
}
🟢get_job(slug)

One listing in full: description, stated salary, deadline, and the institution's original posting URL. Takes the slug from a curatorsearch.com/opportunities/<slug> URL.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "The listing's slug, or the whole curatorsearch.com/opportunities/<slug> URL -- either is accepted."
    }
  },
  "required": [
    "slug"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Job title as advertised."
    },
    "institution": {
      "type": "string",
      "description": "Museum, gallery or organisation advertising the role."
    },
    "location": {
      "type": [
        "string",
        "null"
      ],
      "description": "City and country as stated, or null if the posting gives none."
    },
    "category": {
      "type": "string",
      "description": "CuratorSearch field, one of the category values."
    },
    "region": {
      "type": "string",
      "description": "CuratorSearch world region."
    },
    "salary": {
      "type": [
        "string",
        "null"
      ],
      "description": "Pay exactly as the posting states it, or null -- most postings state none."
    },
    "deadline": {
      "type": [
        "string",
        "null"
      ],
      "description": "Application deadline as an ISO date, or null if none is given."
    },
    "posted": {
      "type": "string",
      "description": "ISO date the role was first seen on the board."
    },
    "url": {
      "type": "string",
      "description": "The role's permanent page on curatorsearch.com."
    },
    "status": {
      "type": "string",
      "description": "'live' while the role is open; anything else means the institution has taken it down."
    },
    "description": {
      "type": [
        "string",
        "null"
      ],
      "description": "The posting's own text, or null if the source gave none."
    },
    "source": {
      "type": "string",
      "description": "The institution's original posting, where applications are made."
    }
  },
  "required": [
    "title",
    "institution",
    "category",
    "region",
    "posted",
    "url",
    "status",
    "source"
  ]
}
🟢institution_jobs(institution)

Every role one museum or gallery currently has open on the board, by institution name.

Input Schema

{
  "type": "object",
  "properties": {
    "institution": {
      "type": "string",
      "description": "The institution's name, e.g. 'Philadelphia Museum of Art'. Near-misses resolve; if nothing matches, the reply says so."
    }
  },
  "required": [
    "institution"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "institution": {
      "type": "string",
      "description": "The institution as the board names it."
    },
    "page": {
      "type": "string",
      "description": "That institution's page on curatorsearch.com."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Job title as advertised."
          },
          "institution": {
            "type": "string",
            "description": "Museum, gallery or organisation advertising the role."
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "City and country as stated, or null if the posting gives none."
          },
          "category": {
            "type": "string",
            "description": "CuratorSearch field, one of the category values."
          },
          "region": {
            "type": "string",
            "description": "CuratorSearch world region."
          },
          "salary": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pay exactly as the posting states it, or null -- most postings state none."
          },
          "deadline": {
            "type": [
              "string",
              "null"
            ],
            "description": "Application deadline as an ISO date, or null if none is given."
          },
          "posted": {
            "type": "string",
            "description": "ISO date the role was first seen on the board."
          },
          "url": {
            "type": "string",
            "description": "The role's permanent page on curatorsearch.com."
          }
        },
        "required": [
          "title",
          "institution",
          "category",
          "region",
          "posted",
          "url"
        ]
      },
      "description": "Its open roles, newest first."
    },
    "note": {
      "type": "string",
      "description": "Present only when no institution of that name is on the board."
    }
  },
  "required": [
    "institution",
    "results"
  ]
}
🟢salary_transparency

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.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "liveListings": {
      "type": "integer",
      "description": "Live roles on the board at the moment of the call."
    },
    "percentStatingSalary": {
      "type": "number",
      "description": "Percentage of those postings that state any pay at all."
    },
    "medianAdvertisedEurPerYear": {
      "type": "integer",
      "description": "Median stated figure among those that do, annualised into euro."
    },
    "asOf": {
      "type": "string",
      "description": "ISO date the figures were computed."
    },
    "citation": {
      "type": "string",
      "description": "How to cite these figures."
    },
    "note": {
      "type": "string",
      "description": "Present only when there is no salary data yet."
    }
  }
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools