FDEOps MCP servers follow a pluggable source model: core owns the sink, sources are user-added.
| Role | Owner | Examples |
|---|---|---|
| Source | FDE configures separately | Granola, Slack, Notion, Gmail, file |
| Sink | FDEOps (fdeops-ingest) |
stage → propose → apply into engagement memory |
Source MCPs fetch raw text from SaaS APIs using credentials the FDE manages. The ingest MCP never stores OAuth tokens or calls external services - it only shells out to the local fde CLI.
Source MCP(s) fdeops-ingest MCP fde CLI
│ │ │
│ raw transcript/email │ │
└───────────────────────►│ ingest_stage │
├─────────────────────►│ .inbox/
│ ingest_list │
│ ingest_propose ├─► .debrief-propose
│ (FDE confirms) │
│ ingest_apply ├─► .fde/
- Agent pulls from whichever source MCPs are configured.
- Agent stages raw content via
ingest_stage(withsourceprovenance). - Agent proposes routing via
ingest_propose; FDE confirms. - Agent applies via
ingest_apply- nothing writes.fde/unreviewed.
| Package | Path | Purpose |
|---|---|---|
fdeops-ingest-mcp |
fdeops-ingest/ |
Ingest sink (stage, list, propose, apply) |
See recipes/ for file, Granola-shaped, and Notion-shaped setup. In chat: @fde I want to connect Granola → skill connect walks the FDE through config + reload + verify.
Source MCPs are not bundled in fdeops. To add Granola, Gmail, or another provider:
- Install or configure that provider's MCP in your Cursor/Claude
mcp.json. - Configure
fdeops-ingestseparately (seefdeops-ingest/README.md). - In your daily workflow, the agent uses source tools to fetch, then ingest tools to stage and commit.
FDEOps credentials stay local to the CLI; source MCP credentials stay with that MCP.
Non-goals: no bundled OAuth/connectors, no ambient sync, no unreviewed writes to .fde/. Method: skills/fde/references/ingest.md.