Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Drupal Code Query

REMOTE · MCP.TRESBIEN.TECH · SCANNED AUG 19

Drupal core change records, core symbol lifecycle, and contrib upgrade readiness.

67 Trust /100
Trust breakdown (6 categories)

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
Transport & Reachability100
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
Install

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

# add to Claude Code
claude mcp add --transport http tech-tresbien-drupal-code-query https://mcp.tresbien.tech/mcp
# ~/.codex/config.toml
[mcp_servers.tech-tresbien-drupal-code-query]
url = "https://mcp.tresbien.tech/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tech-tresbien-drupal-code-query": {
      "type": "remote",
      "url": "https://mcp.tresbien.tech/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add tech-tresbien-drupal-code-query --url https://mcp.tresbien.tech/mcp --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  tech-tresbien-drupal-code-query:
    url: "https://mcp.tresbien.tech/mcp"
// mcp.json
{
  "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.

Changelog

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.

Diagnostics

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
MCP tools · 17 exposed · ~6,054 tokens

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.

Tool Tokens
describe_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.

NameTypeReqDescription
recipestringOne recipe id from the overview's index: a ready-to-run query_dataset statement with its placeholders explained.
viewstringOne view name: its columns with types and descriptions, an example filter, and the joins that reach it. Leave empty for the overview.
viewsnull|arraySeveral 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 ~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.

NameTypeReqDescription
deprecated_instringFilter: deprecated in this core minor (11.4).
include_internalbooleanAlso return @internal, test-only and theme-internal symbols, which are left out by default.
kindstringRestrict to one symbol kind (class, method, function, hook, library, service …).
limitintegerRows in the head, 1 to 50 (default 20). count says how many matched in all; narrow the query rather than raising limit.
querystringyesPart of a symbol name, 3+ characters, case-insensitive: fromRoute, EntityInterface, check_markup, Drupal\\Core\\Url. Matched anywhere in the stored fqn.
removal_instringFilter: removal stamp names this core minor (13.0).
statusstringFilter: deprecated, scheduled_removal (still present, removal announced), or removed.

No output schema declared.

No examples provided.

get_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.

NameTypeReqDescription
nidintegeryesThe change record's drupal.org node id, for example 3581981.
top_projectsintegerHow 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 ~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.

NameTypeReqDescription
fromstringyesLower 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.
limitintegerHow many records to return in the head, 1 to 40 (default 15); above the cap the call is refused.
projectstringOptional contrib project machine name. Narrows the list to records a development branch of that project still matches.
tostringyesUpper 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 ~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.

NameTypeReqDescription
bucketstringyesWhich side of the diff to list: added, deprecated, or removed. Required; one bucket per call.
fromstringyesLower core version bound, inclusive, as on what_changed: 11.2, 11.2.x, 11.2.0, 11, or 11.x.
kindstringRestrict to one symbol kind, as on what_changed. Applies to count as well as rows.
limitintegerRows 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_usingintegerDrop symbols fewer than this many contrib projects call on a development branch. Applies to count as well as rows.
offsetintegerSkip this many rows in the same ranked order. Pass the previous page's next_offset.
tostringyesUpper core version bound, inclusive. Same forms as from.

No output schema declared.

No examples provided.

list_class_relations ~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.

NameTypeReqDescription
limitintegerRows per page, 1 to 100 (default 50).
offsetintegerSkip this many rows in the same ranked order; pass the previous page's next_offset.
per_projectintegerEdges 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.
projectstringRestrict to one project machine name.
rel_kindstringextends, implements, or uses_trait; any when absent.
targetstringyesThe core class, interface or trait, with or without the leading backslash: Drupal\\Core\\Form\\FormBase.

No output schema declared.

No examples provided.

list_projects ~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.

NameTypeReqDescription
core_minorstringFilter: 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.
erastringFilter: d8plus (Drupal 8+ code) or pre_d8, on any development branch.
limitintegerProjects per page, 1 to 100 (default 50).
min_installsintegerFilter: reported install base at or above this.
missingbooleanInvert core_minor: keep projects whose development branches do not declare it.
offsetintegerSkip this many projects in the same ranked order; pass the previous page's next_offset.
securitystringFilter: security advisory coverage — covered, not-covered, revoked.
typestringFilter: project_module, project_theme, project_distribution, project_general, project_theme_engine, project_translation.

No output schema declared.

No examples provided.

list_symbol_users ~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.

NameTypeReqDescription
deprecated_instringFilter: symbols deprecated in this core minor (11.4).
fqnstringOne core symbol, as lookup_core_symbol takes it. Pass this or a filter.
kindstringFilter: one symbol kind (function, method, class, library, hook, service …).
limitintegerProjects per page, 1 to 100 (default 50).
matchedintegerMatched symbols listed on the envelope, 1 to 50 (default 20).
offsetintegerSkip this many projects; pass the previous next_offset.
removal_instringFilter: removal stamp in this core minor (13.0); with status=scheduled_removal = still present, going away then.
statusstringFilter: deprecated | scheduled_removal (still present) | removed (gone).
subsystemstringFilter: a core subsystem name (Entity API, Views), case-insensitive; subsystem_coupling with no arguments lists them.
symbolsintegerSymbols per project row, 1 to 30 (default 10), heaviest first.

No output schema declared.

No examples provided.

lookup_core_symbol ~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.

NameTypeReqDescription
fqnstringyesCore 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_projectsintegerHow many using projects to return in the ranked head. Defaults to 10, capped at 30.

No output schema declared.

No examples provided.

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).

NameTypeReqDescription
projectstringyesdrupal.org project machine name, e.g. webform.
releasesintegerReleases to list, newest first, 1 to 30 (default 10). release_count says how many exist.

No output schema declared.

No examples provided.

project_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.

NameTypeReqDescription
monthsintegerMonths of history to return, 1 to 120 (default 36), ending at the latest month in the data.
projectstringyesdrupal.org project machine name, e.g. token.

No output schema declared.

No examples provided.

project_upgrade_report ~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.

NameTypeReqDescription
limitintegerHow many outstanding records to return with evidence, 1 to 15 (default 8); above the cap the call is refused.
projectstringyesContrib project machine name as it appears on drupal.org, for example webform.
target_versionstringyesTarget 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 ~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.

NameTypeReqDescription
max_rowsintegerRows to return per statement, 1 to 500 (default 100). The result byte budget may cut a wide result sooner; truncated says so either way.
sqlstringOne 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.
statementsnull|arrayUp 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 ~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.

NameTypeReqDescription
limitintegerDependents per page, 1 to 100 (default 20).
offsetintegerDependents to skip; use next_offset from the previous page.
projectstringyesdrupal.org project machine name, e.g. webform.

No output schema declared.

No examples provided.

search_contrib_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.

NameTypeReqDescription
by_repobooleanReturn repos as (repo, file_count) instead of files; pulls up to 1000 files, total_files is the ceiling.
filtersstringZoekt filters appended as written: r:<repo regex> f:<path regex> lang:<language> b:<branch> sym:<symbol> case:yes.
limitintegerFiles to return, default 20, cap 50; ignored with by_repo.
literalbooleanTreat query as exact text (for ( [ ] $ . as in #[Hook(); filters go in filters.
querystringyesCode 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$
reposnull|arrayRestrict to these project machine names (one query).

No output schema declared.

No examples provided.

subsystem_coupling ~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.

NameTypeReqDescription
issue_nidintegerA drupal.org core issue nid: reports the subsystems its merge request touches, then the coupling edges from each.
limitintegerEdges to return, 1 to 50 (default 20). count says how many pass the floors.
min_co_failintegerKeep edges seen in at least this many merge requests (default 3).
min_liftnumberKeep edges with lift at or above this (default 0.05, the survey report's floor).
subsystemstringA 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 ~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").

NameTypeReqDescription
fromstringyesLower core version bound, inclusive: 11.2, 11.2.x, 11.2.0, 11, 11.x. Upgrading from 11.2 means from=11.3.
headintegerGroups per bucket, 1 to 5 (default 5).
kindstringRestrict to one symbol kind (method, class, function, hook, service, library …); applies to counts too.
min_projects_usingintegerDrop symbols fewer than this many contrib projects call on a development branch; applies to counts too.
offsetintegerSkip this many groups per bucket, in ranked order.
tostringyesUpper bound, inclusive, same forms.

No output schema declared.

No examples provided.