Pack local or remote codebases into AI-friendly files that LLMs and coding agents can read or search
Drupal Code Query is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Drupal core API changes, contrib usage, upgrade readiness, patch verdicts, code search, SQL.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http drupal-code-query-mcp https://mcp.tresbien.tech/mcp
# 2 — ask your agent for something these tools do
# check_patches, describe_dataset, get_change_record and 14 more
Drupal Code Query costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http drupal-code-query-mcp https://mcp.tresbien.tech/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
17 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
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. - Sen
| Parameter | Type | Required | Notes |
|---|---|---|---|
| items | null/array | 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. |
| composer_json | string | 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 | string | no | The contents of composer.lock. It gives the installed version of each patched package. |
| patches_file | string | no | The text of the patches file, for a site on cweagans/composer-patches 2.x that keeps its patches out of composer.json. The path is in its own extra.composer-patches.patches-file, patches.json by defau |
| patches_lock | string | no | The text of patches.lock.json, which 2.x of the patch manager writes and applies from. Send it to judge what the site actually applies: it answers alone, over extra.patches and the patches file. |
| patch_files | object | no | The text of every patch the site declares, 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 mer |
| target_core | string | no | Core the added code is checked against: a minor (11.4 or 11.4.x) or a release (11.4.5). A minor with no core release in the data is refused, and so is a major alone. latest checks no references. Defau |
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, pl
| Parameter | Type | Required | Notes |
|---|---|---|---|
| view | string | 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 | null/array | no | Up to 8 views at once, documented one after the other in one call. |
| recipe | string | no | One recipe id from the overview's index. Returns a ready-to-run query_dataset statement with its placeholders explained. |
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 (
| Parameter | Type | Required | Notes |
|---|---|---|---|
| nid | integer | yes | The change record's drupal.org node id, for example 3581981. |
| top_projects | integer | no | How many impacted projects to return in the ranked head. Defaults to 10, capped at 40. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| from | string | 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. |
| to | string | yes | Upper core version bound, inclusive. Same forms as from. |
| project | string | no | Optional contrib project machine name. Narrows the list to records a development branch of that project still matches. |
| limit | integer | no | Records in the head, 1 to 40 (default 15). Above the cap the call is refused. |
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. re
| Parameter | Type | Required | Notes |
|---|---|---|---|
| target | string | yes | The core class, interface or trait, with or without the leading backslash: Drupal\Core\Form\FormBase. |
| rel_kind | string | no | extends, implements, or uses_trait; any when absent. |
| project | string | no | Restrict to one project machine name. |
| per_project | integer | no | Edges shown per project on a page, 1 to 50 (default 3). Each row has project_edges, the project's full count. |
| limit | integer | no | Rows per page, 1 to 100 (default 50). |
| offset | integer | no | Skip this many rows in the same ranked order. Pass the previous page's next_offset. |
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), member_of (+ max_dept
| Parameter | Type | Required | Notes |
|---|---|---|---|
| type | string | no | Filter: project_module, project_theme, project_distribution, project_general, project_theme_engine, project_translation. |
| min_installs | integer | no | Filter: reported install base at or above this. |
| security | string | no | Filter: security advisory coverage: covered, not-covered, revoked. |
| core_minor | string | 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. |
| missing | boolean | no | Invert core_minor: keep projects whose development branches do not declare it. |
| era | string | no | Filter: d8plus (Drupal 8+ code) or pre_d8, on any development branch. |
| member_of | string | no | Filter: keep only members of this root project's composer requires walk, for example cms. |
| max_depth | null/integer | no | With member_of: drop members further than this many requires away, 1 or more. |
| limit | integer | no | Projects per page, 1 to 100 (default 50). |
| offset | integer | no | Skip this many projects in the same ranked order. Pass the previous page's next_offset. |
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 kin
| Parameter | Type | Required | Notes |
|---|---|---|---|
| fqn | string | no | One core symbol, as lookup_core_symbol takes it. Pass this or a filter. |
| kind | string | no | Filter: one symbol kind (function, method, class, library, hook, service …). |
| status | string | no | Filter: deprecated | scheduled_removal (still present) | removed (gone). |
| subsystem | string | no | Filter: a core subsystem (Entity API, Views), case-insensitive. subsystem_coupling with no arguments lists them. |
| removal_in | string | no | Filter: removal stamp in this core minor (13.0). With status=scheduled_removal: still present, going away then. |
| deprecated_in | string | no | Filter: symbols deprecated in this core minor (11.4). |
| limit | integer | no | Projects per page, 1 to 100 (default 50). |
| offset | integer | no | Skip this many projects. Pass the previous next_offset. |
| symbols | integer | no | Symbols per project row, 1 to 30 (default 10), heaviest first. |
| matched | integer | no | Matched symbols listed on the envelope, 1 to 50 (default 20). |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| fqn | string | 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 const |
| top_projects | integer | no | How many using projects to return in the ranked head. Defaults to 10, capped at 30. |
| candidates | integer | no | When the name resolves to no symbol: how many catalog entries containing it to return, 1 to 50 (default 10). |
| kind | string | no | Restrict candidates to one symbol kind (class, method, function, hook, library, service …). |
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, c
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | yes | drupal.org project machine name, e.g. webform. The composer name drupal/webform is accepted. |
| releases | integer | no | Releases to list, newest first, 1 to 30 (default 10). release_count says how many exist. |
| include | null/array | no | Optional sections: trend (monthly install series per release line) and related (full requires / required_by / co_installed lists, replacing the related summary). |
| months | integer | no | With include trend: months of history, 1 to 120 (default 36), ending at the latest month in the data. |
| dependents | integer | no | With include related: dependents per page in required_by, 1 to 100 (default 20). |
| dependents_offset | integer | no | With include related: dependents to skip. Pass required_by.next_offset from the previous call. |
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_prog
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | 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 are not in the dataset. |
| target_version | string | 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. |
| limit | integer | no | Outstanding records to return with evidence, 1 to 15 (default 8). Above the cap the call is refused. |
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 35 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 truncate
| Parameter | Type | Required | Notes |
|---|---|---|---|
| sql | string | 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. |
| statements | null/array | 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. |
| max_rows | integer | 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. |
Re-roll one composer patch that check_patches reported conflicts or fuzzy: a new diff that applies to the installed release. Call check_patches first for the whole list. Call this once per patch that came back conflicts or fuzzy. - 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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | yes | drupal.org machine name (webform) or composer name (drupal/webform); drupal or core for Drupal core. |
| version | string | yes | The composer version installed, e.g. 1.13.0 or 11.4.5. |
| patch | string | 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), |
| title | string | no | Optional, echoed back. |
| base | string | 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 |
| target_core | string | no | Core the added code is checked against: a minor (11.4 or 11.4.x) or a release (11.4.5). A minor with no core release in the data is refused, and so is a major alone. latest checks no references. Defau |
| drop_tests | null/boolean | no | Optional. Leave it out and the re-roll drops every file the release package omits, read from the release's own archive. false keeps every hunk, for a site installed from source. |
| resolutions | null/array | 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 |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| composer_json | string | 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 | string | 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. |
| patches_file | string | no | The text of the patches file, for a site on cweagans/composer-patches 2.x that keeps its patches out of composer.json. The path is in its own extra.composer-patches.patches-file, patches.json by defau |
| patches_lock | string | no | The text of patches.lock.json, which 2.x of the patch manager writes and applies from. Send it to judge what the site actually applies: it answers alone, over extra.patches and the patches file. |
| target_core | string | no | Core to move to: a minor (11.4), a release (11.4.5), or latest for the newest core the site's own constraint allows. Leave empty to scan against the core the site already runs: which packages have a n |
| patches | boolean | 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 | object | no | The text of every patch the site declares, 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 |
| installed_core | object | 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 |
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 looka
| Parameter | Type | Required | Notes |
|---|---|---|---|
| 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$ |
| literal | boolean | no | true: query is matched as exact text. Use it for text with ( [ ] $ . such as #[Hook(. With literal, filters go in filters. |
| filters | string | no | Zoekt filters appended as written: r:<repo regex> f:<path regex> lang:<language> b:<branch> sym:<symbol> case:yes. |
| repos | null/array | no | Restrict to these projects, by machine name, in one query. |
| limit | integer | no | Files to return, default 20, cap 50. Ignored with by_repo. |
| by_repo | boolean | no | Return repos as (repo, file_count) instead of files. Pulls up to 1000 files; total_files is the ceiling. |
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:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| subsystem | string | 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. |
| issue_nid | integer | no | A drupal.org core issue nid: reports the subsystems its merge request touches, then the coupling edges from each. |
| min_lift | number | no | Keep edges with lift at or above this (default 0.05). |
| min_co_fail | integer | no | Keep edges seen in at least this many merge requests (default 3). |
| limit | integer | no | Edges to return, 1 to 50 (default 20). count says how many pass the floors. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| 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. |
| to | string | yes | Upper bound, inclusive, same forms. |
| head | integer | no | Groups per bucket, 1 to 5 (default 5). Ignored when flat is true. |
| kind | string | no | Restrict to one symbol kind (method, class, function, hook, service, library …). Applies to counts too. |
| min_projects_using | integer | no | Drop symbols fewer than this many contrib projects call on a development branch. Applies to counts too. |
| offset | integer | no | Skip this many groups per bucket (grouped) or rows (flat), in ranked order. Flat: pass the previous page's next_offset. |
| flat | boolean | no | true: one bucket as flat symbol rows, paged, instead of three buckets of ranked groups. Needs bucket. |
| bucket | string | no | With flat: which side of the diff to list, added, deprecated, or removed. One bucket per call. |
| limit | integer | 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. |
Answer "does this WordPress block theme convert to Drupal with WordPal". The WordPal gallery converts every block theme on wordpress.org each night. With slug: one theme and its routes. Without slug: counts by status and the most installed themes. - status (exact, diff, failed) is a verdict on the home page only. exact: its markup has no difference and its screenshot matches the WordPress screensh
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | no | A wordpress.org theme slug, for example twentytwentyfive. Returns that theme and its routes. The filters do not apply. |
| status | string | no | Filter: exact, diff or failed. |
| tag | string | no | Filter: a wordpress.org tag slug, for example blog. |
| q | string | no | Filter: part of a slug or of a theme name, in any case. |
| limit | integer | no | Themes to return, 1 to 50 (default 20). |
| offset | integer | no | Skip this many themes in the same ranked order. Pass the previous page's next_offset. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Drupal Code Query or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.42.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Drupal Code Query can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.