Developer tools

Editors and CLIs that speak MCP over HTTP take Pelyr with a bearer header. They do not use the browser sign-in: Pelyr deliberately offers no dynamic client registration, and the header route needs no registration at all.

Create a key with the https capability in the portal first. What happens next differs by client — not every one of them expands an environment variable inside a header the same way, so this page gives you the form each client actually documents rather than one block for all four.

Cursor

~/.cursor/mcp.json, or .cursor/mcp.json in the project:

{
  "mcpServers": {
    "pelyr": {
      "url": "https://api.pelyr.com/mcp",
      "headers": { "Authorization": "Bearer ${env:PELYR_API_KEY}" }
    }
  }
}
export PELYR_API_KEY=pk_your_key_here

Export the variable in the shell Cursor starts from — Cursor's own docs describe ${env:...} resolving inside headers for a remote server like this one.

VS Code

.vscode/mcp.json in the project. The object is called servers, and each entry carries "type": "http":

{
  "inputs": [
    { "type": "promptString", "id": "pelyr-api-key", "password": true }
  ],
  "servers": {
    "pelyr": {
      "type": "http",
      "url": "https://api.pelyr.com/mcp",
      "headers": { "Authorization": "Bearer ${input:pelyr-api-key}" }
    }
  }
}

VS Code's own recommended way to keep a header secret out of the file is an input that prompts once and stores the value, not an environment-variable reference — see VS Code's MCP documentation for the current syntax.

Gemini CLI

export PELYR_API_KEY=pk_your_key_here
gemini mcp add --scope user --transport http pelyr https://api.pelyr.com/mcp --header 'Authorization: Bearer $PELYR_API_KEY'

--scope user writes the server into ~/.gemini/settings.json. Without it, Gemini CLI writes .gemini/settings.json in the current project directory, a file that is easy to commit. The single quotes keep your shell from expanding the reference, so the file stores the literal $PELYR_API_KEY. Gemini CLI resolves $VAR and ${VAR} in every string of settings.json when it loads the settings, headers included. This command does not write the key itself into the file.

One caveat: a later gemini mcp add or gemini mcp remove in the same scope, run while PELYR_API_KEY is set, can write the resolved key back into the file. Check the file afterwards.

Windsurf

~/.codeium/windsurf/mcp_config.json. The URL field is called serverUrl:

{
  "mcpServers": {
    "pelyr": {
      "serverUrl": "https://api.pelyr.com/mcp",
      "headers": { "Authorization": "Bearer ${env:PELYR_API_KEY}" }
    }
  }
}
export PELYR_API_KEY=pk_your_key_here

Windsurf's own docs describe ${env:...} resolving inside both serverUrl and headers.

Never write the key into the file itself where the client actually substitutes a reference for you. A key that has been committed once is a key to revoke.

Checking the connection

Every one of these clients lists the tools of a server it connected to. pelyr has to show ten: list_sources, find_vessels, get_vessel, get_vessel_track, vessels_at_time, search_vessels, list_detection_areas, list_detection_overflights, get_detection_overflight, list_sts_finds.

An empty list means the server refused the key: missing header, revoked key, or a key without the https capability. The server answers 401 in all three cases and says so in the WWW-Authenticate header; most clients show that as "not authenticated".