Sloth-ninja puts firm controls around AI service connections

A curated connector gallery gives law firms a clearer, safer way to decide which outside services staff can link to their AI workspace.

integrationsecurity

The new gallery separates popular options from the full catalogue, shows whether a connection is working, and keeps existing custom connections visible. It uses simple initial tiles instead of brand logos.

  • One-click connections appear only where the provider has a verified public sign-in route that works end to end.
  • Other services remain available as guidance for a custom connection, with no misleading Connect button.
  • Firm administrators can choose which catalogue entries members see; leaving the list empty keeps the full catalogue available.

Member access and multi-factor authentication still govern who can connect services or change the firm's shortlist.

So what Legal teams adopting AI tools should care because this gives central IT or legal operations more control without hiding the practical connection status from users.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

3 commits from Sloth-ninja/JessicaOSS, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
2dce6b80 WS8 PR E: connectors gallery sloth-ninja 2026-07-23 ↗ GitHub
commit body
Curated MCP connector gallery: a Popular row, All/Connected/Not-connected
filters, a status column ("Connection issue"), initial-letter tiles (no real
brand-logo assets), and one-click Connect for honesty-verified providers, plus
a firm-admin curation card over the org enabled_connector_ids shortlist.

Honesty rule: a provider is only one-click when a public remote MCP server with
OAuth was verified to exist (July 2026) - Google Drive/Gmail/Google Calendar,
Canva, Apollo.io. Everything else (Microsoft 365, DocuSign, Slack, Teams,
HubSpot, Clio) is an informational "custom" entry with no dead Connect button.
Per-provider verification sources recorded in mcpConnectorRegistry.ts and the
BUILD_LOG.

Backend: mcpConnectorRegistry.ts + mcpConnectorGallery.ts (pure status
derivation + org-curation filtering); org enabled_connector_ids read/write;
GET/POST /user/connector-gallery (connect is requireMemberPolicy+MFA gated,
SSRF guard preserved via validateRemoteMcpUrl); GET/PATCH
/admin/connector-gallery (requireAdmin+MFA, registry-id validated).

Frontend: rebuilt account/connectors gallery per the approved mock-up (existing
custom-connector form kept as "Add custom connector"; PR #38 neutral card
preserved when policy off); firm-settings Connectors curation card; mikeApi
methods.

Tests: 43 new (registry/honesty invariants, gallery status derivation, org
filtering incl. empty=all, connect policy-gating + 404 validation, admin
curation authz+validation). Backend 252 vitest pass; frontend tsc + lint at
baseline; evals:smoke 4/4 from main.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
429eecf0 WS8 PR E: review round 1 - honest status for abandoned OAuth + custom cues sloth-ninja 2026-07-23 ↗ GitHub
commit body
- Derive isOAuth for registry rows from entry.availability, not the stored
  auth_type: createUserMcpConnector persists "none" until a token is stored, so
  an abandoned one-click connect (row, no token, no audit rows) was reading
  "connected"; it now reports connection_issue (Reconnect). Regression test added.
- Member gallery: registry "custom" entries render an informational cue (a
  "Custom" marker + description + "Add via custom connector" opening the existing
  form) instead of a bare "Not connected" pill.
- Document loadLatestAuditStatus' shared 500-row window trade-off (degrades safe:
  may miss an error, never invents one).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
83301af2 Merge remote-tracking branch 'origin/main' into ws8-connectors-gallery sloth-ninja 2026-07-23 ↗ GitHub
# Conflicts:
#	CLAUDE.md
#	docs/BUILD_LOG.md

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-1153.md from inside the repo you want the changes in.

⬇ Download capture-thread-1153.md