# PERM Tracker

> PERM, prevailing wage and H-1B case status, DOL's queue and the visa bulletin, from federal records

- name: app.permtracker/perm-tracker
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 82/100 flags: no-repository
- quality: 96/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/app.permtracker%2Fperm-tracker
- tools: https://api.protogrid.dev/v1/servers/app.permtracker%2Fperm-tracker/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "perm-tracker": {
      "type": "http",
      "url": "https://permtracker.app/mcp",
      "headers": {
        "Authorization": "Bearer ${PERM_TRACKER_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${PERM_TRACKER_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 99
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-97% +updated-17d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 96/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 100 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 6 of 6 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 890 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 1 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 6, about 890 tokens to load them all
- tool set hash: 4409ef9b64d69ba1eb1509d596fc2295
- tools last changed: 2026-10-03T23:50:27.569Z
- badge: [![protogrid quality](https://protogrid.dev/badge/app.permtracker/perm-tracker.svg)](https://protogrid.dev/servers/app.permtracker/perm-tracker)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-03 `lookup_case` changed (description)
  - before: One DOL case by number: status, filing date, employer, job and, once decided, DOL's decided record. PERM (G-100-...), prevailing wage (P-100-...), H-1B LCA (I-200-...) and H-2A/H-2B numbers. Example: {"case_number": "G-100-26045-123456"}.
  - after: One DOL case by number: status, filing date, employer, job and, once decided, DOL's decided record. PERM (G-100-...), prevailing wage (P-100- to P-203-...), H-1B LCA (I-200-...) and H-2A, H-2B or CW-1 numbers. Example: {"case_number": "G-100-26045-123456"}.

Full history: https://api.protogrid.dev/v1/servers/app.permtracker%2Fperm-tracker/changes

## Remotes

- https://permtracker.app/mcp (streamable-http, auth none, reachable true, uptime30d 0.9701493)

## Packages

_none_

## Tools (6)

- `employer_profile`: Cases in DOL's published files (certified, denied, median days to a decision, filings in the last 12 months, and for an occupation the median offered wage), plus how many of its cases are pending at DOL right now and at which stage. Find the slug with search_sponsors first. Example: {"kind": "employer", "slug": "microsoft-corporation"}.
- `estimate_decision`: When a pending PERM case is likely to be decided, with a range, the model used and its caveats. Pass a case number, or a filing date for a case in analyst review. An estimate, not a promise. Examples: {"case_number": "G-100-26045-123456"} or {"filed": "2026-01-15"}.
- `lookup_case`: One DOL case by number: status, filing date, employer, job and, once decided, DOL's decided record. PERM (G-100-...), prevailing wage (P-100- to P-203-...), H-1B LCA (I-200-...) and H-2A, H-2B or CW-1 numbers. Example: {"case_number": "G-100-26045-123456"}.
- `queue_status`: DOL's processing times today: the month each PERM and prevailing wage queue is working on, average days to a decision, and how many PERM cases are pending from each filing month. Takes no arguments: {}.
- `search_sponsors`: Search DOL's PERM records by name. Returns each match's record and the slug that employer_profile takes. Example: {"kind": "employer", "name": "Microsoft"}.
- `visa_bulletin`: A visa bulletin's employment and family final action and dates for filing charts, as printed. The newest by default; months back to June 2005. Examples: {} for the newest, or {"month": "2026-10"}.
