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.

phpgraph

OCI · GHCR.IO/HBENABDALLAH/PHPGRAPH

Knowledge graph of a PHP codebase by static analysis: calls, routes, buses, layers, impact

+3 this week 48 Trust /100

Last scanned (53 minutes ago)

Scores higher than 71% of OCI servers

Category Code Search and Documentation

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.Unverified
Provenance & Transparency45
Schema Quality & AI Usability61
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 2167 tokens (~270/item across 8 items; 8 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 Management70
  • Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
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
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

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.

  • 5 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

  • 3 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

  • 31 Oct 26 0
    • Provenance: unverified → fail ▼ security
    • Security disclosure: fail → unverified ▼ functional
    • Package version: 1.6.1 → 2.0.0 functional
  • 30 Oct 26 0
    • Provenance: fail → unverified ▼ security
    • Package version: 1.5.8 → 1.6.1 functional
    • Package version: 1.5.8 → 1.6.0 functional
  • 29 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 27 Oct 26 +3
    • License: fail → pass ▲ functional
    • Licence: NOASSERTION → MIT functional
    • Package version: 1.5.7 → 1.5.8 functional
  • 26 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

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 5 Nov 2026 · Analysed oci/ghcr.io/hbenabdallah/phpgraph@2.0.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem oci
Reason No attestation published

Background: How many MCP packages publish verified provenance →

MCP tools · 8 exposed · ~1,888 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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
get_neighbors ~152

Like get_node, in one direction. "in": what uses this node (callers, implementations, subclasses, code that instantiates or references it), to judge the impact of a change. "out": what this node depends on.

NameTypeReqDescription
directionstring–"in", "out" or "both" (default both).
namestringyesShort name (OrderRepository), fully qualified name (App\Sales\Domain\OrderRepository), method (OrderRepository::save), route (POST /orders), channel (ticket.create) or API schema operation (GET /api/…

No output schema declared.

No examples provided.

get_node ~175

Everything about one class, interface, trait, enum, method or function: kind, file and line, and every relation in and out. Each relation has a confidence: EXTRACTED (read in the code), INFERRED (resolved from declared types, across files and through vendor/ signatures) or AMBIGUOUS (guessed: the only method of the project with that name). When several nodes match the name, the others are listed.

NameTypeReqDescription
namestringyesShort name (OrderRepository), fully qualified name (App\Sales\Domain\OrderRepository), method (OrderRepository::save), route (POST /orders), channel (ticket.create) or API schema operation (GET /api/…

No output schema declared.

No examples provided.

god_nodes ~54

The most connected classes and methods: the hubs most code depends on, often central domain objects, shared services or base classes. Changing them has the widest impact.

NameTypeReqDescription
limitinteger–Number of nodes (default 15).

No output schema declared.

No examples provided.

impact_of ~508

Call this before changing a class or a method, instead of searching for its usages with grep. What may break when it changes: every class that depends on it, directly or through others (callers, subclasses, implementations, code that instantiates or references it, senders and handlers of a message), nearest first, each with the relation that reaches it and the weakest confidence on the way, then its methods reaching the change with the source lines of their calls (3 per class, all with limit 0). Follows methods, not whole classes: a class is reached only through the methods that use the change. Also reaches the callers of the interface or parent method a method implements (INFERRED), and, in a separate list, the code possibly affected through the state the method writes (direct callers of methods reading the same properties, such as all() or hasErrors() for add(), not followed further). Lists the tests to run apart, found through test helpers (fakers) without the depth limit. Stops at a service receiving the change among others (a tagged collection) and at inherited code shared with other subclasses, which are listed but not followed. Lists the routes reaching the change without the depth limit, each with its chain down to the change, scoped by the injected lists on the way. Lists are cut at 40 entries: pass limit 0 for complete lists, or section to get a single one.

NameTypeReqDescription
depthinteger–How many relations away to follow (default 3).
formatstring–text (default, compact: one line per class with its call sites), full (every relation spelled out) or json.
limitinteger–Entries per list (default 40); 0 for complete lists, instead of reading the cut ones node by node.
namestringyesShort name (OrderRepository), fully qualified name (App\Sales\Domain\OrderRepository), method (OrderRepository::save), route (POST /orders), channel (ticket.create) or API schema operation (GET /api/…
sectionstring–Only one list: direct (the call chain), routes, operations (OpenAPI or gRPC operations implemented by what it reaches), state (possibly affected through the state it changes), tests (to run), state-t…

No output schema declared.

No examples provided.

outline ~347

Call this first, instead of query_graph, grep or reading files, whenever you are asked to explain, describe or document a feature or how something works ("explain the notification validation system", "how does stock reservation work"), before reading any code. Returns its structural outline, enough to read only the few files with non-obvious logic. From the classes the topic names, the cluster they form, by namespace and layer, each with its kind, the first sentence of its docblock, its public signatures, constants and enum cases; the interfaces and base classes around it with their number of implementations by folder (0 stated) and the tags injecting them; the flow from the routes into it, the closures it runs and the calls inside it; behaviour read in the bodies (guarded throws, early returns, branches on constants, loop caps, state compared before and after); the container wiring with service ids; its users (tests counted by module), the classes no test touches and those nothing uses. A topic naming a method (OrderService::place) outlines what it runs: the methods it calls, 3 calls deep, each class with those methods only, the hubs it calls counted, its behaviour nearest first.

NameTypeReqDescription
formatstring–text (default, compact, about 15 KB), full (every list uncut: often too large to read inline; prefer section) or json.
sectionstring–Only one section, uncut: what a "+N more: section ..." line names.
topicstringyesThe feature, in words or class names: "notification validation", "stock reservation"; or one method: "ReservationCTRL::saveNewReservation".

No output schema declared.

No examples provided.

overview ~250

Start here on an unfamiliar PHP project. Returns: the Composer stack per application (framework, ORM, message bus, test and analysis tools, with versions); the namespace tree of application code, each branch annotated with the layer-like segments found below it (Domain, Application, Infrastructure, Adapter, Model, Controller...) so you can tell bounded contexts and layers; counts of class name suffixes (Handler, Repository, Controller...); and the gaps of the graph: share of method calls whose receiver type is unknown, the method names most often unresolved, missing vendor/, parse failures, duplicate class names, and what is not modelled at all; the dependencies breaking the layer rules (domain must not depend on infrastructure...) and between bounded contexts; the services of a multi-service repository; HTTP routes (entry points): each route with method, path, controller and routing file when there are up to 30, else counts by path prefix; routes whose controller class exists nowhere; HTTP calls; the API schemas (OpenAPI documents, protobuf services) with what implements them, what is documented and not implemented, and the routes no document describes; messages, their handlers and what is left unlinked. Test code is counted apart.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

query_graph ~292

Find the code about a topic when you do not know the class names. To explain how a feature works ("explain the notification validation system"), call outline instead: it answers in one call what query_graph and several get_node calls would. Matches the words of the question against the words of class, method and function names (validated finds Validator, prices finds PriceCalculator; rare words weigh more than common ones; not semantic search: use words likely to appear in names, such as "stock availability" or "invoice payment"), then returns up to 6 best matches, the other classes of their namespace (the module asked about) and the neighbours that are about the question too, as relations (calls, handled_by, receives...) with confidence. Test code only when the question mentions tests. A question about routes (the words routes, endpoints, HTTP or URL, or a path such as /orders/{id}, with or without a method such as GET) returns the matching route nodes and their controllers; its other words narrow them by path or routing file: "mooc courses routes", "GET /courses".

NameTypeReqDescription
depthinteger–How many relations away from the matched nodes to go (default 2).
limitinteger–Maximum number of nodes returned (default 40).
questionstringyesQuestion or keywords, for example "how is stock availability computed" or "order routes".

No output schema declared.

No examples provided.

shortest_path ~110

How two pieces of code are connected: the shortest chain of relations from one node to the other. Follows dependencies first (calls and references in their direction, from an interface to its implementations, never through files or classes outside the project); otherwise ignores the direction. The answer says which mode found the path.

NameTypeReqDescription
fromstringyesStart node: short name, fully qualified name or Class::method.
tostringyesEnd node: short name, fully qualified name or Class::method.

No output schema declared.

No examples provided.

Install

How do I install the phpgraph MCP server?

phpgraph runs locally as a container image, launched with docker run --rm -i ghcr.io/hbenabdallah/phpgraph:2.0.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/hbenabdallah/phpgraph

# add to Claude Code
claude mcp add hbenabdallah-phpgraph -- docker run --rm -i ghcr.io/hbenabdallah/phpgraph:2.0.0
Common questions

What is the phpgraph MCP server?

phpgraph is an MCP server listed in the public MCP registry as io.github.hbenabdallah/phpgraph. Knowledge graph of a PHP codebase by static analysis: calls, routes, buses, layers, impact. This page covers its container image (ghcr.io/hbenabdallah/phpgraph).

Is the phpgraph MCP server safe to use?

phpgraph scores 48 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the phpgraph MCP server expose?

phpgraph exposes 8 tools: overview, query_graph, get_node, get_neighbors, impact_of, and 3 more. Their descriptions and schemas cost roughly 1,888 tokens of context every time the server is loaded.

Is the phpgraph MCP server still maintained?

phpgraph is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the phpgraph MCP server under?

phpgraph declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.