このMCPでできること
Analyzes Drupal core API changes, contrib-project usage, upgrade readiness, Composer patches, source code, dependencies, and related datasets.
ツール
入力スキーマ
{'type': 'object', 'properties': {'items': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['project', 'version', 'patch'], 'properties': {'base': {'type': 'string'}, 'patch': {'type': 'string'}, 'title': {'type': 'string'}, 'source': {'type': 'string'}, 'project': {'type': 'string'}, 'version': {'type': 'string'}, 'upstream': {'type': 'string'}, 'provenance': {'type': ['null', 'object'], 'properties': {'mr': {'type': 'string'}, 'url': {'type': 'string'}, 'base': {'type': 'string'}, 'head': {'type': 'string'}, 'commit': {'type': 'string'}, 'fetched': {'type': 'string'}, 'rerolled': {'type': 'string'}}, 'additionalProperties': False}, 'merge_patch': {'type': 'string'}, 'resolutions': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['file', 'region'], 'properties': {'file': {'type': 'string'}, 'text': {'type': 'string'}, 'choice': {'type': 'string'}, 'delete': {'type': 'boolean'}, 'region': {'type': 'integer'}}, 'additionalProperties': False}}}, 'additionalProperties': False}, 'description': "Up to 50 patches to check. Each item has project, version, patch and title. project: webform or drupal/webform; drupal or core for Drupal core. version: the installed composer version, 1.13.0 or 11.4.5. patch: the diff text. This service downloads nothing, so fetch a URL patch yourself and send what came back. source: optional, the path or URL the patch was declared with. merge_patch: optional, the .diff form of a merge request, used for the merge of a re-roll while patch decides the verdict. provenance: optional, where a copied patch's bytes came from, {mr, commit, url, base, head, fetched, rerolled}. Send it when source is a local path. title: optional, echoed back. base: optional, the release the site had before the upgrade. A commit sha or a composer version, tried first as the merge base of a re-roll. Leave empty to build the items from composer_json and composer_lock."}, 'patch_files': {'type': 'object', 'description': '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 merge request .patch URL, send its .diff form under a second key too.', 'additionalProperties': {'type': 'string'}}, 'target_core': {'type': 'string', 'description': "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. Defaults to the lock's drupal/core, else the version of a drupal item."}, 'patches_file': {'type': 'string', 'description': '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 default.'}, 'patches_lock': {'type': 'string', 'description': '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.'}, 'composer_json': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'The contents of composer.lock. It gives the installed version of each patched package.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'properties': {'view': {'type': 'string', 'description': 'One view name. Returns its columns with types and descriptions, an example filter, and the joins into it. Leave empty for the overview.'}, 'views': {'type': ['null', 'array'], 'items': {'type': 'string'}, 'description': 'Up to 8 views at once, documented one after the other in one call.'}, 'recipe': {'type': 'string', 'description': "One recipe id from the overview's index. Returns a ready-to-run query_dataset statement with its placeholders explained."}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['nid'], 'properties': {'nid': {'type': 'integer', 'description': "The change record's drupal.org node id, for example 3581981."}, 'top_projects': {'type': 'integer', 'description': 'How many impacted projects to return in the ranked head. Defaults to 10, capped at 40.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'description': 'Upper core version bound, inclusive. Same forms as from.'}, 'from': {'type': 'string', 'description': 'Lower core version bound, inclusive: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it.'}, 'limit': {'type': 'integer', 'description': 'Records in the head, 1 to 40 (default 15). Above the cap the call is refused.'}, 'project': {'type': 'string', 'description': 'Optional contrib project machine name. Narrows the list to records a development branch of that project still matches.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['target'], 'properties': {'limit': {'type': 'integer', 'description': 'Rows per page, 1 to 100 (default 50).'}, 'offset': {'type': 'integer', 'description': "Skip this many rows in the same ranked order. Pass the previous page's next_offset."}, 'target': {'type': 'string', 'description': 'The core class, interface or trait, with or without the leading backslash: Drupal\\Core\\Form\\FormBase.'}, 'project': {'type': 'string', 'description': 'Restrict to one project machine name.'}, 'rel_kind': {'type': 'string', 'description': 'extends, implements, or uses_trait; any when absent.'}, 'per_project': {'type': 'integer', 'description': "Edges shown per project on a page, 1 to 50 (default 3). Each row has project_edges, the project's full count."}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'properties': {'era': {'type': 'string', 'description': 'Filter: d8plus (Drupal 8+ code) or pre_d8, on any development branch.'}, 'type': {'type': 'string', 'description': 'Filter: project_module, project_theme, project_distribution, project_general, project_theme_engine, project_translation.'}, 'limit': {'type': 'integer', 'description': 'Projects per page, 1 to 100 (default 50).'}, 'offset': {'type': 'integer', 'description': "Skip this many projects in the same ranked order. Pass the previous page's next_offset."}, 'missing': {'type': 'boolean', 'description': 'Invert core_minor: keep projects whose development branches do not declare it.'}, 'security': {'type': 'string', 'description': 'Filter: security advisory coverage: covered, not-covered, revoked.'}, 'max_depth': {'type': ['null', 'integer'], 'description': 'With member_of: drop members further than this many requires away, 1 or more.'}, 'member_of': {'type': 'string', 'description': "Filter: keep only members of this root project's composer requires walk, for example cms."}, 'core_minor': {'type': 'string', 'description': 'Filter: a core minor in 11.4.x form. Keeps projects where the newest release on some development branch declares support for it. With missing=true, keeps projects with no such branch.'}, 'min_installs': {'type': 'integer', 'description': 'Filter: reported install base at or above this.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'properties': {'fqn': {'type': 'string', 'description': 'One core symbol, as lookup_core_symbol takes it. Pass this or a filter.'}, 'kind': {'type': 'string', 'description': 'Filter: one symbol kind (function, method, class, library, hook, service â\x80¦).'}, 'limit': {'type': 'integer', 'description': 'Projects per page, 1 to 100 (default 50).'}, 'offset': {'type': 'integer', 'description': 'Skip this many projects. Pass the previous next_offset.'}, 'status': {'type': 'string', 'description': 'Filter: deprecated | scheduled_removal (still present) | removed (gone).'}, 'matched': {'type': 'integer', 'description': 'Matched symbols listed on the envelope, 1 to 50 (default 20).'}, 'symbols': {'type': 'integer', 'description': 'Symbols per project row, 1 to 30 (default 10), heaviest first.'}, 'subsystem': {'type': 'string', 'description': 'Filter: a core subsystem (Entity API, Views), case-insensitive. subsystem_coupling with no arguments lists them.'}, 'removal_in': {'type': 'string', 'description': 'Filter: removal stamp in this core minor (13.0). With status=scheduled_removal: still present, going away then.'}, 'deprecated_in': {'type': 'string', 'description': 'Filter: symbols deprecated in this core minor (11.4).'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['fqn'], 'properties': {'fqn': {'type': 'string', 'description': 'Core symbol name, or part of one. A namespaced name with or without the leading backslash (Drupal\\Core\\Entity\\EntityInterface, Drupal\\Core\\Recipe\\RecipeRunner::installModule). A bare function or constant name (check_markup, DRUPAL_DISABLED). A prefixed pseudo-symbol as what_changed reports it (fn:check_markup, core:hook:preprocess_page, core:library:claro/drupal.shortcut). A fragment of 3+ characters (fromRoute), which returns candidates when no symbol has that exact name.'}, 'kind': {'type': 'string', 'description': 'Restrict candidates to one symbol kind (class, method, function, hook, library, service â\x80¦).'}, 'candidates': {'type': 'integer', 'description': 'When the name resolves to no symbol: how many catalog entries containing it to return, 1 to 50 (default 10).'}, 'top_projects': {'type': 'integer', 'description': 'How many using projects to return in the ranked head. Defaults to 10, capped at 30.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['project'], 'properties': {'months': {'type': 'integer', 'description': 'With include trend: months of history, 1 to 120 (default 36), ending at the latest month in the data.'}, 'include': {'type': ['null', 'array'], 'items': {'type': 'string'}, 'description': 'Optional sections: trend (monthly install series per release line) and related (full requires / required_by / co_installed lists, replacing the related summary).'}, 'project': {'type': 'string', 'description': 'drupal.org project machine name, e.g. webform. The composer name drupal/webform is accepted.'}, 'releases': {'type': 'integer', 'description': 'Releases to list, newest first, 1 to 30 (default 10). release_count says how many exist.'}, 'dependents': {'type': 'integer', 'description': 'With include related: dependents per page in required_by, 1 to 100 (default 20).'}, 'dependents_offset': {'type': 'integer', 'description': 'With include related: dependents to skip. Pass required_by.next_offset from the previous call.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['project', 'target_version'], 'properties': {'limit': {'type': 'integer', 'description': 'Outstanding records to return with evidence, 1 to 15 (default 8). Above the cap the call is refused.'}, 'project': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Target core version: 11.2, 11.2.x, 11.2.0, 11, or 11.x. A bare major (11) covers every minor of it.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'properties': {'sql': {'type': 'string', 'description': 'One DuckDB SELECT over the views describe_dataset lists. SHOW TABLES, DESCRIBE <view> and FROM-first syntax also work. No semicolon, one statement. Use statements for several at once.'}, 'max_rows': {'type': 'integer', 'description': 'Rows to return per statement, 1 to 500 (default 100). The result byte budget may cut a wide result sooner. truncated says so either way.'}, 'statements': {'type': ['null', 'array'], 'items': {'type': 'string'}, 'description': '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.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['project', 'version', 'patch'], 'properties': {'base': {'type': 'string', 'description': 'Optional. The release the site had before the upgrade. Its commit sha from composer.lock (source.reference), or its composer version: 6.1.0 when version is 6.2.0. A patch without index lines is merged from it when it applies there, before the newest tags are tried.'}, 'patch': {'type': 'string', 'description': 'Unified diff text. This service downloads nothing, so fetch a URL patch yourself and send what came back. With the index lines git diff writes, it is merged onto the release. Without them (hand-made), it is merged from base when it applies there, else from the newest tag it applies to. reroll.base is the tag used.'}, 'title': {'type': 'string', 'description': 'Optional, echoed back.'}, 'project': {'type': 'string', 'description': 'drupal.org machine name (webform) or composer name (drupal/webform); drupal or core for Drupal core.'}, 'version': {'type': 'string', 'description': 'The composer version installed, e.g. 1.13.0 or 11.4.5.'}, 'drop_tests': {'type': ['null', 'boolean'], 'description': "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': {'type': ['null', 'array'], 'items': {'type': 'object', 'required': ['file', 'region'], 'properties': {'file': {'type': 'string'}, 'text': {'type': 'string'}, 'choice': {'type': 'string'}, 'delete': {'type': 'boolean'}, 'region': {'type': 'integer'}}, 'additionalProperties': False}, 'description': "Decisions for the conflicted regions of a previous call on the same project, version and patch, one entry per region. region: the index in that file's conflicts[].hunks. {file, region, choice}: choice is release or patch. {file, region, text}: your own text for the region. {file, region, delete: true}: empty the region. The service re-runs the merge with them and apply-checks the result. Regions you leave out keep the release side and come back in reroll.resolutions_missing."}, 'target_core': {'type': 'string', 'description': '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. Defaults to version for a core patch.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['composer_lock'], 'properties': {'patches': {'type': 'boolean', 'description': "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': {'type': 'object', 'description': '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 text under that URL. For a merge request .patch URL, send its .diff form under a second key too.', 'additionalProperties': {'type': 'string'}}, 'target_core': {'type': 'string', 'description': "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 newer release for it."}, 'patches_file': {'type': 'string', 'description': '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 default. A site on 2.x declares nothing under extra.patches, so without this its patches are invisible.'}, 'patches_lock': {'type': 'string', 'description': '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.'}, 'composer_json': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'The text of composer.lock. A real lock is too big to paste: send its path (composer.lock) instead. The answer is then the curl command that uploads the files from the site root.'}, 'installed_core': {'type': 'object', 'description': "What each installed release requires of core, keyed by composer name. Read it from the site's own vendor directory: composer show -f json <pkg>, or the drupal/core entry of its composer.json. Send it and the installed release is judged by what it declares.", 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'description': 'Files to return, default 20, cap 50. Ignored with by_repo.'}, 'query': {'type': 'string', 'description': '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': {'type': ['null', 'array'], 'items': {'type': 'string'}, 'description': 'Restrict to these projects, by machine name, in one query.'}, 'by_repo': {'type': 'boolean', 'description': 'Return repos as (repo, file_count) instead of files. Pulls up to 1000 files; total_files is the ceiling.'}, 'filters': {'type': 'string', 'description': 'Zoekt filters appended as written: r:<repo regex> f:<path regex> lang:<language> b:<branch> sym:<symbol> case:yes.'}, 'literal': {'type': 'boolean', 'description': 'true: query is matched as exact text. Use it for text with ( [ ] $ . such as #[Hook(. With literal, filters go in filters.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Edges to return, 1 to 50 (default 20). count says how many pass the floors.'}, 'min_lift': {'type': 'number', 'description': 'Keep edges with lift at or above this (default 0.05).'}, 'issue_nid': {'type': 'integer', 'description': 'A drupal.org core issue nid: reports the subsystems its merge request touches, then the coupling edges from each.'}, 'subsystem': {'type': 'string', 'description': 'A core subsystem (Views, Entity API) or a path bucket (module:views, core_lib:Entity). Leave both subsystem and issue_nid empty to get the list of subsystems.'}, 'min_co_fail': {'type': 'integer', 'description': 'Keep edges seen in at least this many merge requests (default 3).'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'description': 'Upper bound, inclusive, same forms.'}, 'flat': {'type': 'boolean', 'description': 'true: one bucket as flat symbol rows, paged, instead of three buckets of ranked groups. Needs bucket.'}, 'from': {'type': 'string', 'description': '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': {'type': 'integer', 'description': 'Groups per bucket, 1 to 5 (default 5). Ignored when flat is true.'}, 'kind': {'type': 'string', 'description': 'Restrict to one symbol kind (method, class, function, hook, service, library â\x80¦). Applies to counts too.'}, 'limit': {'type': 'integer', 'description': 'With flat: rows per page, 1 to 100 (default 50). A page of very long fqns may come back shorter. next_offset always says where the next page starts.'}, 'bucket': {'type': 'string', 'description': 'With flat: which side of the diff to list, added, deprecated, or removed. One bucket per call.'}, 'offset': {'type': 'integer', 'description': "Skip this many groups per bucket (grouped) or rows (flat), in ranked order. Flat: pass the previous page's next_offset."}, 'min_projects_using': {'type': 'integer', 'description': 'Drop symbols fewer than this many contrib projects call on a development branch. Applies to counts too.'}}, 'additionalProperties': False}
最近のツール変更
類似のMCPサーバー
TinyFn
Offers deterministic utility functions for mathematics, conversions, validation, hashing, encoding, arrays, dates, colors, and pa…
hyperion
Acts as a paid MCP tool marketplace and utility gateway with server discovery, HTTP and JavaScript tools, research, data conversi…
Andreax
Offers pay-per-call AI services for inference, agent and workflow design, OCR and transcription, code generation and review, clas…
Vee3
Manages Clerk authentication infrastructure, including users, organizations, domains, sessions, tokens, OAuth, SSO, machines, per…
Courier
Provides notification delivery infrastructure for users, tenants, lists, templates, preferences, journeys, automations, brands, a…
GripForge
Generates, rigs, animates, analyzes, and packages game characters, weapons, armor, effects, environments, and engine-ready assets.
IA-QA — 130+ QA & Dev Tools for AI Agents
Provides deterministic QA, evaluation, testing, code analysis, prompt and RAG checks, model comparison, and web security diagnost…
apis-io
Provides catalog search, comparison, scoring, enrichment, lists, and dataset exports for APIs, providers, specifications, workflo…