Partition the tool surface into subject domains with a drift-guard - #501
Conversation
b3cbbd7 to
dbe8bc1
Compare
dbe8bc1 to
1bcae69
Compare
adriannoes
left a comment
There was a problem hiding this comment.
The subject-domain partition and drift-guard look solid: eight locked domains, completeness keyed to PIPEFY_TOOL_NAMES (187/187, no magic count), and tests that actually fail when inverted. Marking execute_graphql remote-safe is a minimal, lockstep change (decorator, seed, server assertion) and matches the documented remote-write criteria (API permission is the auth boundary; hosted logging stays key-only).
A few soft notes before or after you merge:
- Update the PR description counts to 187 tools and
REMOTE_SEED183 to 184 (the code already matches that). - Retarget the
CONTEXT.md/ ADR pointers topackages/mcp/AGENTS.md, where the taxonomy actually landed. - Optional: tighten the new remote GraphQL paragraph so it says public GraphQL only, and that filesystem /
$env/ iPaaS paths stay unreachable (public GraphQL equivalents of some withheld tools remain callable).
Stack order stays #501 then #502 then #504 then #505. Live MCP smoke for the remote exposure was blocked here because the connected server was not proven to be this worktree at the frozen head; composition-root tests cover the exposure contract.
What worked well: the registry-keyed completeness gate, the Domain vs Profile split before selection code, and the coordinated REMOTE marker/seed/tests.
Add tools/toolsets.py — a disjoint partition of all 187 registered tools across 8 subject domains — and a drift-guard asserting it is complete against PIPEFY_TOOL_NAMES (no hardcoded count), disjoint, and keyed to the locked 8 domains. First tool-surface completeness gate: a tool with no domain fails the build. Mark execute_graphql remote-safe (REMOTE_SEED 183 to 184) so the raw-GraphQL escape hatch has full reach (public GraphQL) on the remote profile, governed by the request-scoped bearer's API permissions like its introspection siblings. Part of #308.
1bcae69 to
820d6c9
Compare
adriannoes
left a comment
There was a problem hiding this comment.
Re-approve after the force-push to 820d6c95.
The prior review on 1bcae695 was dismissed by the new head. The delta since then is the AGENTS remote-GraphQL wording (public executor only, with the public-equivalent nuance) plus PR description fixes for the 187-tool count and the packages/mcp/AGENTS.md pointer. CI is green on this commit.
Same call as before: the subject-domain partition, drift-guard, and execute_graphql remote lockstep are good to land.
Motivation
The MCP server exposes 187 tools with no machine-checked grouping and no completeness gate — nothing catches a newly registered tool that never gets classified, and there is no vocabulary for selecting a coherent slice of the surface. The hosted profile also lacked full raw-GraphQL reach:
execute_graphqlwas withheld from the remote allowlist, so a remote caller could introspect the schema but not run what they found.Outcome
A disjoint subject-domain partition of all 187 tools (
workflow,database,interfaces,automation,intelligence,analytics,governance,integration) now lives intools/toolsets.py, enforced by a drift-guard that fails the build if any registered tool has no domain — the repo's first tool-surface completeness gate, keyed toPIPEFY_TOOL_NAMESwith no hardcoded count.execute_graphqlis now remote-safe, giving the remote profile full raw-GraphQL reach under the request-scoped bearer's own API permissions — the same trust boundary as its introspection siblings, and its write reach bounded entirely by that caller's API authorization.Domains are the disjoint subject axis; overlapping persona profiles are a separate axis, and named
--toolsetsselection plus the meta-toolpowerprofile follow in stacked PRs. See the "Subject-domain taxonomy" section inpackages/mcp/AGENTS.md.Part of #308.
Live validation
Real in-process MCP client sessions confirm the default profile exposes all 187 tools — the partition covers the full surface — and
execute_graphqlis present in the exposed set. The partition itself (complete, disjoint, keyed toPIPEFY_TOOL_NAMES) is enforced at build time by the drift-guard. The full end-to-end matrix across the stack is on #308.