ADR 0015: Add graphify to the MCP Catalog (opt-in, security-sensitive)
| Field | Value |
|---|---|
| Status | Accepted (implemented in commit cab08b3, v1.0-rc2) |
| Date | 2026-05-23 |
| Deciders | Project maintainers |
| Supersedes | — |
| Superseded by | — |
| Related ADRs | 0007 (MCP catalog shape), 0008 (Prereq install policy), 0005 (Adapter contract) |
Summary
Add graphify (PyPI graphifyy) to the @aidokit/mcp-catalog as the
8th catalog entry, filling the v4 kit's cgb (code-graph-builder) MCP
slot referenced by the researcher.md agent. The entry is marked
securitySensitive: true and trigger: 'never' — it is opt-in only,
never auto-suggested by stack-pack or detector triggers, and never
auto-installed. Python remains a project-level prerequisite for any
user who opts in; aidokit does not add Python to its own prereq list,
and ADR-0008's no-auto-install policy applies unchanged.
Context
The v4 kit's researcher agent declares a cgb MCP for
dependency-topology and impact analysis (kit Part 3 §47). The v0.5 MCP
catalog has no entry that fills this slot, leaving researcher flows
without code-graph capability out of the box.
graphify is a candidate: it turns a repository into a queryable
knowledge graph and ships an MCP server plus a /graphify skill. It
runs inside the user's AI CLI, not from aidokit itself, so it does
not affect aidokit's zero-LLM-calls rule.
Three properties make it non-trivial to add:
- Python dependency. graphify is distributed on PyPI as
graphifyy. The current prereq model (ADR-0008, Node + Git + AI CLI - Beads) is Node-only.
- Security surface. graphify reads the whole project tree and sends docs/images to an external model for graph construction. This is a meaningful expansion of capability versus the existing catalog entries.
- Researcher-specific. Only the
researcherrole uses thecgbslot. Most users runningaidokit initwill never invoke it.
The question is whether to add it at all, and if so under what constraints.
Decision
1. Add graphify as MCP catalog entry #8
A one-file MCPDef add per ADR-0007. The entry sits alongside the
existing seven (Context7, Beads MCP, Playwright, GitHub, Chrome
DevTools, Postgres, Filesystem).
{
id: 'graphify',
name: 'graphify',
description:
'Code-graph / knowledge-graph MCP. Turns a repo into a queryable graph for dependency and impact analysis. Fills the v4 researcher agent cgb slot.',
securitySensitive: true,
trigger: 'never',
install: {
'claude-code': {
command: 'claude mcp add graphify -- uvx graphifyy mcp',
},
// codex: TBD when codex adapter lands
},
prereqs: ['python>=3.10', 'uv or pipx'],
docs: 'https://pypi.org/project/graphifyy/',
}
2. Opt-in only — never auto-suggested
trigger: 'never' is mandatory. No stack-pack suggestMCPs(ctx)
returns 'graphify' from a detector signal. Users surface it
explicitly via aidokit mcp add graphify or by selecting it in the
init MCP picker. This matches the security-sensitive policy already
applied to Postgres and Filesystem.
3. Python is NOT promoted to an aidokit prereq
ADR-0008 stands unchanged. The prereq list remains Node + Git + AI CLI
+ Beads. graphify's Python requirement is surfaced as a per-MCP
prereq string in its MCPDef and printed when the user opts in, with
the install hint (pipx install graphifyy or uv tool install
graphifyy). aidokit detects but does not install.
4. No auto-install — ADR-0008 applies
Selecting graphify in init runs the per-adapter installMCP recipe
(e.g. claude mcp add graphify -- …). It does not run pipx install
or uv tool install. If Python or uvx is missing, the MCP install
fails with a clean MCP_INSTALL_FAILED envelope and the printed
prereq hint.
5. Documentation surfaces the trust boundary
The catalog description and the aidokit mcp add graphify
confirmation prompt both state that graphify reads the project tree and
sends content to an external model. Consent is per-invocation;
--yes does not bypass the security-sensitive prompt for MCP entries
flagged securitySensitive: true.
Consequences
Positive
- v4 fidelity: the
researcheragent'scgbslot is filled with a real catalog entry, not a documentation gap. - One-file change: adding the entry is bounded and reversible. Removal is also one file.
- Capability for impact analysis: users who want dependency-topology questions answered by their AI CLI get a working path out of the box.
- No prereq-model expansion: Python stays a per-MCP requirement, not a CLI-wide prereq. The blast radius is contained to users who opt in.
Negative
- Adds a second runtime ecosystem (Python) to the catalog. Even
scoped per-MCP, this is the first non-Node tool we point at. Future
catalog entries may follow the same pattern, and we will need a
consistent story for per-MCP prereqs. Mitigation: document the
prereqs: string[]convention onMCPDefand reuse for any future non-Node entry. - Security surface expands. A user who opts in is shipping repo
contents to an external model. Mitigation:
securitySensitive: true+ explicit confirmation + clear description language. - Vendor coupling. graphify is a single project on PyPI. If it
goes unmaintained, the
cgbslot empties again. Mitigation: treat the slot as the contract; swap implementations if a bettercgbMCP appears.
Neutral
- Codex install recipe deferred until the codex adapter lands in v1.0 — the entry can ship claude-code-only at first, matching how other catalog entries handle adapter coverage.
- No conformance-level impact. Catalog membership doesn't change what Minimum / Standard / Strict require.
Alternatives considered
Alternative 1: Do not add graphify
Leave the cgb slot empty; users who need it install graphify manually
and configure it themselves.
Pros
- Zero change to the catalog.
- No new security surface introduced by aidokit at all.
Cons
- The
researcheragent's declared MCP is unsatisfiable out of the box, which is a real fidelity gap against the v4 kit. - Users have to discover graphify externally and wire it in by hand.
Reason rejected: the catalog exists to make MCP discovery and install one step. Refusing to list a clearly relevant MCP because it has a Python prereq punishes users for a problem they can solve.
Alternative 2: Add graphify and auto-suggest it for any project
trigger: 'always' or a detect.hasMultipleLanguages-style trigger
that surfaces graphify by default.
Pros
- Maximum visibility.
- Users get code-graph capability without thinking about it.
Cons
- Auto-suggesting a security-sensitive MCP that ships repo contents
externally is exactly the failure mode
securitySensitive: trueexists to prevent. - The Python prereq becomes a surprise for users who only have Node installed.
Reason rejected: violates the existing policy for security-sensitive entries (Postgres, Filesystem). No catalog entry that sends user content off-host should auto-suggest.
Alternative 3: Promote Python to an aidokit prereq
Add Python ≥ 3.10 to @aidokit/prereq-check as an optional prereq so
graphify (and any future Python MCP) detects cleanly.
Pros
- Cleaner per-MCP install messaging.
- Anticipates future Python MCPs.
Cons
- Expands aidokit's own surface for one MCP entry.
- Forces every user to see a "Python not found" line in
aidokit doctor, even users who will never opt into a Python MCP.
Reason rejected: premature. If a second Python MCP lands, revisit
in a new ADR. For one entry, per-MCP prereqs: string[] is enough.
Alternative 4: Bundle a different code-graph MCP
Pick a Node-native code-graph MCP (e.g. one based on ts-morph or
tree-sitter) to avoid the Python dependency.
Pros
- Stays within the Node ecosystem.
- No new runtime surface.
Cons
- No comparable Node-native MCP exists today with the same feature surface (multi-language graph, doc/image ingestion).
- Building one is out of scope for aidokit (ADR-0008 family: aidokit is a scaffolder, not a tool vendor).
Reason rejected: the better option may exist later; not today.
Implementation notes
- File:
packages/mcp-catalog/src/catalog.ts— append the entry to theMCPSarray. - Schema impact:
MCPDefalready hassecuritySensitiveandtriggerfields. Theprereqs?: string[]field needs adding toMCPDefSchemaif it does not already exist; document it in.docs/docs/specs/mcp-catalog.md§entry-fields. - Test: a unit test in
packages/mcp-catalog/test/validates the entry againstMCPDefSchema(catalog parity test already covers this pattern). - Confirmation prompt: extend
@aidokit/cli's MCP-add flow to print the security-sensitive warning text whensecuritySensitive: true, regardless of--yes. (Check whether this is already implemented for Postgres / Filesystem; if so, no CLI change needed.) - Changeset:
minorbump for@aidokit/mcp-catalog.
Validation
This decision is validated when:
- [ ]
@aidokit/mcp-catalogexports agraphifyentry and itsMCPDefSchematest passes. - [ ] No stack-pack
suggestMCPs(ctx)returns'graphify'from any detector signal. - [ ]
aidokit mcp add graphify --yesstill prints the security-sensitive consent prompt and requires explicit confirmation. - [ ]
aidokit initagainst a host without Python prints the graphify Python prereq hint and exits the MCP install withMCP_INSTALL_FAILED, leaving the rest of the scaffold intact. - [ ]
.docs/docs/specs/mcp-catalog.mddocumentsprereqs?: string[]onMCPDef.
References
Internal
- ADR 0007 — MCP catalog shape (defines
MCPDefand trigger model) - ADR 0008 — Prereq install policy (no auto-install; applies to MCP prereqs too)
- ADR 0005 — Adapter contract (per-adapter MCP install recipes)
.docs/docs/specs/mcp-catalog.md— catalog spec and entry-field reference.docs/ROADMAP.mdOpen Questions — original graphify question (v0.5 row).docs/context/claude-workflow-kit-v4-base-part-3.md§47 —researcher.mdagent declares thecgbMCP slot
External
- graphify on PyPI — https://pypi.org/project/graphifyy/