Skip to main content
Glama

Scan a project for retiring model IDs

scan_project
Read-onlyIdempotent

Scans a project folder for retired, retiring, or deprecated OpenAI, Anthropic, and Google model IDs in code and config files, reporting each finding by file and line, most urgent first. Audit a repository or pre-release check.

Instructions

Scan a project folder for OpenAI, Anthropic and Google model IDs in code and config files and report the ones that are retired, retiring soon, deprecated or being re-routed, with file and line, most urgent first. Use it to audit a repository or before a release. For IDs you already know use check_models; for a time-based list use upcoming_retirements. Read-only: reads files on this machine and never changes them. Scans subfolders recursively, skips .git, node_modules, vendor, dist, build and similar folders, and files over 1 MB. Mentions in .md and .txt files are marked in_docs. Returns at most 200 findings (truncated: true when cut). Fails with an error if the path does not exist.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "scan_project"
  }
}

Input Schema

NameRequiredDescriptionDefault
pathNoAbsolute path of the folder to scan. Defaults to the server's working directory, which may not be the user's project, so pass it explicitly.
include_okNoAlso list models with no retirement announced (status active or unknown). Default false.

Output Schema

NameRequiredDescriptionDefault
flaggedYes
scannedYes
findingsYes
all_datesNo
next_stepNoPresent when a model has to move: how to test prompts on the replacement first
truncatedNo
registry_sourceNolive = aidriftline.com/models.json; bundled = the copy shipped in the package (used offline)
model_referencesNoAll model ID mentions found, before filtering
registry_checkedNoDate the registry was last checked against the provider pages

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.1.1
    • addedInput schema / properties / include_ok / default
      Added value: +false
    • changedInput schema / properties / include_ok / description
      Previous value: -"Also list models with no retirement announced (default false)"New value: +"Also list models with no retirement announced (status active or unknown). Default false."
    • changedInput schema / properties / path / description
      Previous value: -"Folder to scan (default: the server's current directory)"New value: +"Absolute path of the folder to scan. Defaults to the server's working directory, which may not be the user's project, so pass it explicitly."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "all_dates": {
      +      "type": "string"
      +    },
      +    "findings": {
      +      "items": {
      +        "properties": {
      +          "advice": {
      +            "description": "One plain sentence to pass on to the user",
      +            "type": "string"
      +          },
      +          "alias_of": {
      +            "type": "string"
      +          },
      +          "days_left": {
      +            "description": "Days until the date; 0 or negative when it has passed",
      +            "type": "number"
      +          },
      +          "file": {
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "The ID as given",
      +            "type": "string"
      +          },
      +          "in_docs": {
      +            "type": "boolean"
      +          },
      +          "line": {
      +            "type": "number"
      +          },
      +          "normalized": {
      +            "description": "The ID after removing provider prefixes such as models/ or openai/",
      +            "type": "string"
      +          },
      +          "page": {
      +            "description": "aidriftline.com page with the source for this date",
      +            "type": "string"
      +          },
      +          "provider": {
      +            "type": "string"
      +          },
      +          "qualifier": {
      +            "description": "exact date, earliest possible shutdown (Google), or not before this date (Anthropic)",
      +            "enum": [
      +              "exact",
      +              "earliest",
      +              "not-before"
      +            ],
      +            "type": "string"
      +          },
      +          "replacement": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "retires": {
      +            "description": "YYYY-MM-DD",
      +            "type": "string"
      +          },
      +          "routes": {
      +            "description": "true: after the date the provider answers with the replacement model instead of failing",
      +            "type": "boolean"
      +          },
      +          "status": {
      +            "description": "retired = calls fail (or are re-routed) now; at-risk = retires within 90 days; deprecated = retirement announced, further out; active = announced as active; unknown = no retirement published",
      +            "enum": [
      +              "retired",
      +              "at-risk",
      +              "deprecated",
      +              "active",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "status",
      +          "advice"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "flagged": {
      +      "type": "number"
      +    },
      +    "model_references": {
      +      "description": "All model ID mentions found, before filtering",
      +      "type": "number"
      +    },
      +    "next_step": {
      +      "description": "Present when a model has to move: how to test prompts on the replacement first",
      +      "type": "string"
      +    },
      +    "registry_checked": {
      +      "description": "Date the registry was last checked against the provider pages",
      +      "type": "string"
      +    },
      +    "registry_source": {
      +      "description": "live = aidriftline.com/models.json; bundled = the copy shipped in the package (used offline)",
      +      "enum": [
      +        "live",
      +        "bundled"
      +      ],
      +      "type": "string"
      +    },
      +    "scanned": {
      +      "type": "string"
      +    },
      +    "truncated": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "scanned",
      +    "flagged",
      +    "findings"
      +  ],
      +  "type": "object"
      +}
  2. First observedv0.1.0

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint/destructiveHint=false, it discloses that it reads files on this machine and never changes them, recurses into subfolders, skips .git, node_modules, vendor, dist, build and files over 1 MB, tags .md/.txt hits as in_docs, caps output at 200 findings with truncated: true, and errors on a nonexistent path. These are concrete operational limits the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core scan-and-report behavior and urgency ordering come first, followed by routing to siblings, then behavioral constraints. Every clause carries information — no restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be re-explained, yet the description still covers truncation, the in_docs marker, scope/ignore rules, and the failure mode. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, including the default-path caveat and include_ok. The description adds no further parameter detail (it never mentions include_ok or how 'active/unknown' models appear), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Scan a project folder for ... model IDs in code and config files') and the exact output ('retired, retiring soon, deprecated or being re-routed, with file and line, most urgent first'). It also names the two sibling tools it is not, so an agent can separate it from check_models and upcoming_retirements without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives positive triggers ('audit a repository or before a release') and explicit routing rules: use check_models for IDs already known and upcoming_retirements for a time-based list. Both the when and the when-not are stated directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools