Drupal Code Query
Server Details
Drupal core API changes, contrib usage, upgrade readiness, patch verdicts, code search, SQL.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Available Tools
16 toolscheck_patchesCheck composer patches against a releaseARead-onlyIdempotentInspect
Does each composer patch still apply to the release the site installed, and is its fix already in that release?
Send composer_json and composer_lock after composer update. Add patch_files for every patch, a local one read from disk and a URL one fetched by you. Every extra.patches entry is checked at its installed version in one call.
Do not download releases. Do not run patch --dry-run.
Send a package's patches together, in the order composer.json lists them.
items: up to 50 of {project, version, patch, title}, in place of the composer files. project: the drupal.org machine name (webform) or composer name (drupal/webform); drupal or core for Drupal core. version: the installed composer version (1.13.0, 2.0.0-beta4, 11.4.5). patch: the diff text, or its URL on www.drupal.org/files/issues or a git.drupalcode.org merge request or commit, ending .patch or .diff.
Per item. tag: the release tag matched, or unknown_version. applies_at: the -p level at which git apply passes, null when none. fuzzy: true when it applied only with reduced context and whitespace ignored; review it. hunks_failed: [{file, line, reason}]. reverse_applies: true when the patched lines are already in the tag. mr: the merge request state when the patch is an MR URL. merged_in_version. suggested.
suggested: the verdict. merged: the fix is in the release; drop the patch. applies: keep the patch. conflicts: call reroll_patch with that item. unknown: see error.
next_step: the follow-up calls and the row count the report must have. counts: the verdict tally; check the report's table against it. An item that could not be judged comes back unknown with the reason in error. Report it as unclear. Never leave the row out.
hunks_shipped, files_shipped: the parts of a patch already in the release verbatim. On a conflicts row, check whether the rest is still needed before re-rolling. moved_to: on a failed hunk, the release path of the renamed file.
core_references: what the added code references in core, checked at target_core. flagged: removed or moved classes, and calls whose argument count does not fit the target signature, each with file, line, change_record and replacement. parent::__construct is checked against the constructor of the core parent class. deprecated: a short side list. checked: how many references the catalog knows. Scope: added lines and direct references only (extends, implements, trait use, new, static calls, parent::__construct). A patch that does not apply has a note instead.
Verdicts come from git apply --check against the tag. An applies patch can still be wrong at runtime.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: the diff text. This service downloads nothing, so fetch a URL patch yourself and send what came back. source: optional, the path or URL the patch was declared with. merge_patch: optional, the .diff form of a merge request, used for the merge of a re-roll while patch decides the verdict. title: optional, echoed back. base: optional, the release the site had before the upgrade. A commit sha or a composer version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock. | |
| patch_files | No | The text of every patch listed in extra.patches, keyed by the source as written: a path (patches/x.patch) or its base name, or the URL. Fetch a URL patch yourself and send its text under that URL. For a merge request .patch URL, send its .diff form under a second key too. | |
| target_core | No | The core version the added code is checked against, 11.4.5. Defaults to the lock's drupal/core, else the version of a drupal item. | |
| composer_json | No | The contents of composer.json. Send the text; this server cannot read your filesystem. Its extra.patches becomes the item list, one item per patch. | |
| composer_lock | No | The contents of composer.lock. It gives the installed version of each patched package. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true and idempotentHint=true, but the description goes far beyond by explaining the internal mechanism: 'Verdicts come from git apply --check against the tag.' It also reveals side-effect-free operation ('This service downloads nothing'), and warning about potential runtime issues ('An applies patch can still be wrong at runtime'). It discloses the scope of checks and the meaning of fuzzy matches, all of which complement the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with bullet points and a clear hierarchy. It front-loads the purpose and then systematically covers input, output fields, and edge cases. Every sentence carries essential information; there is no fluff. It loses one point only because its length might be off-putting, but given the tool's complexity (many output fields, re-roll logic), this length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description is the sole source of output semantics. It explains every return field: tag, applies_at, fuzzy, hunks_failed, reverse_applies, mr, merged_in_version, suggested, next_step, counts, hunks_shipped, files_shipped, moved_to, core_references, flagged, deprecated, checked. It also specifies how to handle unclear verdicts ('Report it as unclear. Never leave the row out.') and when to trigger reroll_patch. This is a complete operational guide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides descriptions for each parameter, but the tool description adds substantial meaning: it explains the exact format of items (project names, version format, patch URL types), how patch_files should be keyed ('keyed by the source as written'), and the default behavior of target_core. It also clarifies that composer_json's extra.patches becomes the item list. This is far beyond baseline schema descriptions and fully compensates for any gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise question: 'Does each composer patch still apply to the release the site installed, and is its fix already in that release?' This states the verb (check), resource (composer patches), and the specific evaluation criteria. It is clearly distinguished from sibling tools like scan_composer (which likely scans composer files) and project_upgrade_report (which focuses on upgrades).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use instructions: 'Send composer_json and composer_lock after composer update.' It also provides negative directives: 'Do not download releases. Do not run patch --dry-run.' It explains the alternative input mode (items) and when to use it ('Leave empty to build the items from composer_json and composer_lock'). It even specifies follow-up actions like 'conflicts: call reroll_patch with that item.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_datasetDescribe the datasetARead-onlyIdempotentInspect
Learn the dataset before writing SQL for query_dataset. Call it with no arguments first. Returns text. Prefer a typed tool when one answers the question.
No arguments: one line per view, the join map, the four invariants, the causes of empty results, and the recipe index. The invariants: dev-branch isolation, no SUM(usage), *_seq compares, adoption polarity. Empty results come from fqn forms, placeholders and machine name forms.
view=, or views=[…] for several in one call. Returns the columns with types and descriptions, an example filter that returns rows, and the joins into the view.
recipe=: a ready-to-run statement for a common question. Fill in the placeholders and run it with query_dataset. Recipes cover who uses a symbol, deprecated symbols per project, and a change record's adoption. Others cover symbols deprecated between minors, one project's deprecated uses, and change records between minors.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | One view name. Returns its columns with types and descriptions, an example filter, and the joins into it. Leave empty for the overview. | |
| views | No | Up to 8 views at once, documented one after the other in one call. | |
| recipe | No | One recipe id from the overview's index. Returns a ready-to-run query_dataset statement with its placeholders explained. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, non-destructive behavior, and the description adds rich behavioral context: output varies by argument mode, no-args returns invariants and empty-result causes, view mode returns columns/filters/joins, and recipe mode returns ready-to-run statements. No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured with a leading usage directive and clear bullet-style modes. Every sentence carries useful information, and the most important instruction ('call it with no arguments first') is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only metadata tool with no output schema, the description covers all three invocation modes, return contents, and connection to query_dataset. It also gives enough detail about invariants and empty-result causes to set agent expectations. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining the no-arg overview, how view vs. views relate, what each variant returns, and how recipes connect to query_dataset. This goes beyond the schema descriptions without needing to compensate for missing schema docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool learns/describes the dataset before SQL work, and distinguishes it from query_dataset and other typed siblings. It specifies exactly what the tool does: returns an overview, view metadata, or recipes depending on arguments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call it before writing SQL for query_dataset, to call with no arguments first, and to prefer a typed tool when one answers the question. This provides clear when-to-use and when-not-to-use guidance relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_change_recordOne change recordARead-onlyIdempotentInspect
Return one core change record in full: title, flavour, target version, machine-checkable tracks, linked issues, linked core symbols, and contrib adoption counts. To find records, use list_change_records or the change_record_nids from what_changed. For one symbol's detail, use lookup_core_symbol.
flavour: coming-break (an API going away), coming-new-API (an API added), landed-but-still-relevant (shipped), policy-only (no code target, no adoption).
Adoption counts contrib development branches only. legacy: still calls the going-away side. migrated: moved to the new side.
Returns counts across every affected project plus a ranked head, outstanding first. For one project, use project_upgrade_report; do not raise top_projects.
symbols: the core API the record is about. role: from (going away) or to (replacement). Use the fqn with lookup_core_symbol. Empty means the catalog links no symbol; that is common.
| Name | Required | Description | Default |
|---|---|---|---|
| nid | Yes | The change record's drupal.org node id, for example 3581981. | |
| top_projects | No | How many impacted projects to return in the ranked head. Defaults to 10, capped at 40. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though readOnlyHint/idempotentHint already signal safe reads, the description adds valuable behavioral context: the flavour taxonomy, the fact that adoption counts only cover contrib development branches, the legacy/migrated meanings, the ranked-head ordering with outstanding first, and the meaning of an empty symbols list. None of this is present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a front-loaded summary sentence, routing guidance, then concise bullets for flavour, adoption, output shape, and symbols. It is longer than minimal but every bullet earns its place. Minor deduction for the ambiguous 'do not raise top_projects' phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries extra responsibility for explaining return semantics, and it mostly succeeds: it lists returned content, explains flavour values, adoption scope, and symbol roles. It does not describe exact JSON shape or possible error conditions, but an agent has enough to invoke the tool correctly. The ambiguity around top_projects keeps this from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that top_projects controls the ranked head and that the head is ordered outstanding first, and it connects nid to change_record_nids from what_changed. The phrase 'do not raise top_projects' is slightly cryptic, but overall the description enhances the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Return one core change record in full' — and enumerates the contained fields. It also differentiates itself from siblings by pointing to list_change_records for finding records and lookup_core_symbol for a single symbol's detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing: use list_change_records or what_changed to find records, use lookup_core_symbol for symbol-level detail, and use project_upgrade_report for a single project's upgrade report. This gives an agent clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_change_recordsChange records in a version rangeARead-onlyIdempotentInspect
List the core change records (the human write-ups) that target a range of core versions, tagged by flavour and ranked, with counts. For the symbol-level diff, use what_changed. For one record in full, use get_change_record.
Bounds are inclusive. Forms: 11.2, 11.2.x, 11.2.0, 11, 11.x. A bare major covers every minor of it.
Flavours: coming-break (an API going away), coming-new-API (an API added), landed-but-still-relevant (already shipped). policy-only records target no version and never appear here.
project: one machine name. Each record then has the count of that project's development branches still on the legacy side.
Returns the count of every record in range plus a ranked head. Each entry has its nid for get_change_record.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Upper core version bound, inclusive. Same forms as from. | |
| from | Yes | Lower core version bound, inclusive: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it. | |
| limit | No | Records in the head, 1 to 40 (default 15). Above the cap the call is refused. | |
| project | No | Optional contrib project machine name. Narrows the list to records a development branch of that project still matches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already assert readOnly, idempotent, non-destructive behavior, and the description adds significant behavioral detail beyond that: inclusive bounds, supported version forms, flavour taxonomy, exclusion of policy-only records, and the return contract (count of all records plus a ranked head with nids). This is exactly the kind of context annotations alone 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence summary followed by compact bullet points. Each bullet earns its place: bounds, flavours, project behavior, and return shape. There is no repetition, filler, or vague language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the essential return contract: count of every record, a ranked head, and each entry's nid for use with get_change_record. Combined with parameter semantics and explicit sibling routing, an agent has everything needed to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by explaining version-form semantics, inclusive bounds, flavour values, and what the project parameter actually counts. The limit parameter is left to the schema, which already documents its default and cap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the exact operation and resource: 'List the core change records ... that target a range of core versions, tagged by flavour and ranked, with counts.' It also explicitly differentiates from what_changed (symbol-level diff) and get_change_record (single record in full), so an agent can disambiguate it from the sibling list without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes to alternatives: 'For the symbol-level diff, use what_changed. For one record in full, use get_change_record.' It also clarifies which records never appear here (policy-only) and explains the narrowing effect of the project parameter, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_class_relationsContrib classes extending a core classARead-onlyIdempotentInspect
List the contrib classes that extend, implement or use a core class, interface or trait, one row per edge with file and line, paged. Example: "who subclasses FormBase". Call-site counts: list_symbol_users. The symbol's status: lookup_core_symbol.
target: with or without the leading backslash. An unknown target is refused with a pointer at lookup_core_symbol; a fragment there lists candidates. rel_kind: one of extends, implements, uses_trait. project: one machine name.
Development branches only. edge_count: every edge. project_count: projects. count: edges after the per_project cap. project_edges on each row: the project's full count. per_project=50 with project= lists one project in full.
Rows are ordered by project installs, project, source_fqn. Each row: project, branch, installs, source_fqn, rel_kind, file, line, project_edges. limit ≤ 100. next_offset is absent on the last page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows per page, 1 to 100 (default 50). | |
| offset | No | Skip this many rows in the same ranked order. Pass the previous page's next_offset. | |
| target | Yes | The core class, interface or trait, with or without the leading backslash: Drupal\Core\Form\FormBase. | |
| project | No | Restrict to one project machine name. | |
| rel_kind | No | extends, implements, or uses_trait; any when absent. | |
| per_project | No | Edges shown per project on a page, 1 to 50 (default 3). Each row has project_edges, the project's full count. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, but the description adds important runtime behavior: development branches only, unknown targets are refused with a pointer to lookup_core_symbol, per-project capping semantics, ordering, and next_offset absence on the last page. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose and an example, then moves into dense but purposeful reference details. Every sentence adds information needed to call the tool correctly; there is no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the row fields, ordering, pagination behavior, and error handling. The inclusion of sibling-tool routing and parameter edge cases makes the tool self-sufficient for an agent deciding whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema covers all parameters, the description adds meaning beyond it: the target may include or omit the leading backslash, rel_kind values are clarified, per_project controls the capping while project_edges gives the full count, and limit/offset/next_offset behavior is explained. This is substantial navigational guidance for constructing queries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: lists contrib classes that extend, implement, or use a core class/interface/trait, with one row per edge including file and line, paged. The concrete example "who subclasses FormBase" and the naming of related sibling tools remove ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to alternatives: call-site counts should use list_symbol_users, and symbol-status or candidate lookup should use lookup_core_symbol. It also explains the unknown-target refusal path, making the choice between tools clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projects by filtersARead-onlyIdempotentInspect
List drupal.org projects after filters, largest install base first, paged. Examples: "top modules without an 11.4 branch", "themes over 10k installs without security coverage". One project: project_profile. Its pending records: project_upgrade_report.
Filters combine: type, min_installs, security (covered, not-covered, revoked), core_minor (+ missing), era (d8plus, pre_d8). All apply to count and rows.
core_minor reads the composer constraint of the newest release on each development branch. A minor counts when any patch of it satisfies the constraint. An unreleased tip change is not seen. missing=true keeps projects with no branch declaring it: the upgrade gap list.
Row: machine_name, title, type, installs, security, status, dev_branches (branch, installs, core_minors, era), latest_release. count: projects. next_offset is absent on the last page.
| Name | Required | Description | Default |
|---|---|---|---|
| era | No | Filter: d8plus (Drupal 8+ code) or pre_d8, on any development branch. | |
| type | No | Filter: project_module, project_theme, project_distribution, project_general, project_theme_engine, project_translation. | |
| limit | No | Projects per page, 1 to 100 (default 50). | |
| offset | No | Skip this many projects in the same ranked order. Pass the previous page's next_offset. | |
| missing | No | Invert core_minor: keep projects whose development branches do not declare it. | |
| security | No | Filter: security advisory coverage: covered, not-covered, revoked. | |
| core_minor | No | Filter: a core minor in 11.4.x form. Keeps projects where the newest release on some development branch declares support for it. With missing=true, keeps projects with no such branch. | |
| min_installs | No | Filter: reported install base at or above this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses ordering by install base, paging via next_offset, filter combination semantics, and the exact core_minor algorithm (newest release on each development branch, patch-level constraint matching, unreleased tip changes not seen). This is substantial behavioral detail and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but not padded; purpose, examples, filtering semantics, and return shape are each covered in compact, organized bullets. Front-loading the core purpose and ordering makes the tool easy to understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by specifying the row fields, count, and next_offset behavior. Combined with full parameter documentation and annotations covering safety guarantees, an agent has everything it needs to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all parameters at 100% coverage, so the baseline is 3. The description adds meaningful semantics beyond the schema, especially for core_minor and missing: it explains how constraints are read, what 'missing' means for upgrade gaps, and that all filters apply to both count and rows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'List drupal.org projects after filters' with deterministic ordering. It gives concrete example queries and even points to sibling tools for the single-project and pending-record cases, so an agent can distinguish it from project_profile and project_upgrade_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples ('top modules without an 11.4 branch', 'themes over 10k installs without security coverage') make the intended use concrete, and the note that project_profile and project_upgrade_report cover one-project and pending-record needs provides some alternative routing. It could be more explicit about when to choose query_dataset or search_code instead, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_symbol_usersProjects using core symbolsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fqn | No | One core symbol, as lookup_core_symbol takes it. Pass this or a filter. | |
| kind | No | Filter: one symbol kind (function, method, class, library, hook, service …). | |
| limit | No | Projects per page, 1 to 100 (default 50). | |
| offset | No | Skip this many projects. Pass the previous next_offset. | |
| status | No | Filter: deprecated | scheduled_removal (still present) | removed (gone). | |
| matched | No | Matched symbols listed on the envelope, 1 to 50 (default 20). | |
| symbols | No | Symbols per project row, 1 to 30 (default 10), heaviest first. | |
| subsystem | No | Filter: a core subsystem (Entity API, Views), case-insensitive. subsystem_coupling with no arguments lists them. | |
| removal_in | No | Filter: removal stamp in this core minor (13.0). With status=scheduled_removal: still present, going away then. | |
| deprecated_in | No | Filter: symbols deprecated in this core minor (11.4). |
TDQS
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.
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.
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.
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.
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.
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.
lookup_core_symbolOne core symbol: status and usersARead-onlyIdempotentInspect
Answer "is this core symbol safe to use, and who still uses it" for one symbol. A name that resolves to nothing returns the catalog entries containing it instead. Every user in pages: list_symbol_users. Changed between versions: what_changed. Code text: search_code.
fqn forms: a namespaced name with or without the leading backslash, a bare function or constant name, a prefixed pseudo-symbol, or a fragment. Pseudo-symbols: fn:check_markup, core:hook:preprocess_page, core:library:claro/drupal.shortcut. Fragments: fromRoute, EntityInterface.
Resolved (found true): symbol, with status flags. removed: gone. scheduled_removal: still present, @deprecated gives the removal version. deprecated, internal. placeholder: a catalog row no scanner located. audience: contrib, test_support, test or theme. usage: contrib development branches only, from the evidence rollup as of evidence_built_at. It has projects and branches counts, plus top_projects (≤ 30) by install base. change_records: records that touched the symbol, each with nid for get_change_record.
Not resolved (found false): count: catalog entries containing the fragment, case-insensitive, public symbols only; kind narrows. candidates: a head of up to candidates entries, each with fqn, kind, subsystem, stamps, projects_using, change_record_nids. Entries starting with the fragment come first, then by projects_using. Call again with one fqn.
| Name | Required | Description | Default |
|---|---|---|---|
| fqn | Yes | Core symbol name, or part of one. A namespaced name with or without the leading backslash (Drupal\Core\Entity\EntityInterface, Drupal\Core\Recipe\RecipeRunner::installModule). A bare function or constant name (check_markup, DRUPAL_DISABLED). A prefixed pseudo-symbol as what_changed reports it (fn:check_markup, core:hook:preprocess_page, core:library:claro/drupal.shortcut). A fragment of 3+ characters (fromRoute), which returns candidates when no symbol has that exact name. | |
| kind | No | Restrict candidates to one symbol kind (class, method, function, hook, library, service …). | |
| candidates | No | When the name resolves to no symbol: how many catalog entries containing it to return, 1 to 50 (default 10). | |
| top_projects | No | How many using projects to return in the ranked head. Defaults to 10, capped at 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds substantial behavioral detail beyond those annotations: the meaning of status flags like removed, scheduled_removal, deprecated, placeholder; the audience and usage scope; the evidence rollup timestamp; and the exact fallback behavior for unresolved fragments, including ordering and calling again with one fqn.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well structured: a one-sentence purpose, sibling routing, then terse bullet-like sections for fqn forms, resolved output, and unresolved output. Every sentence carries distinct information; nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters, no output schema, and two very different response modes (resolved vs. fragment fallback), the description covers both modes, the field types returned, the sorting and caps, the fqn input forms, and the relevant sibling tools. An agent has enough to invoke the tool correctly and interpret the main output without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters well. The description adds meaningful extra semantics: case-insensitive matching for fragments, public-symbols-only scope, candidates ordering ('entries starting with the fragment come first, then by projects_using'), and the top_projects cap context. This exceeds the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'Answer is this core symbol safe to use, and who still uses it for one symbol.' It also distinguishes its fragment-lookup behavior from exact symbol lookup and names sibling tools that cover related but different needs, so an agent can tell it apart from list_symbol_users, what_changed, and search_code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes to alternatives: 'Every user in pages: list_symbol_users. Changed between versions: what_changed. Code text: search_code.' It also explains when the tool switches from exact lookup to candidate listing ('A name that resolves to nothing returns the catalog entries containing it instead'), giving clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_profileProject profileARead-onlyIdempotentInspect
Answer "what is this contrib project, how big is it, which core versions does it support, what moves with it" for one drupal.org project. Pending change records: project_upgrade_report. Core symbols it calls: list_symbol_users.
project: title, type, status, security, installs. installs_by_version: install base per contrib version.
dev_branches: each scanned development branch, with installs, core_constraint, core_minors, latest commit date and era. core_constraint: the composer constraint of the newest release on that line, as drupal.org publishes it. The unreleased tip is excluded. core_minors: the minors it admits; a minor counts when any patch satisfies. latest_core_minor: the newest admitted.
releases: newest first, up to releases, each with core_compatibility and security. release_count, supported_branches. missing_sections: what the bundle could not fill.
related (summary): requires and required_by counts with the top 3, co_installed top 3 or a note, delta_12m per release line ("*" is the total).
include=["related"]: related becomes the full report. requires: every dependency, via info_yml or composer, core modules left out. required_by: paged by installs, with count and next_offset; page with dependents and dependents_offset. co_installed: rho, rank, method residual_spearman, or a note.
include=["trend"]: trend has months (oldest first), series per release_line aligned with months (null: no count, "*": total), and lines. Each line: installs_now, share, delta_3m, delta_12m, delta_36m, peak, first_seen, last_seen. Counts are drupal.org month-end installs.
Unknown project: error. An included section refuses when the bundle predates its view.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | With include trend: months of history, 1 to 120 (default 36), ending at the latest month in the data. | |
| include | No | Optional sections: trend (monthly install series per release line) and related (full requires / required_by / co_installed lists, replacing the related summary). | |
| project | Yes | drupal.org project machine name, e.g. webform. The composer name drupal/webform is accepted. | |
| releases | No | Releases to list, newest first, 1 to 30 (default 10). release_count says how many exist. | |
| dependents | No | With include related: dependents per page in required_by, 1 to 100 (default 20). | |
| dependents_offset | No | With include related: dependents to skip. Pass required_by.next_offset from the previous call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds substantial behavioral detail: unknown projects produce an error, included sections can refuse when the bundle predates the view, the unreleased tip is excluded from dev branches, and counts are drupal.org month-end installs. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by dense but organized bullet sections with no filler. Though long, the length is justified by the number of output sections, parameter-dependent behaviors, and edge cases that need explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description inventories all returned sections, defines core_constraint and core_minors semantics, covers error and limitation behavior, and names sibling tools for adjacent data needs. An agent can predict both call semantics and result interpretation without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful beyond-schema behavior for the include parameter: 'related' becomes the full report, required_by uses paging with next_offset, and 'trend' aligns series to months with null and '*' conventions. This is enough to move above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: answer 'what is this contrib project, how big is it, which core versions does it support, what moves with it' for one drupal.org project. It clearly names the resource scope ('one drupal.org project') and points to sibling tools for adjacent concerns such as pending change records and core symbols. This makes it distinguishable from list_projects and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool and names alternatives for adjacent data needs: 'Pending change records: project_upgrade_report. Core symbols it calls: list_symbol_users.' It also explains optional include modes and what they replace. It does not state an explicit global 'when not to use this tool' rule, but the context is strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_upgrade_reportProject upgrade readinessARead-onlyIdempotentInspect
Answer "is this contrib project ready for a target core version, and what work is left". For one record's detail, use get_change_record. For a symbol's users, use list_symbol_users.
A record applies when it targets the target version or earlier, and a development branch of the project matched one of its tracks.
Verdict per record: outstanding (a branch still calls the going-away side), in_progress (some branches moved), adopted (all moved).
Returns counts by verdict, then a ranked head of outstanding records with file and line evidence from the project's own code.
Each entry has the count of other projects outstanding on the same record, and its nid for get_change_record.
removed_symbols: core symbols removed by the target, or scheduled for removal at or before it, that the project's development branches still reference. Each has occurrences, files, and the replacement when the catalog lists one. They need no change record: a class moved to another module, a service dropped. removed_symbol_count: the whole set. The head is newest removal first, then by occurrences. Test and test-support symbols are left out.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Outstanding records to return with evidence, 1 to 15 (default 8). Above the cap the call is refused. | |
| project | Yes | Contrib project machine name as it appears on drupal.org, for example webform. The composer name drupal/webform is accepted. Packages from other vendors (acquia/cohesion) are not in the dataset. | |
| target_version | Yes | Target core version: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent; the description adds substantial behavior beyond that: how records apply, the three verdict states, that output is counts followed by a ranked head, that entries include cross-project counts and nids, and that test/test-support symbols are excluded. This is exactly the extra context agents need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: it states purpose, routes to alternatives, then defines the output contract in dense, organized bullets. There is no filler or repetition, and the most important purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates fully: it explains return shape, verdict counts, ranked outstanding records, per-entry evidence fields, nid linkage, removed_symbols structure, ordering, and exclusions. An agent has enough context to invoke the tool correctly and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already fully documents project, target_version, and limit. The description does not add parameter semantics beyond that, but with complete schema coverage it does not need to; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, non-tautological purpose: answering whether a contrib project is ready for a target core version and what work remains. It also distinguishes itself from sibling tools by explicitly naming get_change_record and list_symbol_users for different granularities of detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear routing guidance: use get_change_record for one record's detail and list_symbol_users for a symbol's users. This tells an agent when not to use project_upgrade_report and which alternatives to pick, satisfying the when/when-not requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_datasetRun SQL over the datasetARead-onlyIdempotentInspect
Run read-only DuckDB SELECTs over the dataset behind the other tools, for a question none of them asks. Call describe_dataset first; it lists the 29 views, their columns, joins and recipes. Prefer a typed tool when one fits.
statements=[…]: up to 5 statements in one call, one result or error each.
Result: columns, and rows as arrays, up to max_rows (≤ 500, default 100) and 16 KB. When truncated is true: aggregate, filter, or use LIMIT and OFFSET. One SELECT (or SHOW, DESCRIBE, FROM-first), no semicolon, 15 s limit, nothing outside the bundle.
Dev-branch isolation: JOIN contrib_branch and filter kind = 'dev_branch' AND project <> 'drupal' before counting projects. change_record_adoption, symbol_usage and core_symbol_evidence hold release tags too. core_symbol_evidence is the full rollup; symbol_usage is its string-scan subset.
Adoption polarity: legacy is still on the old API (not adopted); migrated is adopted. Versions are text: compare _seq integers (major1000+minor). Never SUM(usage) across branch rows.
Errors list the views, the columns of the views you used, or the join map. An empty result over an fqn without a leading backslash gets a hint.
The same views are downloadable as parquet under https://api.tresbien.tech/data/docs. Its cookbook targets api.duckdb plus prelude views this mirror does not have, so take recipes from describe_dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | No | One DuckDB SELECT over the views describe_dataset lists. SHOW TABLES, DESCRIBE <view> and FROM-first syntax also work. No semicolon, one statement. Use statements for several at once. | |
| max_rows | No | Rows to return per statement, 1 to 500 (default 100). The result byte budget may cut a wide result sooner. truncated says so either way. | |
| statements | No | Up to 5 statements in one call. Results come back in order under results, each with its own rows or error. The byte budget is shared. Use this instead of sql for more than one statement. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description substantially extends this with execution behavior: 15-second timeout, no statement outside the bundle, shared byte budget, truncation flag, dev-branch isolation, adoption polarity, and empty-result hints. This is far beyond what the annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and well-structured: a front-loaded purpose sentence, then bulleted operational sections covering result format, isolation rules, polarity pitfalls, error behavior, and external resources. Every section conveys necessary constraints for correct invocation; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the result shape, truncation condition, error behavior, view inventory via describe_dataset, domain-specific adoption polarity, and dev-branch filtering. This is complete enough for an agent to invoke the tool correctly on complex analytical questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial parameter semantics: statements limits of 5 and per-statement results/errors, max_rows cap of 500 with shared 16 KB budget, one SELECT/SHOW/DESCRIBE/FROM-first per statement, no semicolon, and LIMIT/OFFSET guidance on truncation. This meaningfully enriches the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run read-only DuckDB SELECTs over the dataset behind the other tools, for a question none of them asks.' It explicitly frames the tool as a complement to the sibling tools and tells the agent to prefer a typed tool when one fits, making sibling differentiation clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: call describe_dataset first, prefer a typed tool when one fits, and use this tool for questions none of the other tools ask. It also details constraints such as 'no semicolon' and using statements for multiple queries, giving clear when-to-use and how-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reroll_patchRe-roll one patch against a releaseARead-onlyIdempotentInspect
Re-roll one composer patch that check_patches reported conflicts: a 3-way merge of the patch onto the installed release, returned as a new diff. Call check_patches first for the whole list. Call this once per patch that came back conflicts.
Input: project, version, patch, title, base. patch is the diff text; this service downloads nothing, so fetch a URL patch yourself and send what came back. base is the release the site had before the upgrade. One patch per call. A hand-made patch without index lines is merged from base when it applies there, else from the newest tag it applies to. reroll.base is the tag used.
reroll.verified true: the service already ran the check. reroll.verified_by: the command, the -p level and the tag. Write reroll.patch to the patch file and move on. Do not run git apply --check or patch --dry-run. Do not diff against a copy of the release. composer install is the test.
After a conflicts result, send the same project, version and patch again with resolutions, one per region of reroll.conflicts[].hunks. A resolution is {file, region, choice: release|patch}, {file, region, text}, or {file, region, delete: true}. The service re-merges with your decisions and apply-checks the diff. What comes back is the finished patch file: write it and run composer install. Do not read the release files, edit the patch by hand, or dry-run it.
reroll.status clean: every file merged and the diff apply-checked against the release, reroll.verified true. Write reroll.patch as the new patch file; no re-test needed. An empty reroll.patch with reroll.note means the release already has the change; suggested is merged.
reroll.status conflicts: reroll.patch holds the hunks that merged cleanly, apply-checked when reroll.verified is true. Each file in reroll.conflicts has hunks with the three sides of every region. release: what the release has. base: what the patch was written against. patch: what the patch wants. release_line and release_context: the release file's numbered lines around the region. Write the missing hunks from those and append them to reroll.patch. No download, file read or dry-run is needed.
reroll.syntax_errors: files that do not parse after the merge, with the parser's line. reroll.verified is false then, though the diff applies. Fix the text of the resolutions on those files and call again.
reroll.status unavailable: no release takes the patch, or it was made from a commit in no release; reroll.error says which. Re-roll by hand from hunks_failed.
reroll.patch paths are relative to the repository root. Contrib patches apply at -p1. Core patches start with core/ and apply at -p2 from web/core. patch_truncated: the diff was cut to the result budget; POST /v1/patch/check on api.tresbien.tech with reroll: true returns it whole.
A patch that still applies (applies_at set) or is already in the release (merged) returns its verdict with reroll null.
core_references: as on check_patches, read from the re-rolled diff when the merge was clean. Removed or moved core classes, and calls whose argument count no longer fits the target signature, at target_core.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Optional. The release the site had before the upgrade. Its commit sha from composer.lock (source.reference), or its composer version: 6.1.0 when version is 6.2.0. A patch without index lines is merged from it when it applies there, before the newest tags are tried. | |
| patch | Yes | Unified diff text. This service downloads nothing, so fetch a URL patch yourself and send what came back. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from base when it applies there, else from the newest tag it applies to. reroll.base is the tag used. | |
| title | No | Optional, echoed back. | |
| project | Yes | drupal.org machine name (webform) or composer name (drupal/webform); drupal or core for Drupal core. | |
| version | Yes | The composer version installed, e.g. 1.13.0 or 11.4.5. | |
| resolutions | No | Decisions for the conflicted regions of a previous call on the same project, version and patch, one entry per region. region: the index in that file's conflicts[].hunks. {file, region, choice}: choice is release or patch. {file, region, text}: your own text for the region. {file, region, delete: true}: empty the region. The service re-runs the merge with them and apply-checks the result. Regions you leave out keep the release side and come back in reroll.resolutions_missing. | |
| target_core | No | The core version the added code is checked against (11.4.5). Defaults to version for a core patch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavior beyond annotations: the service downloads nothing, patch merging depends on index lines/base, verification semantics (reroll.verified), and exact actions for clean/conflicts/syntax_errors/unavailable states. These details complement the readOnlyHint and idempotentHint annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose and organized by response statuses, making it scannable. It earns its length for a complex re-merge workflow, though a few repeated merge/apply-check notes could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully covers return semantics: reroll.status values, verified/verified_by, patch truncation, path conventions, and core_references. It leaves no major aspect of invocation or interpretation undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds workflow-level meaning on top: 'one patch per call', how base is used for hand-made patches, and the resolution variant shapes, which helps disambiguate cases the schema only lists structurally.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Re-roll one composer patch that check_patches reported conflicts,' and explains the operation as a 3-way merge returned as a new diff. It clearly distinguishes itself from check_patches and other siblings by naming the prerequisite tool and the per-patch scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to call check_patches first, call reroll_patch once per conflicting patch, and provides detailed when-to-use guidance for each reroll.status outcome. It also gives exclusions ('Do not run git apply --check or patch --dry-run') and alternative routes for truncated patches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_composerScan a site's composer files for a core upgradeARead-onlyIdempotentInspect
Which of a site's drupal/* packages need a new release for a target core, and which have none? Send composer.lock and composer.json once; do not query one package at a time. The answer is the release scan for every package, plus extra.patches as check_patches items. Constraints are read by composer's own semver library.
composer_lock: the whole file, or its path to get the upload command. A real lock does not fit a call. With the path, the files go from disk to the api by curl and only the plan comes back. composer_json: adds constraints and extra.patches. Sent as text with a lock path, the command lists every patch to send. target_core: 11.4 or 11.4.5. Empty scans against the installed core (target_is_installed): what can be updated without a core upgrade.
installed_unknown: the release data does not have the installed version; the row offers no older release. installed_from_tag: the project's git tag answered instead. Neither is a finding about the site.
A sub-module has no releases of its own; drupal.org packages it as a metapackage built from its project's release. Its row says submodule_of and has that project's answer. The lock's type, require and extra.drupal.datestamp fields pair a metapackage with its project.
rows, problems first. no_release: no published release supports the target; latest_any and dev_branch say what exists. update: a compatible release the site does not have; latest, latest_core. unknown: not a drupal.org project in the bundle; note says where its releases are. current: installed_supports and nothing newer needed; such a row has package, installed and installed_supports only. counts covers every package even when rows are cut.
candidates, on every row that is not current: the newest three releases, each with version, core constraint, date and supports_target. project_profile adds installs and branches to the same three.
patches: one item per extra.patches entry with the installed version filled in. Pass them to check_patches after composer update; local paths need the file text. A patch on a package outside drupal/ gets no item and no row; outside_drupal lists it.
patches:true answers with plan instead: every patch judged against the release its package would install for target_core. plan.counts: the verdict tally. plan.package_counts: the scan tallies. plan.no_release: the packages that block the target. plan.patches: one row per patch needing a decision (conflicts, unknown, merged). plan.applying: the number that still apply. The scan rows are not in a plan; call again without patches for them.
A patch whose package has no release for the target is judged against the branch when the lock installs a dev version. Otherwise it is unknown, with the reason in note. plan.warnings: a package is in no_release because of something the site controls. Each warning gives the requirement to change: its own constraint, or its minimum stability. A row's project for reroll_patch is its package without the drupal/ prefix.
A plan never has a re-rolled diff. plan.next_step points at reroll_patch, one call per patch, when any patch no longer applies.
bundle_date: when the release data was published. A release after it is invisible here. Confirm a no_release with composer show or drupal.org before acting.
| Name | Required | Description | Default |
|---|---|---|---|
| patches | No | Judge the site's patches in the same call: each one against the release its package would install for target_core. Returns a verdict per patch instead of items to check yourself. | |
| patch_files | No | The text of every patch listed in extra.patches, keyed by the source as written: a path (patches/x.patch) or its base name, or the URL. Only needed with patches:true. Fetch a URL patch yourself and send its text under that URL. For a merge request .patch URL, send its .diff form under a second key too. | |
| target_core | No | Core version to move to, e.g. 11.4 or 11.4.5. Leave empty to scan against the core the site already runs: which packages have a newer release for it. | |
| composer_json | No | The contents of composer.json (require, require-dev, extra.patches). Send the text; this server cannot read your filesystem. Optional; without it there are no constraints and no patches. | |
| composer_lock | Yes | The text of composer.lock. A real lock is too big to paste: send its path (composer.lock) instead. The answer is then the curl command that uploads the files from the site root. | |
| installed_core | No | What each installed release requires of core, keyed by composer name. Read it from the site's own vendor directory: composer show -f json <pkg>, or the drupal/core entry of its composer.json. Send it and the installed release is judged by what it declares. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial behavioral detail: it explains that the server cannot read the filesystem, how the upload command works, the meaning of installed_unknown and installed_from_tag, and the limitation that releases after bundle_date are invisible. It also discloses that a plan request excludes scan rows. This exceeds what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence adds specific, non-redundant detail. It is structured into clear thematic paragraphs (parameters, row types, candidates, patches, plan) and starts with the core purpose. It is appropriately sized for the tool's complexity, though a more concise summary could be considered for strictly minimal usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has nested parameters, multiple modes, and no output schema, the description must explain output behavior. It does this thoroughly: it defines row types (no_release, update, unknown, current), explains candidates and patches, describes plan output structure, and covers edge cases like dev versions and outside_drupal. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema covers 100% of parameters, the description goes far beyond it. It explains how composer_lock can be either text or a path, that an empty target_core scans against installed core, and the purpose of patch_files and composer_json. It clarifies the relationship between metapackages and sub-modules, adding semantic depth that the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise, question-like statement of purpose: 'Which of a site's drupal/* packages need a new release for a target core, and which have none?' It also distinguishes itself from siblings by referencing check_patches and reroll_patch as separate steps, making the core scanning role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to send composer.lock and composer.json once, and not to query one package at a time. It also explains when to use the 'patches' mode and references check_patches for later steps, but it does not explicitly name alternatives such as project_upgrade_report or when not to use this tool. The guidance is strong but could be more explicit about exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codeSearch contrib and core codeARead-onlyIdempotentInspect
Search the source of every indexed contrib project, plus core, for a code pattern: which files, or with by_repo which projects. Who-uses-a-core-symbol counts: list_symbol_users or lookup_core_symbol.
query is a regex. Set literal for exact text with ( [ ] . $ : or a space, and put r: f: lang: case: sym: b: terms in filters. repos: project machine name list. The index runs RE2, which has no lookaround or backreferences.
.module, .install, .theme, .engine, .profile and .inc count as PHP: lang:php includes them and sym: resolves inside them. No language filter is applied for you.
Returns total_matches and total_files plus a head of files (repo, path, matching lines), limit ≤ 50. by_repo: (repo, file_count) rows from a pull of up to 1000 files; total_files is the ceiling; truncated when cut. A parse error returns the index's own message.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Files to return, default 20, cap 50. Ignored with by_repo. | |
| query | Yes | Code to find, a regex unless literal is true. Filters may be inline when literal is false, else in filters. Example: hook_form_alter f:\.module$ | |
| repos | No | Restrict to these projects, by machine name, in one query. | |
| by_repo | No | Return repos as (repo, file_count) instead of files. Pulls up to 1000 files; total_files is the ceiling. | |
| filters | No | Zoekt filters appended as written: r:<repo regex> f:<path regex> lang:<language> b:<branch> sym:<symbol> case:yes. | |
| literal | No | true: query is matched as exact text. Use it for text with ( [ ] $ . such as #[Hook(. With literal, filters go in filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior, and the description adds substantial behavioral detail: RE2 regex limitations, .module/.install/.inc counted as PHP, no automatic language filter, result shape with total_matches/total_files, by_repo semantics, limit cap, and parse-error propagation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It opens with the core purpose, then covers regex syntax, language handling, and return behavior in a structured way. No filler or redundant restatement of the tool name is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description properly explains return values: total_matches, total_files, head of files, and by_repo rows. It also covers edge behavior like truncation, the 50-result cap, the 1000-file pull, and parse-error messages, making it sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description goes beyond the schema by explaining RE2's lack of lookaround/backreferences, which file extensions count as PHP for lang:/sym:, how literal mode interacts with filters, and the by_repo pull/truncation behavior. This adds real meaning to query, literal, filters, and by_repo.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search the source of every indexed contrib project, plus core, for a code pattern.' It also distinguishes the tool from siblings by explicitly saying symbol-use counts belong to list_symbol_users or lookup_core_symbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing: use list_symbol_users or lookup_core_symbol for 'Who-uses-a-core-symbol counts.' It also provides practical guidance on query construction, filters, literal mode, and the absence of an applied language filter, helping the agent decide how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subsystem_couplingSubsystem co-failure graphARead-onlyIdempotentInspect
Answer "what else tends to fail when a merge request touches this core subsystem" from CI history over about 9,000 core merge requests. With issue_nid: "which subsystems does this issue touch, and what co-fails with them". No arguments: the list of subsystems, the same one core_symbol.subsystem and list_symbol_users subsystem= use.
subsystem: a name (Views, case-insensitive) or a bucket (module:views, core_lib:Entity). An unknown one is refused, with the nearest matches.
Edge: touched_bucket → failing_bucket (+ subsystem), lift, co_fail_count, touched_count, failed_count, total_mrs. lift = P(fail | touched) − P(fail | any MR). Self edges are left out.
Floors min_lift (0.05) and min_co_fail (3) drop noise. count: edges above them. edges: up to limit (≤ 50), by lift. When nothing clears the floors, the strongest edges are listed with a note.
issue_nid: touched_subsystems first. A note explains an issue with no MR file data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Edges to return, 1 to 50 (default 20). count says how many pass the floors. | |
| min_lift | No | Keep edges with lift at or above this (default 0.05). | |
| issue_nid | No | A drupal.org core issue nid: reports the subsystems its merge request touches, then the coupling edges from each. | |
| subsystem | No | A core subsystem (Views, Entity API) or a path bucket (module:views, core_lib:Entity). Leave both subsystem and issue_nid empty to get the list of subsystems. | |
| min_co_fail | No | Keep edges seen in at least this many merge requests (default 3). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description reveals important behavior: unknown subsystems are refused with nearest matches, self-edges are omitted, lift is defined, floors filter noise, and edge cases like no clearing edges or no MR file data produce notes. This gives the agent strong expectations of output and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured with clear bullets. Every line adds operational detail, from accepted inputs to output fields and edge-case notes. Despite its length, there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complex 5-parameter tool and no output schema, the description still explains all modes, parameter forms, output edge fields, defaults, filtering behavior, and special-case notes. Nothing critical is left to guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning: subsystem names can be case-insensitive names or buckets like module:views, edge fields are enumerated with a precise lift formula, and the interaction of min_lift/min_co_fail with count and edges is explained. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytical question ('what else tends to fail when a merge request touches this core subsystem') and names the data source (CI history over about 9,000 core merge requests). It also distinguishes the two main calling modes (subsystem vs issue_nid), so the tool's purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage modes: pass subsystem, pass issue_nid, or pass nothing to list subsystems. It also explains how an unknown subsystem is handled. It does not explicitly contrast this tool with sibling alternatives, but the specialized context makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
what_changedCore API diff between versionsARead-onlyIdempotentInspect
Answer "what changed in the core API between two core versions": symbols added, deprecated and removed, as ranked groups with counts. One symbol: lookup_core_symbol. Human write-ups: list_change_records. Every row of one bucket: flat=true with bucket, paged. Every row of the whole diff: the result's bulk block, with attach and sql for the published catalog. Write those rows to a file, so they stay out of the context window.
Bounds are inclusive. Forms: 11.2, 11.2.x, 11.2.0, 11, 11.x. The same version twice is one minor. Upgrading 11.2 → 11.4 means from=11.3. Buckets are independent.
Grouped (default): a head entry is a symbol group; grouped_by is change_record, name_prefix or singleton. head: groups, up to 5. count: symbols. group_count: groups. members: up to 3 per group, highest usage first. Group fields appear only when every member agrees. Rank: max_projects_using desc, then member_count magnitude, tier, count, key; ranked_by states it. When head_covers_all_callers is false, narrow with kind or min_projects_using, or page with offset.
Flat (flat=true, bucket=added, deprecated, removed): rows by projects_using then fqn. Each row: fqn, kind, subsystem, stamp, projects_using, removal_in, removal_kind, replacement when the catalog lists one, change_record_nids. count: public symbols in the bucket after filters. limit ≤ 100. next_offset is absent on the last page.
Filters apply to every count. internal_excluded and test_theme_excluded are counted apart and left out. unplaceable_symbols have no minor in their stamp.
Usage: contrib development branches only, from the evidence rollup as of usage_evidence_built_at. 0 means no caller observed.
change_record_nids: for get_change_record. removal_kind observed: gone. removal_kind scheduled: promised and still present; say "scheduled for removal in 13.0".
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Upper bound, inclusive, same forms. | |
| flat | No | true: one bucket as flat symbol rows, paged, instead of three buckets of ranked groups. Needs bucket. | |
| from | Yes | Lower core version bound, inclusive: 11.2, 11.2.x, 11.2.0, 11, 11.x. Upgrading from 11.2 means from=11.3. | |
| head | No | Groups per bucket, 1 to 5 (default 5). Ignored when flat is true. | |
| kind | No | Restrict to one symbol kind (method, class, function, hook, service, library …). Applies to counts too. | |
| limit | No | With flat: rows per page, 1 to 100 (default 50). A page of very long fqns may come back shorter. next_offset always says where the next page starts. | |
| bucket | No | With flat: which side of the diff to list, added, deprecated, or removed. One bucket per call. | |
| offset | No | Skip this many groups per bucket (grouped) or rows (flat), in ranked order. Flat: pass the previous page's next_offset. | |
| min_projects_using | No | Drop symbols fewer than this many contrib projects call on a development branch. Applies to counts too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnly, idempotent, and non-destructive, and the description adds substantial behavioral detail: inclusive bounds, bucket independence, pagination edge cases, unplaceable symbols, removal_kind semantics, and how filters affect counts. No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but highly structured, with each bullet covering a distinct behavioral aspect of a complex 9-parameter tool. It is front-loaded with the core purpose and then organizes mode-specific details, filters, and usage constraints without significant redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and 9 parameters, the description is exceptionally complete: it explains both output modes, row shapes, grouping rules, ranking, filtering, pagination, limits, data source, and special cases. An agent has nearly everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning well beyond the parameter descriptions: version form semantics, 'from=11.3' upgrade interpretation, flat-mode bucket requirements, limit page-size behavior, offset pagination, and when next_offset is absent. This materially improves correct parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states exactly what the tool does: answer what changed in the core API between two versions, listing added, deprecated, and removed symbols. It also explicitly distinguishes itself from related siblings: lookup_core_symbol for a single symbol and list_change_records for human write-ups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: contrib development branches only, from the evidence rollup. It also names alternatives with one-symbol lookup and human write-up routes, and explains when to choose flat vs grouped mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
- Changed
check_patches2 fields changed- changed
Input schema / properties / composer_json / descriptionPrevious value: -"The text of composer.json, not a path. Its extra.patches becomes the item list, one item per patch."New value: +"The contents of composer.json. Send the text; this server cannot read your filesystem. Its extra.patches becomes the item list, one item per patch." - changed
Input schema / properties / composer_lock / descriptionPrevious value: -"The text of composer.lock, not a path. It gives the installed version of each patched package."New value: +"The contents of composer.lock. It gives the installed version of each patched package."
- Changed
scan_composer2 fields changed- changed
Input schema / properties / composer_json / descriptionPrevious value: -"The text of composer.json, not a path (require, require-dev, extra.patches). Optional; without it there are no constraints and no patches."New value: +"The contents of composer.json (require, require-dev, extra.patches). Send the text; this server cannot read your filesystem. Optional; without it there are no constraints and no patches." - changed
Input schema / properties / composer_lock / descriptionPrevious value: -"The text of composer.lock, not a path."New value: +"The text of composer.lock. A real lock is too big to paste: send its path (composer.lock) instead. The answer is then the curl command that uploads the files from the site root."
- Changed
search_code1 field changed- changed
Input schema / properties / literal / descriptionPrevious value: -"true: query is exact text, not a regex. Use it for text with ( [ ] $ . such as #[Hook(. With literal, filters go in filters."New value: +"true: query is matched as exact text. Use it for text with ( [ ] $ . such as #[Hook(. With literal, filters go in filters."
3 tool updates
- Changed
check_patches4 fields changed- changed
Input schema / properties / items / descriptionPrevious value: -"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: diff text, or a drupal.org or git.drupalcode.org URL. title: optional, echoed back. base: optional, the package's release installed before the upgrade, not version. A commit sha or a composer version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock."New value: +"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: the diff text. This service downloads nothing, so fetch a URL patch yourself and send what came back. source: optional, the path or URL the patch was declared with. merge_patch: optional, the .diff form of a merge request, used for the merge of a re-roll while patch decides the verdict. title: optional, echoed back. base: optional, the release the site had before the upgrade. A commit sha or a composer version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock." - added
Input schema / properties / items / items / properties / merge_patchAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / sourceAdded value: +{ + "type": "string" +} - changed
Input schema / properties / patch_files / descriptionPrevious value: -"The text of each local patch file listed in extra.patches, keyed by the path as written (patches/x.patch) or its base name. URL patches need nothing."New value: +"The text of every patch listed in extra.patches, keyed by the source as written: a path (patches/x.patch) or its base name, or the URL. Fetch a URL patch yourself and send its text under that URL. For a merge request .patch URL, send its .diff form under a second key too."
- Changed
reroll_patch2 fields changed- changed
Input schema / properties / base / descriptionPrevious value: -"Optional. The package's release installed before the upgrade, not version. Its commit sha from composer.lock (source.reference), or its composer version: 6.1.0 when version is 6.2.0. A patch without index lines is merged from it when it applies there, before the newest tags are tried."New value: +"Optional. The release the site had before the upgrade. Its commit sha from composer.lock (source.reference), or its composer version: 6.1.0 when version is 6.2.0. A patch without index lines is merged from it when it applies there, before the newest tags are tried." - changed
Input schema / properties / patch / descriptionPrevious value: -"Unified diff text, or a drupal.org or git.drupalcode.org patch URL. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from base when it applies there, else from the newest tag it applies to. reroll.base is the tag used."New value: +"Unified diff text. This service downloads nothing, so fetch a URL patch yourself and send what came back. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from base when it applies there, else from the newest tag it applies to. reroll.base is the tag used."
- Changed
scan_composer1 field changed- changed
Input schema / properties / patch_files / descriptionPrevious value: -"The text of each local patch file listed in extra.patches, keyed by the path as written (patches/x.patch) or its base name. Only needed with patches:true. URL patches need nothing."New value: +"The text of every patch listed in extra.patches, keyed by the source as written: a path (patches/x.patch) or its base name, or the URL. Only needed with patches:true. Fetch a URL patch yourself and send its text under that URL. For a merge request .patch URL, send its .diff form under a second key too."
2 tool updates
- Changed
check_patches1 field changed- changed
Input schema / properties / items / descriptionPrevious value: -"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: diff text, or a drupal.org or git.drupalcode.org URL. title: optional, echoed back. base: optional, the release the site runs, a commit sha or a version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock."New value: +"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: diff text, or a drupal.org or git.drupalcode.org URL. title: optional, echoed back. base: optional, the package's release installed before the upgrade, not version. A commit sha or a composer version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock."
- Changed
reroll_patch1 field changed- changed
Input schema / properties / base / descriptionPrevious value: -"Optional. The release the site runs: a commit sha, or a composer version. A patch without index lines is merged from it when it applies there, before the newest tags are tried."New value: +"Optional. The package's release installed before the upgrade, not version. Its commit sha from composer.lock (source.reference), or its composer version: 6.1.0 when version is 6.2.0. A patch without index lines is merged from it when it applies there, before the newest tags are tried."
2 tool updates
- Changed
check_patches1 field changed- changed
Input schema / properties / items / descriptionPrevious value: -"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: diff text, or a drupal.org or git.drupalcode.org URL. title: optional, echoed back. Leave empty to build the items from composer_json and composer_lock."New value: +"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: diff text, or a drupal.org or git.drupalcode.org URL. title: optional, echoed back. base: optional, the release the site runs, a commit sha or a version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock."
- Changed
reroll_patch2 fields changed- added
Input schema / properties / baseAdded value: +{ + "description": "Optional. The release the site runs: a commit sha, or a composer version. A patch without index lines is merged from it when it applies there, before the newest tags are tried.", + "type": "string" +} - changed
Input schema / properties / patch / descriptionPrevious value: -"Unified diff text, or a drupal.org or git.drupalcode.org patch URL. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from the newest tag it applies to, given as reroll.base."New value: +"Unified diff text, or a drupal.org or git.drupalcode.org patch URL. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from base when it applies there, else from the newest tag it applies to. reroll.base is the tag used."
1 tool update
- Changed
check_patches1 field changed- added
Input schema / properties / items / items / properties / baseAdded value: +{ + "type": "string" +}
2 tool updates
- Changed
check_patches1 field changed- changed
Input schema / properties / composer_lock / descriptionPrevious value: -"The text of composer.lock, not a path, or the slim {\"packages\":[{\"name\",\"version\"}]} form. It gives the installed version of each patched package."New value: +"The text of composer.lock, not a path. It gives the installed version of each patched package."
- Changed
scan_composer1 field changed- changed
Input schema / properties / composer_lock / descriptionPrevious value: -"The text of composer.lock, not a path, or the slim form {\"packages\":[{\"name\":…,\"version\":…}]} with only drupal/* packages."New value: +"The text of composer.lock, not a path."
14 tool updates
- Changed
describe_dataset3 fields changed- changed
Input schema / properties / recipe / descriptionPrevious value: -"One recipe id from the overview's index: a ready-to-run query_dataset statement with its placeholders explained."New value: +"One recipe id from the overview's index. Returns a ready-to-run query_dataset statement with its placeholders explained." - changed
Input schema / properties / view / descriptionPrevious value: -"One view name: its columns with types and descriptions, an example filter, and the joins that reach it. Leave empty for the overview."New value: +"One view name. Returns its columns with types and descriptions, an example filter, and the joins into it. Leave empty for the overview." - changed
Input schema / properties / views / descriptionPrevious value: -"Several view names at once (up to 8), documented one after the other in one call."New value: +"Up to 8 views at once, documented one after the other in one call."
- Changed
list_change_records2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Lower core version bound, inclusive. Write it the way people say it: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it."New value: +"Lower core version bound, inclusive: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it." - changed
Input schema / properties / limit / descriptionPrevious value: -"How many records to return in the head, 1 to 40 (default 15); above the cap the call is refused."New value: +"Records in the head, 1 to 40 (default 15). Above the cap the call is refused."
- Changed
list_class_relations2 fields changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Skip this many rows in the same ranked order; pass the previous page's next_offset."New value: +"Skip this many rows in the same ranked order. Pass the previous page's next_offset." - changed
Input schema / properties / per_project / descriptionPrevious value: -"Edges shown per project on a page, 1 to 50 (default 3), so one project with many subclasses does not fill the page; each row carries project_edges, the project's full count."New value: +"Edges shown per project on a page, 1 to 50 (default 3). Each row has project_edges, the project's full count."
- Changed
list_projects3 fields changed- changed
Input schema / properties / core_minor / descriptionPrevious value: -"Filter: a core minor in 11.4.x form that the newest release on some development branch declares support for (composer constraint from drupal.org); with missing=true, projects with NO such branch."New value: +"Filter: a core minor in 11.4.x form. Keeps projects where the newest release on some development branch declares support for it. With missing=true, keeps projects with no such branch." - changed
Input schema / properties / offset / descriptionPrevious value: -"Skip this many projects in the same ranked order; pass the previous page's next_offset."New value: +"Skip this many projects in the same ranked order. Pass the previous page's next_offset." - changed
Input schema / properties / security / descriptionPrevious value: -"Filter: security advisory coverage — covered, not-covered, revoked."New value: +"Filter: security advisory coverage: covered, not-covered, revoked."
- Changed
list_symbol_users3 fields changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Skip this many projects; pass the previous next_offset."New value: +"Skip this many projects. Pass the previous next_offset." - changed
Input schema / properties / removal_in / descriptionPrevious 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." - changed
Input schema / properties / subsystem / descriptionPrevious 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."
- Changed
lookup_core_symbol2 fields changed- changed
Input schema / properties / candidates / descriptionPrevious value: -"When the name resolves to no symbol: how many catalog names containing it to return, 1 to 50 (default 10)."New value: +"When the name resolves to no symbol: how many catalog entries containing it to return, 1 to 50 (default 10)." - changed
Input schema / properties / fqn / descriptionPrevious value: -"Core symbol name, or part of one. Namespaced names with or without the leading backslash (Drupal\\Core\\Entity\\EntityInterface, Drupal\\Core\\Recipe\\RecipeRunner::installModule); a bare function or constant name (check_markup, DRUPAL_DISABLED); a prefixed pseudo-symbol as what_changed reports it (fn:check_markup, core:hook:preprocess_page, core:library:claro/drupal.shortcut); or a fragment of 3+ characters (fromRoute), which returns candidates when no symbol has that exact name."New value: +"Core symbol name, or part of one. A namespaced name with or without the leading backslash (Drupal\\Core\\Entity\\EntityInterface, Drupal\\Core\\Recipe\\RecipeRunner::installModule). A bare function or constant name (check_markup, DRUPAL_DISABLED). A prefixed pseudo-symbol as what_changed reports it (fn:check_markup, core:hook:preprocess_page, core:library:claro/drupal.shortcut). A fragment of 3+ characters (fromRoute), which returns candidates when no symbol has that exact name."
- Changed
project_profile2 fields changed- changed
Input schema / properties / dependents_offset / descriptionPrevious value: -"With include related: dependents to skip; pass required_by.next_offset from the previous call."New value: +"With include related: dependents to skip. Pass required_by.next_offset from the previous call." - changed
Input schema / properties / project / descriptionPrevious value: -"drupal.org project machine name, e.g. webform; the composer name drupal/webform is accepted."New value: +"drupal.org project machine name, e.g. webform. The composer name drupal/webform is accepted."
- Changed
project_upgrade_report3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"How many outstanding records to return with evidence, 1 to 15 (default 8); above the cap the call is refused."New value: +"Outstanding records to return with evidence, 1 to 15 (default 8). Above the cap the call is refused." - changed
Input schema / properties / project / descriptionPrevious value: -"Contrib project machine name as it appears on drupal.org, for example webform; the composer name drupal/webform is accepted. Packages from other vendors (acquia/cohesion) are not in the dataset."New value: +"Contrib project machine name as it appears on drupal.org, for example webform. The composer name drupal/webform is accepted. Packages from other vendors (acquia/cohesion) are not in the dataset." - changed
Input schema / properties / target_version / descriptionPrevious value: -"Target core version. Write it the way people say it: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it."New value: +"Target core version: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it."
- Changed
query_dataset3 fields changed- changed
Input schema / properties / max_rows / descriptionPrevious value: -"Rows to return per statement, 1 to 500 (default 100). The result byte budget may cut a wide result sooner; truncated says so either way."New value: +"Rows to return per statement, 1 to 500 (default 100). The result byte budget may cut a wide result sooner. truncated says so either way." - changed
Input schema / properties / sql / descriptionPrevious value: -"One DuckDB SELECT over the views listed in the description. SHOW TABLES, DESCRIBE <view> and FROM-first syntax also work. No semicolon; one statement. Use statements for several at once."New value: +"One DuckDB SELECT over the views describe_dataset lists. SHOW TABLES, DESCRIBE <view> and FROM-first syntax also work. No semicolon, one statement. Use statements for several at once." - changed
Input schema / properties / statements / descriptionPrevious value: -"Up to 5 statements run in one call (explore in one round trip): results come back in order under results, each with its own rows or error; the byte budget is shared. Use instead of sql when you have more than one."New value: +"Up to 5 statements in one call. Results come back in order under results, each with its own rows or error. The byte budget is shared. Use this instead of sql for more than one statement."
- Changed
reroll_patch3 fields changed- changed
Input schema / properties / patch / descriptionPrevious value: -"Unified diff text, or a drupal.org / git.drupalcode.org patch URL. With the index lines git diff writes it is merged onto the release; without them (hand-made) it is merged from the newest tag it applies to, reported as reroll.base."New value: +"Unified diff text, or a drupal.org or git.drupalcode.org patch URL. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from the newest tag it applies to, given as reroll.base." - changed
Input schema / properties / resolutions / descriptionPrevious value: -"Decisions for the conflicted regions of a previous call on the same project, version and patch: one entry per region, {file, region, choice} where region is the index in that file's conflicts[].hunks and choice is release or patch, {file, region, text} to put your own text there instead, or {file, region, delete: true} to empty the region. The service re-runs the merge with them and apply-checks the result. Regions you leave out keep the release side and come back in reroll.resolutions_missing."New value: +"Decisions for the conflicted regions of a previous call on the same project, version and patch, one entry per region. region: the index in that file's conflicts[].hunks. {file, region, choice}: choice is release or patch. {file, region, text}: your own text for the region. {file, region, delete: true}: empty the region. The service re-runs the merge with them and apply-checks the result. Regions you leave out keep the release side and come back in reroll.resolutions_missing." - changed
Input schema / properties / target_core / descriptionPrevious value: -"Core version the code the patch adds is checked against (11.4.5); defaults to version for a core patch."New value: +"The core version the added code is checked against (11.4.5). Defaults to version for a core patch."
- Changed
scan_composer4 fields changed- changed
Input schema / properties / composer_json / descriptionPrevious value: -"The composer.json contents as text, not a path (require, require-dev, extra.patches). Optional: without it there are no constraints and no patches."New value: +"The text of composer.json, not a path (require, require-dev, extra.patches). Optional; without it there are no constraints and no patches." - changed
Input schema / properties / composer_lock / descriptionPrevious value: -"The composer.lock contents as text (not a path), or the slim form {\"packages\":[{\"name\":…,\"version\":…}]} with only drupal/* packages (a few KB instead of hundreds)."New value: +"The text of composer.lock, not a path, or the slim form {\"packages\":[{\"name\":…,\"version\":…}]} with only drupal/* packages." - changed
Input schema / properties / installed_core / descriptionPrevious value: -"What each installed release requires of core, keyed by composer name, read from the site's own vendor directory (composer show -f json <pkg>, or the drupal/core entry of its composer.json). The release data here can be months behind a project; a site cannot. Send it and the installed release is judged as it actually is."New value: +"What each installed release requires of core, keyed by composer name. Read it from the site's own vendor directory: composer show -f json <pkg>, or the drupal/core entry of its composer.json. Send it and the installed release is judged by what it declares." - changed
Input schema / properties / patch_files / descriptionPrevious value: -"Text of each local patch file named in extra.patches, keyed by the path as written (patchs/x.patch) or its base name. Only needed with patches:true; URL patches need nothing."New value: +"The text of each local patch file listed in extra.patches, keyed by the path as written (patches/x.patch) or its base name. Only needed with patches:true. URL patches need nothing."
- Changed
search_code5 fields changed- changed
Input schema / properties / by_repo / descriptionPrevious value: -"Return repos as (repo, file_count) instead of files; pulls up to 1000 files, total_files is the ceiling."New value: +"Return repos as (repo, file_count) instead of files. Pulls up to 1000 files; total_files is the ceiling." - changed
Input schema / properties / limit / descriptionPrevious value: -"Files to return, default 20, cap 50; ignored with by_repo."New value: +"Files to return, default 20, cap 50. Ignored with by_repo." - changed
Input schema / properties / literal / descriptionPrevious value: -"true = query is exact text, not a regex: use it for text with ( [ ] $ . such as #[Hook( ; with literal, filters go in filters."New value: +"true: query is exact text, not a regex. Use it for text with ( [ ] $ . such as #[Hook(. With literal, filters go in filters." - changed
Input schema / properties / query / descriptionPrevious value: -"Code to find; a regex unless literal is true. Filters may be inline when literal is false, else in filters. Example: hook_form_alter f:\\.module$"New value: +"Code to find, a regex unless literal is true. Filters may be inline when literal is false, else in filters. Example: hook_form_alter f:\\.module$" - changed
Input schema / properties / repos / descriptionPrevious value: -"Restrict to these project machine names (one query)."New value: +"Restrict to these projects, by machine name, in one query."
- Changed
subsystem_coupling2 fields changed- changed
Input schema / properties / min_lift / descriptionPrevious value: -"Keep edges with lift at or above this (default 0.05, the survey report's floor)."New value: +"Keep edges with lift at or above this (default 0.05)." - changed
Input schema / properties / subsystem / descriptionPrevious value: -"A core subsystem name (Views, Entity API) or a path bucket (module:views, core_lib:Entity). Leave both subsystem and issue_nid empty to get the directory of subsystem names."New value: +"A core subsystem (Views, Entity API) or a path bucket (module:views, core_lib:Entity). Leave both subsystem and issue_nid empty to get the list of subsystems."
- Changed
what_changed5 fields changed- changed
Input schema / properties / bucket / descriptionPrevious value: -"With flat: which side of the diff to list, added, deprecated, or removed; one bucket per call."New value: +"With flat: which side of the diff to list, added, deprecated, or removed. One bucket per call." - changed
Input schema / properties / flat / descriptionPrevious value: -"true = one bucket as flat symbol rows, paged, instead of three buckets of ranked groups. Needs bucket."New value: +"true: one bucket as flat symbol rows, paged, instead of three buckets of ranked groups. Needs bucket." - changed
Input schema / properties / kind / descriptionPrevious value: -"Restrict to one symbol kind (method, class, function, hook, service, library …); applies to counts too."New value: +"Restrict to one symbol kind (method, class, function, hook, service, library …). Applies to counts too." - changed
Input schema / properties / limit / descriptionPrevious value: -"With flat: rows per page, 1 to 100 (default 50). A page of very long names may come back shorter; next_offset always says where the next page starts."New value: +"With flat: rows per page, 1 to 100 (default 50). A page of very long fqns may come back shorter. next_offset always says where the next page starts." - changed
Input schema / properties / min_projects_using / descriptionPrevious value: -"Drop symbols fewer than this many contrib projects call on a development branch; applies to counts too."New value: +"Drop symbols fewer than this many contrib projects call on a development branch. Applies to counts too."
1 tool update
- Changed
check_patches5 fields changed- changed
Input schema / properties / composer_json / descriptionPrevious value: -"composer.json contents as text (not a path): extra.patches becomes the item list, one per patch."New value: +"The text of composer.json, not a path. Its extra.patches becomes the item list, one item per patch." - changed
Input schema / properties / composer_lock / descriptionPrevious value: -"composer.lock contents as text, not a path (or the slim {\"packages\":[{\"name\",\"version\"}]} form): the installed version of each patched package."New value: +"The text of composer.lock, not a path, or the slim {\"packages\":[{\"name\",\"version\"}]} form. It gives the installed version of each patched package." - changed
Input schema / properties / items / descriptionPrevious value: -"Patches to check, up to 50: project (drupal.org machine name webform or composer name drupal/webform; drupal or core for Drupal core), version (the composer version installed, e.g. 1.13.0 or 11.4.5), patch (unified diff text, or a drupal.org / git.drupalcode.org patch URL), title (optional, echoed back). Leave empty to derive the items from composer_json + composer_lock."New value: +"Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: diff text, or a drupal.org or git.drupalcode.org URL. title: optional, echoed back. Leave empty to build the items from composer_json and composer_lock." - changed
Input schema / properties / patch_files / descriptionPrevious value: -"Text of each local patch file named in extra.patches, keyed by the path as written (patchs/x.patch) or its base name. URL patches need nothing."New value: +"The text of each local patch file listed in extra.patches, keyed by the path as written (patches/x.patch) or its base name. URL patches need nothing." - changed
Input schema / properties / target_core / descriptionPrevious value: -"Core version the code each patch adds is checked against (11.4.5). Defaults to composer.lock's drupal/core, else the version of a drupal item."New value: +"The core version the added code is checked against, 11.4.5. Defaults to the lock's drupal/core, else the version of a drupal item."
2 tool updates
- Changed
check_patches1 field changed- added
Input schema / properties / items / items / properties / resolutions / items / properties / deleteAdded value: +{ + "type": "boolean" +}
- Changed
reroll_patch2 fields changed- changed
Input schema / properties / resolutions / descriptionPrevious value: -"Decisions for the conflicted regions of a previous call on the same project, version and patch: one entry per region, {file, region, choice} where region is the index in that file's conflicts[].hunks and choice is release or patch, or {file, region, text} to put your own text there instead. The service re-runs the merge with them and apply-checks the result. Regions you leave out keep the release side and come back in reroll.resolutions_missing."New value: +"Decisions for the conflicted regions of a previous call on the same project, version and patch: one entry per region, {file, region, choice} where region is the index in that file's conflicts[].hunks and choice is release or patch, {file, region, text} to put your own text there instead, or {file, region, delete: true} to empty the region. The service re-runs the merge with them and apply-checks the result. Regions you leave out keep the release side and come back in reroll.resolutions_missing." - added
Input schema / properties / resolutions / items / properties / deleteAdded value: +{ + "type": "boolean" +}
1 tool update
- Changed
scan_composer1 field changed- added
Input schema / properties / installed_coreAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "What each installed release requires of core, keyed by composer name, read from the site's own vendor directory (composer show -f json <pkg>, or the drupal/core entry of its composer.json). The release data here can be months behind a project; a site cannot. Send it and the installed release is judged as it actually is.", + "type": "object" +}
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
AI-powered codebase analysis — call graphs, security, dead code, complexity. 150+ tools.
Check exact npm/PyPI upgrades for evidence-backed breaking changes; query APIs and components.
Ask a codebase what calls what: search, blast radius, paths between symbols, and diffs.
Dev-registry data: npm/PyPI/Docker/VS Code packages, dep graphs, vulns, 50+ ecosystems.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceProvides read-only code analysis and safe, reversible code refactoring with proven edit plans, previews, and rollback.5131MIT
- FlicenseNot gradedqualityDmaintenanceProvides breaking changes analysis for libraries across multiple languages, enabling version upgrade planning, dependency audits, and migration reports through MCP tool access and expert workflows.-
- AlicenseAqualityAmaintenancePHP static analysis MCP server with 11 tools for querying 60+ code quality metrics, detecting problems (God Class, dependency cycles, SOLID violations), analyzing dependencies, identifying refactoring priorities, and mapping test coverage — all from live analysis data.11390MIT
- AlicenseAqualityDmaintenanceProvides comprehensive code quality analysis with quantitative metrics, historical trends, and refactoring risk prediction for C#, Python, and TypeScript codebases.520MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
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.
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.
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.
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.