Skip to main content
Glama

Projects using core symbols

list_symbol_users
Read-onlyIdempotent

List every contrib project using one core symbol, or any symbol in a class of symbols, one row per project, paged, with the matched symbols. lookup_core_symbol answers one symbol with a head of 30.

  • Pass fqn, or filters: kind, status (deprecated, scheduled_removal, removed), subsystem, removal_in (13.0), deprecated_in (11.4). Example: "top modules still calling a method going away in 13.0" is kind=method, status=scheduled_removal, removal_in=13.0. Filters take public symbols only.

  • Development branches only, from the evidence rollup as of evidence_built_at. count: projects. symbol_count: matched symbols. symbols_matched: those symbols, up to matched, most used first, each with stamps, projects_using and change_record_nids.

  • Rows are ordered by installs, occurrences, name. Each row: project, title, installs, branch, branches, symbol_count, occurrences, symbols. symbols: heaviest first, each with fqn, kind, removal_in, occurrences, files and change_record_nids for get_change_record. next_offset is absent on the last page.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fqnNoOne core symbol, as lookup_core_symbol takes it. Pass this or a filter.
kindNoFilter: one symbol kind (function, method, class, library, hook, service …).
limitNoProjects per page, 1 to 100 (default 50).
offsetNoSkip this many projects. Pass the previous next_offset.
statusNoFilter: deprecated | scheduled_removal (still present) | removed (gone).
matchedNoMatched symbols listed on the envelope, 1 to 50 (default 20).
symbolsNoSymbols per project row, 1 to 30 (default 10), heaviest first.
subsystemNoFilter: a core subsystem (Entity API, Views), case-insensitive. subsystem_coupling with no arguments lists them.
removal_inNoFilter: removal stamp in this core minor (13.0). With status=scheduled_removal: still present, going away then.
deprecated_inNoFilter: symbols deprecated in this core minor (11.4).

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed3 schema fields changed
    • changedInput schema / properties / offset / description
      Previous value: -"Skip this many projects; pass the previous next_offset."New value: +"Skip this many projects. Pass the previous next_offset."
    • changedInput schema / properties / removal_in / description
      Previous value: -"Filter: removal stamp in this core minor (13.0); with status=scheduled_removal = still present, going away then."New value: +"Filter: removal stamp in this core minor (13.0). With status=scheduled_removal: still present, going away then."
    • changedInput schema / properties / subsystem / description
      Previous value: -"Filter: a core subsystem name (Entity API, Views), case-insensitive; subsystem_coupling with no arguments lists them."New value: +"Filter: a core subsystem (Entity API, Views), case-insensitive. subsystem_coupling with no arguments lists them."
  2. Changed10 schema fields changed
    • changedInput schema / properties / fqn / description
      Previous value: -"One core symbol, as lookup_core_symbol takes it (\\Drupal\\Core\\Url::fromRoute, check_markup, core:library:core/once). Pass this, or a filter below."New value: +"One core symbol, as lookup_core_symbol takes it. Pass this or a filter."
    • changedInput schema / properties / kind / description
      Previous value: -"Filter: one core_symbol kind (function, method, class, library, hook, service …)."New value: +"Filter: one symbol kind (function, method, class, library, hook, service …)."
    • changedInput schema / properties / limit / description
      Previous value: -"Projects per page, 1 to 100 (default 50). next_offset says where the next page starts."New value: +"Projects per page, 1 to 100 (default 50)."
    • changedInput schema / properties / matched / description
      Previous value: -"Matched catalog symbols listed on the envelope (symbols_matched), 1 to 50 (default 20), most-used first."New value: +"Matched symbols listed on the envelope, 1 to 50 (default 20)."
    • changedInput schema / properties / offset / description
      Previous value: -"Skip this many projects in the same ranked order. Pass the previous page's next_offset."New value: +"Skip this many projects; pass the previous next_offset."
    • changedInput schema / properties / removal_in / description
      Previous value: -"Filter: symbols whose removal stamp names this core minor (13.0). Combine with status=scheduled_removal for 'still present, going away in 13.0'."New value: +"Filter: removal stamp in this core minor (13.0); with status=scheduled_removal = still present, going away then."
    • changedInput schema / properties / status / description
      Previous value: -"Filter: deprecated (has a @deprecated stamp), scheduled_removal (still present, removal announced), or removed (gone)."New value: +"Filter: deprecated | scheduled_removal (still present) | removed (gone)."
    • changedInput schema / properties / subsystem / description
      Previous value: -"Filter: one core subsystem name (Entity API, Views, Form API …), case-insensitive; subsystem_coupling with no arguments lists them."New value: +"Filter: a core subsystem name (Entity API, Views), case-insensitive; subsystem_coupling with no arguments lists them."
    • changedInput schema / properties / symbols / description
      Previous value: -"Symbols listed per project row, 1 to 30 (default 10), heaviest first; symbol_count on the row says how many the project uses in all."New value: +"Symbols per project row, 1 to 30 (default 10), heaviest first."
    • changedOutput schema / (root)
      Previous value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "count": {
      -      "type": "integer"
      -    },
      -    "evidence_built_at": {
      -      "type": "string"
      -    },
      -    "next_offset": {
      -      "type": "integer"
      -    },
      -    "ranked_by": {
      -      "type": "string"
      -    },
      -    "rows": {
      -      "items": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "branch": {
      -            "type": "string"
      -          },
      -          "branches": {
      -            "type": "integer"
      -          },
      -          "installs": {
      -            "type": "integer"
      -          },
      -          "occurrences": {
      -            "type": "integer"
      -          },
      -          "project": {
      -            "type": "string"
      -          },
      -          "symbol_count": {
      -            "type": "integer"
      -          },
      -          "symbols": {
      -            "items": {
      -              "additionalProperties": false,
      -              "properties": {
      -                "change_record_nids": {
      -                  "items": {
      -                    "type": "integer"
      -                  },
      -                  "type": [
      -                    "null",
      -                    "array"
      -                  ]
      -                },
      -                "files": {
      -                  "type": "integer"
      -                },
      -                "fqn": {
      -                  "type": "string"
      -                },
      -                "kind": {
      -                  "type": "string"
      -                },
      -                "occurrences": {
      -                  "type": "integer"
      -                },
      -                "removal_in": {
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "fqn",
      -                "kind",
      -                "occurrences",
      -                "files",
      -                "change_record_nids"
      -              ],
      -              "type": "object"
      -            },
      -            "type": [
      -              "null",
      -              "array"
      -            ]
      -          },
      -          "title": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "project",
      -          "branch",
      -          "branches",
      -          "installs",
      -          "symbol_count",
      -          "occurrences",
      -          "symbols"
      -        ],
      -        "type": "object"
      -      },
      -      "type": [
      -        "null",
      -        "array"
      -      ]
      -    },
      -    "symbol_count": {
      -      "type": "integer"
      -    },
      -    "symbols_matched": {
      -      "items": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "change_record_nids": {
      -            "items": {
      -              "type": "integer"
      -            },
      -            "type": [
      -              "null",
      -              "array"
      -            ]
      -          },
      -          "deprecated_in": {
      -            "type": "string"
      -          },
      -          "fqn": {
      -            "type": "string"
      -          },
      -          "kind": {
      -            "type": "string"
      -          },
      -          "projects_using": {
      -            "type": "integer"
      -          },
      -          "removal_in": {
      -            "type": "string"
      -          },
      -          "removal_kind": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "fqn",
      -          "kind",
      -          "projects_using",
      -          "change_record_nids"
      -        ],
      -        "type": "object"
      -      },
      -      "type": [
      -        "null",
      -        "array"
      -      ]
      -    }
      -  },
      -  "required": [
      -    "symbol_count",
      -    "symbols_matched",
      -    "count",
      -    "rows",
      -    "ranked_by"
      -  ],
      -  "type": "object"
      -}New value: +null
  3. Changed3 schema fields changed
    • addedInput schema / properties / matched
      Added value: +{
      +  "description": "Matched catalog symbols listed on the envelope (symbols_matched), 1 to 50 (default 20), most-used first.",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / symbols_matched
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "change_record_nids": {
      +        "items": {
      +          "type": "integer"
      +        },
      +        "type": [
      +          "null",
      +          "array"
      +        ]
      +      },
      +      "deprecated_in": {
      +        "type": "string"
      +      },
      +      "fqn": {
      +        "type": "string"
      +      },
      +      "kind": {
      +        "type": "string"
      +      },
      +      "projects_using": {
      +        "type": "integer"
      +      },
      +      "removal_in": {
      +        "type": "string"
      +      },
      +      "removal_kind": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "fqn",
      +      "kind",
      +      "projects_using",
      +      "change_record_nids"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "null",
      +    "array"
      +  ]
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "symbol_count",
      -  "count",
      -  "rows",
      -  "ranked_by"
      -]New value: +[
      +  "symbol_count",
      +  "symbols_matched",
      +  "count",
      +  "rows",
      +  "ranked_by"
      +]
  4. Changed5 schema fields changed
    • addedInput schema / properties / deprecated_in
      Added value: +{
      +  "description": "Filter: symbols deprecated in this core minor (11.4).",
      +  "type": "string"
      +}
    • addedInput schema / properties / removal_in
      Added value: +{
      +  "description": "Filter: symbols whose removal stamp names this core minor (13.0). Combine with status=scheduled_removal for 'still present, going away in 13.0'.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / rows / items / properties / symbols / items / properties / change_record_nids
      Added value: +{
      +  "items": {
      +    "type": "integer"
      +  },
      +  "type": [
      +    "null",
      +    "array"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / symbols / items / properties / removal_in
      Added value: +{
      +  "type": "string"
      +}
    • changedOutput schema / properties / rows / items / properties / symbols / items / required
      Previous value: -[
      -  "fqn",
      -  "kind",
      -  "occurrences",
      -  "files"
      -]New value: +[
      +  "fqn",
      +  "kind",
      +  "occurrences",
      +  "files",
      +  "change_record_nids"
      +]
  5. Changed1 schema field changed
    • changedInput schema / properties / subsystem / description
      Previous value: -"Filter: one core subsystem name."New value: +"Filter: one core subsystem name (Entity API, Views, Form API …), case-insensitive; subsystem_coupling with no arguments lists them."
  6. Added

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark read-only/idempotent, and the description adds substantial behavior: paging, public-symbol-only filtering, development-branch scope, evidence rollup timestamp, ordering, and per-row fields. No contradiction with annotations.

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?

Description is long but every sentence carries operational detail; bullet layout makes it scannable. Front-loaded with main purpose before filters/output details.

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?

This is a complex read tool with no output schema, so the description carries the burden of defining return values; it covers count, symbol_count, symbols_matched, row ordering, row fields, symbol fields, and last-page pagination marker. Complete enough for an agent to invoke and interpret results.

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

Parameters4/5

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

With schema coverage at 100%, the baseline is 3; the description adds value by explaining fqn-or-filter alternatives, filter combinations via the 13.0 example, and public-symbol restriction. It does not restate every schema description but reinforces the most consequential interactions.

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 ('List'), resource ('contrib projects'), and scope ('using one core symbol, or any symbol in a class of symbols'), with explicit output shape. Differentiates itself from lookup_core_symbol by noting that sibling answers one symbol with a head of 30.

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

Usage Guidelines4/5

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

Clearly says to pass either fqn or filters, gives a concrete example query, and references sibling tools (lookup_core_symbol, subsystem_coupling) for adjacent behaviors. It could be more explicit about when list_projects is the better choice, but guidance is strong.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.6/5.0
Disambiguation4/5

Tools cluster into related families (change records, symbol usage, patch checks), but descriptions and cross-references clearly separate list vs detail vs diff operations. Some adjacent tools like lookup_core_symbol and list_symbol_users require careful reading, yet their purposes are distinct enough for an agent to select correctly.

Naming Consistency4/5

Most tools follow a clear snake_case verb_noun pattern: list_*, get_*, lookup_*, query_, scan_, search_, reroll_, describe_. A few names like project_profile, subsystem_coupling, and what_changed deviate from verb_noun but remain consistent in style and readable.

Tool Count4/5

At 16 tools, the set is slightly above the typical well-scoped range, but the domain is broad: patch lifecycle, composer scanning, symbol lookup, change records, project profiles, dataset queries, and code search. Each tool covers a distinct query surface, so none feels redundant.

Completeness5/5

The toolkit covers the full read-only analysis lifecycle: scanning composer constraints, checking and re-rolling patches, exploring datasets, looking up core symbols and their users, listing change records, profiling projects, and assessing upgrade readiness. No obvious dead ends or missing operations for its stated purpose.

Resources