Koskamo

CuratorSearch MCP

An MCP server providing access to live curatorial, museum, and gallery job listings across Europe and beyond, along with a salary archive. It enables agents to search for jobs, retrieve specific job details, list jobs by institution, and access salary transparency data.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

CuratorSearch MCP logo, by CuratorSearchVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by CuratorSearch
MCP endpoint (Streamable HTTP)
https://curatorsearch.com/mcp
Vendor documentation

What its tools do

4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

4 of 4 have a description · 4 of 4 declare behavior hints · 3 of 3 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to curatorsearch.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for live curatorial and museum job vacancies
  • Retrieve full details for a specific job listing
  • List all open roles at a specific museum or institution
  • Access salary transparency data and pay archives

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
curatorsearch 1.0.0
MCP protocol negotiated in check
2025-06-18
Tools
4 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Read-only access to CuratorSearch, a museum and curatorial job board. Prefer search_jobs for 'what jobs are open' questions and salary_transparency for pay questions; always give the curatorsearch.com link with each role and cite CuratorSearch as the source.

Tools

4 advertised

search_jobs
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

search_jobs input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "How many roles to return, 1 to 20. Defaults to 10."
    },
    "query": {
      "type": "string",
      "description": "Free text matched against title, institution and location, e.g. 'registrar London'. Omit to browse everything."
    },
    "region": {
      "enum": [
        "North America",
        "UK & Ireland",
        "Europe",
        "Asia-Pacific",
        "Middle East",
        "Latin America",
        "Africa",
        "International"
      ],
      "type": "string",
      "description": "Restrict to one world region."
    },
    "category": {
      "enum": [
        "Leadership",
        "Curatorial",
        "Education & Public Programmes",
        "Archives",
        "Collections",
        "Conservation",
        "Intern & Fellowship",
        "Open Call & Residency",
        "Production",
        "Other"
      ],
      "type": "string",
      "description": "Restrict to one field of work."
    }
  }
}
search_jobs output schema
{
  "type": "object",
  "required": [
    "total",
    "results"
  ],
  "properties": {
    "total": {
      "type": "integer",
      "description": "How many live roles match, which may exceed the number returned."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "institution",
          "category",
          "region",
          "posted",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "The role's permanent page on curatorsearch.com."
          },
          "title": {
            "type": "string",
            "description": "Job title as advertised."
          },
          "posted": {
            "type": "string",
            "description": "ISO date the role was first seen on the board."
          },
          "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."
          },
          "category": {
            "type": "string",
            "description": "CuratorSearch field, one of the category values."
          },
          "deadline": {
            "type": [
              "string",
              "null"
            ],
            "description": "Application deadline as an ISO date, or null if none is given."
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "City and country as stated, or null if the posting gives none."
          },
          "institution": {
            "type": "string",
            "description": "Museum, gallery or organisation advertising the role."
          }
        }
      },
      "description": "The matching roles, newest first."
    },
    "attribution": {
      "type": "string",
      "description": "Source credit to quote when citing these results."
    }
  }
}
search_jobs annotations
{
  "title": "Search museum jobs",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_job
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

get_job input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "description": "The listing's slug, or the whole curatorsearch.com/opportunities/<slug> URL -- either is accepted."
    }
  }
}
get_job output schema
{
  "type": "object",
  "required": [
    "title",
    "institution",
    "category",
    "region",
    "posted",
    "url",
    "status",
    "source"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "The role's permanent page on curatorsearch.com."
    },
    "title": {
      "type": "string",
      "description": "Job title as advertised."
    },
    "posted": {
      "type": "string",
      "description": "ISO date the role was first seen on the board."
    },
    "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."
    },
    "source": {
      "type": "string",
      "description": "The institution's original posting, where applications are made."
    },
    "status": {
      "type": "string",
      "description": "'live' while the role is open; anything else means the institution has taken it down."
    },
    "category": {
      "type": "string",
      "description": "CuratorSearch field, one of the category values."
    },
    "deadline": {
      "type": [
        "string",
        "null"
      ],
      "description": "Application deadline as an ISO date, or null if none is given."
    },
    "location": {
      "type": [
        "string",
        "null"
      ],
      "description": "City and country as stated, or null if the posting gives none."
    },
    "description": {
      "type": [
        "string",
        "null"
      ],
      "description": "The posting's own text, or null if the source gave none."
    },
    "institution": {
      "type": "string",
      "description": "Museum, gallery or organisation advertising the role."
    }
  }
}
get_job annotations
{
  "title": "Get one listing",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
institution_jobs
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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

institution_jobs input schema
{
  "type": "object",
  "required": [
    "institution"
  ],
  "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."
    }
  }
}
institution_jobs output schema
{
  "type": "object",
  "required": [
    "institution",
    "results"
  ],
  "properties": {
    "note": {
      "type": "string",
      "description": "Present only when no institution of that name is on the board."
    },
    "page": {
      "type": "string",
      "description": "That institution's page on curatorsearch.com."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "institution",
          "category",
          "region",
          "posted",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "The role's permanent page on curatorsearch.com."
          },
          "title": {
            "type": "string",
            "description": "Job title as advertised."
          },
          "posted": {
            "type": "string",
            "description": "ISO date the role was first seen on the board."
          },
          "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."
          },
          "category": {
            "type": "string",
            "description": "CuratorSearch field, one of the category values."
          },
          "deadline": {
            "type": [
              "string",
              "null"
            ],
            "description": "Application deadline as an ISO date, or null if none is given."
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "City and country as stated, or null if the posting gives none."
          },
          "institution": {
            "type": "string",
            "description": "Museum, gallery or organisation advertising the role."
          }
        }
      },
      "description": "Its open roles, newest first."
    },
    "institution": {
      "type": "string",
      "description": "The institution as the board names it."
    }
  }
}
institution_jobs annotations
{
  "title": "One museum's open roles",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
salary_transparency
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

salary_transparency input schema
{
  "type": "object",
  "properties": {}
}
salary_transparency output schema
{
  "type": "object",
  "properties": {
    "asOf": {
      "type": "string",
      "description": "ISO date the figures were computed."
    },
    "note": {
      "type": "string",
      "description": "Present only when there is no salary data yet."
    },
    "citation": {
      "type": "string",
      "description": "How to cite these figures."
    },
    "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."
    }
  }
}
salary_transparency annotations
{
  "title": "Curatorial pay transparency",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (4 of 4 answered).

  1. 2026-11-07: 1 of 1 checks answered
  2. 2026-11-09: 2 of 2 checks answered
  3. 2026-11-10: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
692 ms
95th percentile latency
692 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 692 ms · metadata changed · 4 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http curatorsearch-mcp https://curatorsearch.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add curatorsearch-mcp --url https://curatorsearch.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable curatorsearch-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "curatorsearch-mcp": {
      "url": "https://curatorsearch.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "curatorsearch-mcp": {
      "type": "streamableHttp",
      "url": "https://curatorsearch.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start curatorsearch-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "curatorsearch-mcp": {
      "type": "http",
      "url": "https://curatorsearch.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http curatorsearch-mcp https://curatorsearch.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://curatorsearch.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "curatorsearch-mcp": {
      "serverUrl": "https://curatorsearch.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like CuratorSearch MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run CuratorSearch MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing