Drupal Code Query
REMOTE · MCP.TRESBIEN.TECH · SCANNED AUG 19
Drupal core change records, core symbol lifecycle, and contrib upgrade readiness.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security74
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability63
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6144 tokens (~361/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability check failed: schema churn in the 2 days we've observed: 0 tool removals, 8 breaking changes, 0 auth/transport breaks, 9 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · mcp.tresbien.tech
claude mcp add --transport http tech-tresbien-drupal-code-query https://mcp.tresbien.tech/mcp
[mcp_servers.tech-tresbien-drupal-code-query] url = "https://mcp.tresbien.tech/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tech-tresbien-drupal-code-query": {
"type": "remote",
"url": "https://mcp.tresbien.tech/mcp",
"enabled": true
}
}
} openclaw mcp add tech-tresbien-drupal-code-query --url https://mcp.tresbien.tech/mcp --transport streamable-http
mcp_servers:
tech-tresbien-drupal-code-query:
url: "https://mcp.tresbien.tech/mcp" {
"mcpServers": {
"tech-tresbien-drupal-code-query": {
"type": "http",
"url": "https://mcp.tresbien.tech/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 19 Aug 26 +7
- Stability: 0.03 → fail ▼ security
- Authorization: unverified → partial ▲ security
- The server rewrote its instructions, which are the text every model session reads security
- Tool “subsystem_coupling” rewrote its description, which is the text the model reads security
- Tool “project_profile” rewrote its description, which is the text the model reads security
- Tool “describe_dataset” rewrote its description, which is the text the model reads security
- Tool “find_core_symbol” rewrote its description, which is the text the model reads security
- Tool “list_class_relations” rewrote its description, which is the text the model reads security
- Tool “list_projects” rewrote its description, which is the text the model reads security
- Tool “list_symbol_users” rewrote its description, which is the text the model reads security
- Tool “get_change_record” rewrote its description, which is the text the model reads security
- Tool “list_change_records” rewrote its description, which is the text the model reads security
- Tool “project_upgrade_report” rewrote its description, which is the text the model reads security
- Tool “search_contrib_code” rewrote its description, which is the text the model reads security
- Tool “list_changed_symbols” rewrote its description, which is the text the model reads security
- Tool “lookup_core_symbol” rewrote its description, which is the text the model reads security
- Tool “query_dataset” rewrote its description, which is the text the model reads security
- Tool “what_changed” rewrote its description, which is the text the model reads security
- Tool coverage: 100% → 93% ▼ functional
- Tool “describe_dataset” dropped its output schema ▼ functional
- Tool “find_core_symbol” dropped its output schema ▼ functional
- Tool “get_change_record” dropped its output schema ▼ functional
- Tool “list_change_records” dropped its output schema ▼ functional
- Tool “list_changed_symbols” dropped its output schema ▼ functional
- Tool “list_class_relations” dropped its output schema ▼ functional
- Tool “list_projects” dropped its output schema ▼ functional
- Tool “list_symbol_users” dropped its output schema ▼ functional
- Tool “lookup_core_symbol” dropped its output schema ▼ functional
- Tool “project_profile” dropped its output schema ▼ functional
- Tool “project_upgrade_report” dropped its output schema ▼ functional
- Tool “search_contrib_code” dropped its output schema ▼ functional
- Tool “subsystem_coupling” dropped its output schema ▼ functional
- Tool “what_changed” dropped its output schema ▼ functional
- Tool “query_dataset” dropped its output schema ▼ functional
- Schema quality: 532 → 361 ▲ functional
- Schema quality: 532 → 373 ▲ functional
- Schema quality: 532 → 416 ▲ functional
- Schema quality: 532 → 457 ▲ functional
- Schema quality: 532 → 452 ▲ functional
- Schema quality: 532 → 423 ▲ functional
- Schema quality: 532 → 444 ▲ functional
- Server version: 0.8.0 → 0.9.0 functional
- Server version: 0.7.1 → 0.8.0 functional
- Server version: 0.7.0 → 0.7.1 functional
- Server version: 0.6.0 → 0.7.0 functional
- Server version: 0.4.0 → 0.6.0 functional
- Server version: 0.3.0 → 0.4.0 functional
- New tool “project_trend” functional
- New tool “related_projects” functional
- New tool “find_core_symbol” functional
- New tool “list_class_relations” functional
- New tool “list_projects” functional
- New tool “project_profile” functional
- New tool “subsystem_coupling” functional
- New tool “describe_dataset” functional
- New tool “list_symbol_users” functional
- “list_class_relations” added an optional parameter “per_project” cosmetic
- “list_symbol_users” added an optional parameter “matched” cosmetic
- “describe_dataset” added an optional parameter “views” cosmetic
- “find_core_symbol” added an optional parameter “deprecated_in” cosmetic
- “find_core_symbol” added an optional parameter “removal_in” cosmetic
- “find_core_symbol” added an optional parameter “status” cosmetic
- “list_symbol_users” added an optional parameter “deprecated_in” cosmetic
- “list_symbol_users” added an optional parameter “removal_in” cosmetic
- “query_dataset” added an optional parameter “statements” cosmetic
- “search_contrib_code” added an optional parameter “by_repo” cosmetic
- “search_contrib_code” added an optional parameter “filters” cosmetic
- “search_contrib_code” added an optional parameter “literal” cosmetic
- “list_symbol_users” reworded the description of “fqn” cosmetic
- “list_symbol_users” reworded the description of “kind” cosmetic
- “list_symbol_users” reworded the description of “limit” cosmetic
- “list_symbol_users” reworded the description of “offset” cosmetic
- “list_symbol_users” reworded the description of “removal_in” cosmetic
- “list_symbol_users” reworded the description of “status” cosmetic
- “list_symbol_users” reworded the description of “symbols” cosmetic
- “search_contrib_code” reworded the description of “by_repo” cosmetic
- “search_contrib_code” reworded the description of “filters” cosmetic
- “search_contrib_code” reworded the description of “literal” cosmetic
- “search_contrib_code” reworded the description of “repos” cosmetic
- “what_changed” reworded the description of “from” cosmetic
- “what_changed” reworded the description of “head” cosmetic
- “what_changed” reworded the description of “kind” cosmetic
- “what_changed” reworded the description of “min_projects_using” cosmetic
- “what_changed” reworded the description of “offset” cosmetic
- “what_changed” reworded the description of “to” cosmetic
- “list_projects” reworded the description of “core_minor” cosmetic
- “list_change_records” reworded the description of “limit” cosmetic
- “project_upgrade_report” reworded the description of “limit” cosmetic
- “query_dataset” reworded the description of “max_rows” cosmetic
- “query_dataset” reworded the description of “sql” cosmetic
- “list_symbol_users” reworded the description of “subsystem” cosmetic
- “search_contrib_code” reworded the description of “limit” cosmetic
- “search_contrib_code” reworded the description of “query” cosmetic
- “query_dataset” made “sql” optional cosmetic
- Tool “describe_dataset” changed its title: Describe the dataset cosmetic
- Tool “find_core_symbol” changed its title: Find core symbols by name cosmetic
- Tool “get_change_record” changed its title: One change record cosmetic
- Tool “list_change_records” changed its title: Change records in a version range cosmetic
- Tool “list_changed_symbols” changed its title: Changed symbols, paged cosmetic
- Tool “list_class_relations” changed its title: Contrib classes extending a core class cosmetic
- Tool “list_projects” changed its title: List projects by filters cosmetic
- Tool “list_symbol_users” changed its title: Projects using core symbols cosmetic
- Tool “lookup_core_symbol” changed its title: One core symbol: status and users cosmetic
- Tool “project_profile” changed its title: Project profile cosmetic
- Tool “project_upgrade_report” changed its title: Project upgrade readiness cosmetic
- Tool “query_dataset” changed its title: Run SQL over the dataset cosmetic
- Tool “search_contrib_code” changed its title: Search contrib and core code cosmetic
- Tool “subsystem_coupling” changed its title: Subsystem co-failure graph cosmetic
- Tool “what_changed” changed its title: Core API diff between versions cosmetic
- 18 Aug 26 0
- Tool “list_changed_symbols” rewrote its description, which is the text the model reads security
- Tool “what_changed” rewrote its description, which is the text the model reads security
- Stability: unverified → 0.03 ▲ functional
- 17 Aug 26 60
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 19 Aug 2026 · Probed https://mcp.tresbien.tech/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=mcp.tresbien.tech | CN=YE1,O=Let's Encrypt,C=US | 17 Aug 2026 | 15 Nov 2026 | ECDSA 384 | ECDSA-SHA384 | 5ea6c99bef098ed73e329e7e86c51fee3d0 |
| SANs: mcp.tresbien.tech | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC insecure
Validation of mcp.tresbien.tech. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| tech. | present | 2185 | 13 | Verified |
| tresbien.tech. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| x-content-type-options | nosniff |
| x-frame-options | DENY |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.tresbien.tech/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.tresbien.tech/mcp | HTTPS enforced | 301 | https://mcp.tresbien.tech/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
describe_dataset Describe the dataset ~274
Learn the dataset before writing SQL for query_dataset; call with no arguments first. Returns text. Prefer a typed tool when one answers the question. - No arguments: every view with one line, the join map, the four invariants (dev-branch isolation, no SUM(usage), *_seq compares, adoption polarity), the gotchas behind empty results (fqn forms, placeholders, machine names), the recipe index. - view=<name>, or views=[…] for several in one call: columns with types and descriptions, an example filter that returns rows, the joins that reach the view. - recipe=<id>: a ready-to-run statement for a common question (who uses a symbol, deprecated symbols per project, a change record's adoption, symbols deprecated between minors, one project's deprecated uses, change records between minors); substitute the placeholders and run it with query_dataset.
| Name | Type | Req | Description |
|---|---|---|---|
| recipe | string | – | One recipe id from the overview's index: a ready-to-run query_dataset statement with its placeholders explained. |
| view | string | – | One view name: its columns with types and descriptions, an example filter, and the joins that reach it. Leave empty for the overview. |
| views | null|array | – | Several view names at once (up to 8), documented one after the other in one call. |
No output schema declared.
No examples provided.
find_core_symbol Find core symbols by name ~375
Find core symbols by part of their name when the exact fqn is unknown; then call lookup_core_symbol or list_symbol_users with the fqn. For code text use search_contrib_code. - query matches anywhere in the stored fqn, case-insensitive, 3+ characters; no prefix or backslash needed. Filters: kind, status (deprecated | scheduled_removal | removed), removal_in (13.0), deprecated_in (11.4); include_internal adds @internal, test and theme symbols. - count = whole match set; rows a head of limit (≤ 50), names starting with the query first, then projects_using, then shorter names. Row: fqn, kind, subsystem, added_in, deprecated_in, removal_in, removal_kind, internal, placeholder, projects_using, change_record_nids.
| Name | Type | Req | Description |
|---|---|---|---|
| deprecated_in | string | – | Filter: deprecated in this core minor (11.4). |
| include_internal | boolean | – | Also return @internal, test-only and theme-internal symbols, which are left out by default. |
| kind | string | – | Restrict to one symbol kind (class, method, function, hook, library, service …). |
| limit | integer | – | Rows in the head, 1 to 50 (default 20). count says how many matched in all; narrow the query rather than raising limit. |
| query | string | yes | Part of a symbol name, 3+ characters, case-insensitive: fromRoute, EntityInterface, check_markup, Drupal\\Core\\Url. Matched anywhere in the stored fqn. |
| removal_in | string | – | Filter: removal stamp names this core minor (13.0). |
| status | string | – | Filter: deprecated, scheduled_removal (still present, removal announced), or removed. |
No output schema declared.
No examples provided.
get_change_record One change record ~252
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 what_changed's change_record_nids; for one symbol's detail use lookup_core_symbol. - Flavour: coming-break (API going away), coming-new-API (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 (not adopted); migrated = moved. - Returns counts across every affected project plus a ranked head, outstanding first. For one project use project_upgrade_report rather than raising 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, which is common.
| Name | Type | Req | Description |
|---|---|---|---|
| nid | integer | yes | The change record's drupal.org node id, for example 3581981. |
| top_projects | integer | – | How many impacted projects to return in the ranked head. Defaults to 10, capped at 40. |
No output schema declared.
No examples provided.
list_change_records Change records in a version range ~331
List the core change records (the human write-ups) targeting 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 inclusive; forms 11.2, 11.2.x, 11.2.0, 11, 11.x. A bare major covers the whole major. - Flavours: coming-break (an API going away), coming-new-API (one being added), landed-but-still-relevant (already shipped). policy-only records target no version and never appear here. - project narrows to one maintainer's view: each record then carries how many of that project's development branches are still on the legacy side. - Returns the count of every record in range plus a ranked head; each entry carries its nid for get_change_record.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | 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 starts at its first minor. |
| limit | integer | – | How many records to return in the head, 1 to 40 (default 15); above the cap the call is refused. |
| project | string | – | Optional contrib project machine name. Narrows the list to records a development branch of that project still matches. |
| to | string | yes | Upper core version bound, inclusive. Same forms as from. A bare major covers every minor of it. |
No output schema declared.
No examples provided.
list_changed_symbols Changed symbols, paged ~376
List one bucket (added, deprecated, removed) of the core API diff between two versions as flat rows, paged. what_changed gives the same range as ranked groups; its bulk gives every row in one DuckDB call. - Bounds and forms as what_changed; bucket required. count = public symbols after filters; kind and min_projects_using narrow count and rows together. - Rows by projects_using (contrib projects on a development branch, evidence as of usage_evidence_built_at) then fqn: fqn, kind, subsystem, stamp, projects_using, removal_in, removal_kind (observed = gone, scheduled = promised), change_record_nids → get_change_record. Internal, test and theme symbols left out. next_offset absent on the last page.
| Name | Type | Req | Description |
|---|---|---|---|
| bucket | string | yes | Which side of the diff to list: added, deprecated, or removed. Required; one bucket per call. |
| from | string | yes | Lower core version bound, inclusive, as on what_changed: 11.2, 11.2.x, 11.2.0, 11, or 11.x. |
| kind | string | – | Restrict to one symbol kind, as on what_changed. Applies to count as well as rows. |
| limit | integer | – | 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. |
| min_projects_using | integer | – | Drop symbols fewer than this many contrib projects call on a development branch. Applies to count as well as rows. |
| offset | integer | – | Skip this many rows in the same ranked order. Pass the previous page's next_offset. |
| to | string | yes | Upper core version bound, inclusive. Same forms as from. |
No output schema declared.
No examples provided.
list_class_relations Contrib classes extending a core class ~371
List the contrib classes that extend, implement or use a core class, interface or trait, one row per edge with file and line, paged: "who subclasses FormBase". Call-site counts: list_symbol_users; the symbol's status: lookup_core_symbol. - target with or without the leading backslash; unknown → refused, pointing at find_core_symbol. rel_kind narrows to one of extends, implements, uses_trait; project to one machine name. - Development branches only. edge_count = every edge, project_count = projects, count = edges after the per_project cap (default 3 per project per page, so "top projects" reads off one page; project_edges on each row is the full count; per_project=50 with project= lists one project in full). - Rows by project installs, project, source_fqn: project, branch, installs, source_fqn, rel_kind, file, line, project_edges. limit ≤ 100; next_offset absent on the last page.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Rows per page, 1 to 100 (default 50). |
| offset | integer | – | Skip this many rows in the same ranked order; pass the previous page's next_offset. |
| per_project | integer | – | 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. |
| project | string | – | Restrict to one project machine name. |
| rel_kind | string | – | extends, implements, or uses_trait; any when absent. |
| target | string | yes | The core class, interface or trait, with or without the leading backslash: Drupal\\Core\\Form\\FormBase. |
No output schema declared.
No examples provided.
list_projects List projects by filters ~412
List drupal.org projects after filters, largest install base first, paged: "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 (drupal.org metadata, composer/semver; a minor counts when any patch of it satisfies); 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 absent on the last page.
| Name | Type | Req | Description |
|---|---|---|---|
| core_minor | string | – | 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. |
| era | string | – | Filter: d8plus (Drupal 8+ code) or pre_d8, on any development branch. |
| limit | integer | – | Projects per page, 1 to 100 (default 50). |
| min_installs | integer | – | Filter: reported install base at or above this. |
| missing | boolean | – | Invert core_minor: keep projects whose development branches do not declare it. |
| offset | integer | – | Skip this many projects in the same ranked order; pass the previous page's next_offset. |
| security | string | – | Filter: security advisory coverage — covered, not-covered, revoked. |
| type | string | – | Filter: project_module, project_theme, project_distribution, project_general, project_theme_engine, project_translation. |
No output schema declared.
No examples provided.
list_symbol_users Projects using core symbols ~480
List every contrib project using one core symbol or any symbol in a class of symbols, one row per project, paged — and the matched symbols themselves. 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). "Top modules still calling a method going away in 13.0" = kind=method, status=scheduled_removal, removal_in=13.0. Filters take public symbols only. - Development branches only, evidence rollup as of evidence_built_at. count = projects; symbol_count = matched symbols, listed in symbols_matched (≤ matched, most-used first, with stamps, projects_using, change_record_nids). - Rows by installs, occurrences, name: project, title, installs, branch, branches, symbol_count, occurrences, symbols (heaviest first, each fqn, kind, removal_in, occurrences, files, change_record_nids → get_change_record). next_offset absent on the last page.
| Name | Type | Req | Description |
|---|---|---|---|
| deprecated_in | string | – | Filter: symbols deprecated in this core minor (11.4). |
| fqn | string | – | One core symbol, as lookup_core_symbol takes it. Pass this or a filter. |
| kind | string | – | Filter: one symbol kind (function, method, class, library, hook, service …). |
| limit | integer | – | Projects per page, 1 to 100 (default 50). |
| matched | integer | – | Matched symbols listed on the envelope, 1 to 50 (default 20). |
| offset | integer | – | Skip this many projects; pass the previous next_offset. |
| removal_in | string | – | Filter: removal stamp in this core minor (13.0); with status=scheduled_removal = still present, going away then. |
| status | string | – | Filter: deprecated | scheduled_removal (still present) | removed (gone). |
| subsystem | string | – | Filter: a core subsystem name (Entity API, Views), case-insensitive; subsystem_coupling with no arguments lists them. |
| symbols | integer | – | Symbols per project row, 1 to 30 (default 10), heaviest first. |
No output schema declared.
No examples provided.
lookup_core_symbol One core symbol: status and users ~312
Answer "is this core symbol safe to use, and who still uses it" for one symbol. Every user in pages: list_symbol_users. Changed between versions: what_changed. - fqn forms: namespaced with or without the leading backslash, a bare function or constant name, or a prefixed pseudo-symbol (fn:check_markup, core:hook:preprocess_page, core:library:claro/drupal.shortcut). - status lists every flag: removed (gone), scheduled_removal (@deprecated names the version, still present), deprecated, internal, placeholder (catalog row no scanner located). audience: contrib | test_support | test | theme. - Usage: contrib development branches only, evidence rollup as of evidence_built_at; projects and branches counts plus top_projects (≤ 30) by install base. - change_records: records that touched the symbol, with nid for get_change_record.
| Name | Type | Req | Description |
|---|---|---|---|
| fqn | string | yes | Core symbol name. Namespaced names with or without the leading backslash (Drupal\Core\Entity\EntityInterface, Drupal\Core\Recipe\RecipeRunner::installModule); a bare function or constant name (check_… |
| top_projects | integer | – | How many using projects to return in the ranked head. Defaults to 10, capped at 30. |
No output schema declared.
No examples provided.
project_profile Project profile ~269
Answer "what is this contrib project, how big is it, which core versions does it support" 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 (composer constraint of the newest release on that line, from drupal.org — not the unreleased tip), core_minors it admits (a minor counts when any patch satisfies), latest commit date, era. latest_core_minor = newest admitted. - releases (newest first, ≤ releases, with core_compatibility and security), release_count, supported_branches. missing_sections names what the bundle could not fill. - related: requires/required_by counts + top 3 (full lists: related_projects), co_installed top 3 or a note, delta_12m per release line ("*" = total; history: project_trend).
| Name | Type | Req | Description |
|---|---|---|---|
| project | string | yes | drupal.org project machine name, e.g. webform. |
| releases | integer | – | Releases to list, newest first, 1 to 30 (default 10). release_count says how many exist. |
No output schema declared.
No examples provided.
project_trend Project install trend ~228
Answer "how is this project's install base moving, and on which release line" for one drupal.org project. Current facts and versions: project_profile; who depends on it: related_projects. - months: the window, oldest first (YYYY-MM); series: one list per release_line aligned with months, null where no count; "*" is the project total. Values are drupal.org's month-end reported installs. - lines: per release_line installs_now, share of the total, delta_3m / delta_12m / delta_36m (null when that month is absent), peak_installs + peak_month, first_seen / last_seen (months with installs > 0). Total row first, then lines by installs_now. - Unknown project or no series: error. Refuses when the bundle predates the usage views.
| Name | Type | Req | Description |
|---|---|---|---|
| months | integer | – | Months of history to return, 1 to 120 (default 36), ending at the latest month in the data. |
| project | string | yes | drupal.org project machine name, e.g. token. |
No output schema declared.
No examples provided.
project_upgrade_report Project upgrade readiness ~266
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 carries how many other projects are outstanding on the same record (wait for upstream or not) and its nid for get_change_record.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many outstanding records to return with evidence, 1 to 15 (default 8); above the cap the call is refused. |
| project | string | yes | Contrib project machine name as it appears on drupal.org, for example webform. |
| target_version | string | yes | 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 means the end of that major. |
No output schema declared.
No examples provided.
query_dataset Run SQL over the dataset ~588
Run read-only DuckDB SELECTs over the dataset behind the other tools, for a question none of them asks. Call describe_dataset first; prefer a typed tool when one fits. Views: change_record, change_record_adoption, change_record_contrib_impact, change_record_issue, change_record_matches, change_record_symbol, change_record_track, contrib_branch, contrib_branch_core_compat, core_coupling_edge, core_issue_subscriber, core_minor_release, core_path_subsystem, core_symbol, core_symbol_evidence, issue, issue_first_fix_date, issue_subsystem_touched, pipeline_stamps, project, project_coinstall, project_dependency, project_usage_breakdown, project_usage_monthly, project_usage_trend, relation_at_branch, release, supportedbranch, symbol_usage. - statements=[…] runs up to 5 in one call, one result or error each — explore in one round trip. - Result: columns, rows as arrays, ≤ max_rows (≤ 500, default 100) and ≤ 16 KB; truncated → aggregate, filter, LIMIT/OFFSET. Single 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, core_symbol_evidence carry release tags too; core_symbol_evidence is the full rollup, symbol_usage its string-scan subset). - Adoption polarity: legacy = still on the old API (NOT adopted); migrated = adopted. Versions are text: compare *_seq integers (major*1000+minor). Never SUM(usage) across branch rows. - Errors name the views, the columns of the views you used, or the join map; an empty result over a backslash-less fqn carries 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 carry, so take recipes from describe_dataset.
| Name | Type | Req | Description |
|---|---|---|---|
| max_rows | integer | – | 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. |
| sql | string | – | 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. |
| statements | null|array | – | 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… |
No output schema declared.
No examples provided.
related_projects Related projects ~254
Answer "what moves with this project: what it requires, who requires it, what sites install alongside it" for one drupal.org project. Install history: project_trend; facts and versions: project_profile. - requires: every project it depends on (development branches), with installs, via (info_yml = a module's info.yml dependencies, with the declaring branches; composer = composer.json require incl. require-dev of the clone HEAD). Core modules are left out. - required_by: dependents paged by installs (count = all of them, next_offset absent on the last page), same via / branches. - co_installed: projects whose install curves move together (rho, rank; method residual_spearman over the stated universe). A note replaces the list when the project is outside that universe or the data is not published. - Unknown project: error. Refuses when the bundle predates project_dependency.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Dependents per page, 1 to 100 (default 20). |
| offset | integer | – | Dependents to skip; use next_offset from the previous page. |
| project | string | yes | drupal.org project machine name, e.g. webform. |
No output schema declared.
No examples provided.
search_contrib_code Search contrib and core code ~383
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 ( [ ] . $ and put r: f: lang: case: sym: b: terms in filters. repos takes machine names. - .module, .install, .theme, .engine, .profile, .inc count as PHP (lang:php reaches them; 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 ≤ 1000 files, total_files the ceiling, truncated when cut. A parse error returns the index's own message.
| Name | Type | Req | Description |
|---|---|---|---|
| by_repo | boolean | – | Return repos as (repo, file_count) instead of files; pulls up to 1000 files, total_files is the ceiling. |
| filters | string | – | Zoekt filters appended as written: r:<repo regex> f:<path regex> lang:<language> b:<branch> sym:<symbol> case:yes. |
| limit | integer | – | Files to return, default 20, cap 50; ignored with by_repo. |
| literal | boolean | – | Treat query as exact text (for ( [ ] $ . as in #[Hook(); filters go in filters. |
| query | string | 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 | null|array | – | Restrict to these project machine names (one query). |
No output schema declared.
No examples provided.
subsystem_coupling Subsystem co-failure graph ~393
Answer "what else tends to fail when a merge request touches this core subsystem" from CI history over ~9,000 core MRs; with issue_nid, "which subsystems does this issue touch and what co-fails with them". No arguments: the directory of subsystem names (shared by core_symbol.subsystem and list_symbol_users subsystem=). - subsystem resolves a name (Views, case-insensitive) or a bucket (module:views, core_lib:Entity); unknown → refused with the nearest names. - 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 left out. - Floors min_lift (0.05) and min_co_fail (3) drop noise; count = edges above them, edges ≤ 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 | Type | Req | Description |
|---|---|---|---|
| issue_nid | integer | – | A drupal.org core issue nid: reports the subsystems its merge request touches, then the coupling edges from each. |
| limit | integer | – | Edges to return, 1 to 50 (default 20). count says how many pass the floors. |
| min_co_fail | integer | – | Keep edges seen in at least this many merge requests (default 3). |
| min_lift | number | – | Keep edges with lift at or above this (default 0.05, the survey report's floor). |
| subsystem | string | – | 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. |
No output schema declared.
No examples provided.
what_changed Core API diff between versions ~490
Answer "what changed in the core API between two core versions": symbols added, deprecated, removed, as ranked groups with counts. One symbol: lookup_core_symbol. Human write-ups: list_change_records. Every row: list_changed_symbols, or bulk (attach + sql for the published catalog, rows to disk not context). - Bounds inclusive; forms 11.2, 11.2.x, 11.2.0, 11, 11.x; same version twice = one minor; upgrading 11.2 → 11.4 means from=11.3. Buckets are independent. - A head entry is a symbol group (grouped_by: change_record | name_prefix | singleton); head counts groups (≤ 5), count symbols, group_count groups; members ≤ 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). head_covers_all_callers false → narrow with kind / min_projects_using or page with offset. Filters apply to every count. - internal_excluded and test_theme_excluded are counted apart and left out of heads; unplaceable_symbols have no minor in their stamp. - Usage = contrib development branches only, evidence rollup as of usage_evidence_built_at; 0 = no caller observed. - change_record_nids per group → get_change_record. removal_kind observed = gone, scheduled = promised and still present (say "scheduled for removal in 13.0").
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | 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 | integer | – | Groups per bucket, 1 to 5 (default 5). |
| kind | string | – | Restrict to one symbol kind (method, class, function, hook, service, library …); applies to counts too. |
| min_projects_using | integer | – | Drop symbols fewer than this many contrib projects call on a development branch; applies to counts too. |
| offset | integer | – | Skip this many groups per bucket, in ranked order. |
| to | string | yes | Upper bound, inclusive, same forms. |
No output schema declared.
No examples provided.