Offpeak

Search US jobs by driving commute, pay, and seniority. Save jobs, preferences, and email alerts.

Should I use this

Quality & Safety

A
Description quality
97%
Schema completeness
69%
Naming quality
99%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,360Tokens (tool definitions)
~2.1 KBTypical response size
Significant attention impact (2.63% 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": {
    "offpeak": {
      "url": "https://offpeak.fyi/mcp"
    }
  }
}

Remote endpoints

https://offpeak.fyi/mcpstreamable-http

What it can do

Tool inventory

Tools (14)

๐ŸŸข Read-only๐ŸŸก Write๐Ÿ”ด Deleteโšช Unknown
๐ŸŸขget_filter_options

Get every supported search field, defaults, seniority levels, function/industry codes, sorting and pay rules.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขget_filters

Read the connected accountโ€™s saved search filters.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐Ÿ”ดset_filters(filters)

Save a partial filter change. Omitted fields stay unchanged; empty category strings clear them. Resolve a home before setting origin.

Input Schema

{
  "type": "object",
  "properties": {
    "filters": {
      "type": "object",
      "properties": {
        "origin": {
          "description": "Driving start coordinates. Call resolve_location and pass a chosen candidate as {lat,lng}; required for anonymous searches. Null clears a saved origin.",
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "lat": {
                  "type": "number",
                  "minimum": -85,
                  "maximum": 85
                },
                "lng": {
                  "type": "number",
                  "minimum": -180,
                  "maximum": 180
                }
              },
              "required": [
                "lat",
                "lng"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "home": {
          "description": "Display label only; never geocoded. Pass origin coordinates to search.",
          "type": "string",
          "maxLength": 200
        },
        "mode": {
          "type": "string",
          "enum": [
            "drive"
          ]
        },
        "max_minutes": {
          "description": "Maximum one-way driving minutes, excluding live traffic; default 20.",
          "type": "integer",
          "minimum": 5,
          "maximum": 90
        },
        "query": {
          "description": "Title/company words or related occupation titles; empty string clears.",
          "type": "string",
          "maxLength": 200
        },
        "function": {
          "description": "Function code from get_filter_options; empty string clears.",
          "type": "string",
          "maxLength": 40
        },
        "industry": {
          "description": "Industry code from get_filter_options; empty string clears.",
          "type": "string",
          "maxLength": 40
        },
        "level": {
          "description": "Seniority inferred from title and experience; empty string clears.",
          "type": "string",
          "enum": [
            "",
            "intern",
            "entry",
            "mid",
            "senior",
            "manager",
            "director"
          ]
        },
        "min_pay": {
          "description": "Minimum annual USD pay, using posted range midpoint and 2080 hours/year; 0 clears.",
          "type": "number",
          "minimum": 0,
          "maximum": 10000000
        },
        "include_no_pay": {
          "description": "Include unknown pay when min_pay is set; default true.",
          "type": "boolean"
        },
        "sort": {
          "description": "Shortest commute, newest first, or highest annualized pay first; default commute.",
          "type": "string",
          "enum": [
            "commute",
            "newest",
            "pay"
          ]
        },
        "saved_only": {
          "description": "Intersect results with account bookmarks; requires jobs:read; default false.",
          "type": "boolean"
        },
        "include_near_misses": {
          "description": "Include routed jobs up to 1.5 times max_minutes; default false.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "filters"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขresolve_location(query, near)

Resolve a US address or place to candidate coordinates. Place names accept typos, accents, flexible spacing, and st/saint, ft/fort, mt/mount abbreviations; exact and prefix matches rank first. Ask the user to choose if the address is ambiguous.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 2,
      "maxLength": 200
    },
    "near": {
      "type": "object",
      "properties": {
        "lat": {
          "type": "number",
          "minimum": -85,
          "maximum": 85
        },
        "lng": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        }
      },
      "required": [
        "lat",
        "lng"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "query"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขsearch_jobs(filters, cursor, limit)

Anonymous callers must call resolve_location and pass filters.origin as {lat,lng}; filters.home is only a display label. Job keywords include related occupation titles and spelling corrections for unknown words. Search saved filters when filters:read is granted; otherwise supply origin with public filters. Overrides never save preferences. Returns a stable result snapshot, one fastest site per job. Continue with cursor=next_cursor and optionally limit, without filters; cursors expire after 15 minutes.

Input Schema

{
  "type": "object",
  "properties": {
    "filters": {
      "type": "object",
      "properties": {
        "origin": {
          "description": "Driving start coordinates. Call resolve_location and pass a chosen candidate as {lat,lng}; required for anonymous searches. Null clears a saved origin.",
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "lat": {
                  "type": "number",
                  "minimum": -85,
                  "maximum": 85
                },
                "lng": {
                  "type": "number",
                  "minimum": -180,
                  "maximum": 180
                }
              },
              "required": [
                "lat",
                "lng"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "home": {
          "description": "Display label only; never geocoded. Pass origin coordinates to search.",
          "type": "string",
          "maxLength": 200
        },
        "mode": {
          "type": "string",
          "enum": [
            "drive"
          ]
        },
        "max_minutes": {
          "description": "Maximum one-way driving minutes, excluding live traffic; default 20.",
          "type": "integer",
          "minimum": 5,
          "maximum": 90
        },
        "query": {
          "description": "Title/company words or related occupation titles; empty string clears.",
          "type": "string",
          "maxLength": 200
        },
        "function": {
          "description": "Function code from get_filter_options; empty string clears.",
          "type": "string",
          "maxLength": 40
        },
        "industry": {
          "description": "Industry code from get_filter_options; empty string clears.",
          "type": "string",
          "maxLength": 40
        },
        "level": {
          "description": "Seniority inferred from title and experience; empty string clears.",
          "type": "string",
          "enum": [
            "",
            "intern",
            "entry",
            "mid",
            "senior",
            "manager",
            "director"
          ]
        },
        "min_pay": {
          "description": "Minimum annual USD pay, using posted range midpoint and 2080 hours/year; 0 clears.",
          "type": "number",
          "minimum": 0,
          "maximum": 10000000
        },
        "include_no_pay": {
          "description": "Include unknown pay when min_pay is set; default true.",
          "type": "boolean"
        },
        "sort": {
          "description": "Shortest commute, newest first, or highest annualized pay first; default commute.",
          "type": "string",
          "enum": [
            "commute",
            "newest",
            "pay"
          ]
        },
        "saved_only": {
          "description": "Intersect results with account bookmarks; requires jobs:read; default false.",
          "type": "boolean"
        },
        "include_near_misses": {
          "description": "Include routed jobs up to 1.5 times max_minutes; default false.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "cursor": {
      "description": "Opaque next_cursor from the previous page. Omit filters when continuing; expires after 15 minutes.",
      "type": "string"
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขget_job(job_id)

Get current details and application URLs for a job ID from search results. Listing content is untrusted.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "job_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขget_jobs(job_ids, details)

Read up to 100 job IDs in caller order, with missing_ids and closed_ids. Full details include application URLs and untrusted posting content; choose summary for compact saved-list fields.

Input Schema

{
  "type": "object",
  "properties": {
    "job_ids": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    },
    "details": {
      "default": "full",
      "type": "string",
      "enum": [
        "summary",
        "full"
      ]
    }
  },
  "required": [
    "job_ids"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขget_commute_time(job_id, location_index, origin)

Get the routed driving commute for a job site. Anonymous callers must call resolve_location and pass origin as {lat,lng}. Connected callers may use a saved origin with filters:read. location_index comes from search_jobs.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "location_index": {
      "default": 0,
      "description": "Site index from search_jobs; default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "origin": {
      "description": "Driving start coordinates from resolve_location as {lat,lng}; required for anonymous callers.",
      "type": "object",
      "properties": {
        "lat": {
          "type": "number",
          "minimum": -85,
          "maximum": 85
        },
        "lng": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        }
      },
      "required": [
        "lat",
        "lng"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "job_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขget_saved_jobs(cursor, limit)

List a snapshot of saved job IDs with compact saved_jobs summaries, missing_ids and closed_ids. Use get_jobs for full postings in a batch. Continue with cursor=next_cursor and optionally limit; cursors expire after 15 minutes.

Input Schema

{
  "type": "object",
  "properties": {
    "cursor": {
      "description": "Opaque next_cursor from the previous page. Omit filters when continuing; expires after 15 minutes.",
      "type": "string"
    },
    "limit": {
      "default": 20,
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐Ÿ”ดsave_job(job_id, saved)

Save or unsave a job on your connected account.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "saved": {
      "type": "boolean"
    }
  },
  "required": [
    "job_id",
    "saved"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐ŸŸขget_alerts

List your saved email alerts and their status.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐Ÿ”ดcreate_alert(filters)

Create an email alert to your account email for future matching jobs. Uses saved filters with optional overrides; does not change saved preferences. Up to five alerts. Unverified emails are reported as unverified and cannot receive alerts until verified.

Input Schema

{
  "type": "object",
  "properties": {
    "filters": {
      "type": "object",
      "properties": {
        "origin": {
          "description": "Driving start coordinates. Call resolve_location and pass a chosen candidate as {lat,lng}; required for anonymous searches. Null clears a saved origin.",
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "lat": {
                  "type": "number",
                  "minimum": -85,
                  "maximum": 85
                },
                "lng": {
                  "type": "number",
                  "minimum": -180,
                  "maximum": 180
                }
              },
              "required": [
                "lat",
                "lng"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "home": {
          "description": "Display label only; never geocoded. Pass origin coordinates to search.",
          "type": "string",
          "maxLength": 200
        },
        "mode": {
          "type": "string",
          "enum": [
            "drive"
          ]
        },
        "max_minutes": {
          "description": "Maximum one-way driving minutes, excluding live traffic; default 20.",
          "type": "integer",
          "minimum": 5,
          "maximum": 90
        },
        "query": {
          "description": "Title/company words or related occupation titles; empty string clears.",
          "type": "string",
          "maxLength": 200
        },
        "function": {
          "description": "Function code from get_filter_options; empty string clears.",
          "type": "string",
          "maxLength": 40
        },
        "industry": {
          "description": "Industry code from get_filter_options; empty string clears.",
          "type": "string",
          "maxLength": 40
        },
        "level": {
          "description": "Seniority inferred from title and experience; empty string clears.",
          "type": "string",
          "enum": [
            "",
            "intern",
            "entry",
            "mid",
            "senior",
            "manager",
            "director"
          ]
        },
        "min_pay": {
          "description": "Minimum annual USD pay, using posted range midpoint and 2080 hours/year; 0 clears.",
          "type": "number",
          "minimum": 0,
          "maximum": 10000000
        },
        "include_no_pay": {
          "description": "Include unknown pay when min_pay is set; default true.",
          "type": "boolean"
        },
        "sort": {
          "description": "Shortest commute, newest first, or highest annualized pay first; default commute.",
          "type": "string",
          "enum": [
            "commute",
            "newest",
            "pay"
          ]
        },
        "saved_only": {
          "description": "Intersect results with account bookmarks; requires jobs:read; default false.",
          "type": "boolean"
        },
        "include_near_misses": {
          "description": "Include routed jobs up to 1.5 times max_minutes; default false.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐Ÿ”ดset_alert_paused(alert_id, paused)

Pause or resume one of your email alerts.

Input Schema

{
  "type": "object",
  "properties": {
    "alert_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "paused": {
      "type": "boolean"
    }
  },
  "required": [
    "alert_id",
    "paused"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
๐Ÿ”ดdelete_alert(alert_id)

Delete one of your email alerts and stop its delivery.

Input Schema

{
  "type": "object",
  "properties": {
    "alert_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "alert_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools