12. Extension Platform And MCP Strategy
Goal
Define a Seraph extension model that compounds capability without turning the product into an unsafe or incoherent framework.
This document answers:
- whether Seraph should build a real extension platform
- what should become an extension versus stay core
- how MCP should fit into the architecture
- whether Seraph should build a non-MCP alternative
- how to execute the migration from the current codebase
Follow-up decision:
Executive Summary
Seraph should build a real extension platform, but not as one unrestricted in-process plugin runtime.
The right model is:
- typed extensions for most user/operator-extensible capability
- MCP as one connector type, not the whole ecosystem
- a narrow first-party managed connector path for high-value integrations
- core trust/safety/runtime boundaries kept inside Seraph
- trusted code plugins deferred, with the current RFC explicitly keeping them out of scope
The strongest product decision is:
- keep
skills,workflows,runbooks,starter packs,catalog packages,MCP server definitions,observer sources,channels, andscheduled routinesas typed extension surfaces - keep
policy,approval,audit,secret handling,session/threading,workflow execution,capability preflight/repair, and routing as core-owned systems - do not replace MCP with a second open-ended general plugin runtime
- do add a curated non-MCP connector path for cases where Seraph needs tighter auth, UX, rollout, telemetry, and enterprise control than raw MCP provides
Architecture At A Glance
SERAPH EXTENSION PLATFORM
┌──────────────────────────────────────────────────────────────────────────────┐
│ CORE RUNTIME │
│ │
│ policy • approvals • audit • secrets • sessions/threads • routing │
│ workflow engine • preflight/repair • guardian state • activity ledger │
│ │
│ Core owns trust boundaries. Extensions contribute capabilities inside them. │
└──────────────────────────────────────────────────────────────────────────────┘
│
│ loads / validates / enables / audits
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ EXTENSION MANIFEST / PACKAGE │
│ │
│ id • version • compatibility • publisher • permissions • contributes │
└──────────────────────────────────────────────────────────────────────────────┘
│
┌───────────┼───────────────────────┬───────────────────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌───────────┐ ┌───────────────┐ ┌──────────────┐ ┌──────────────┐
│Declarative│ │MCP Connectors │ │Managed │ │Trusted Code │
│Extensions │ │ │ │Connectors │ │Future RFC │
├───────────┤ ├───────────────┤ ├──────────────┤ ├──────────────┤
│skills │ │MCP servers │ │Slack │ │not shipped │
│workflows │ │resources │ │Jira │ │not approved │
│runbooks │ │prompts/tools │ │GitHub │ │revisit only │
│starter │ │stdio/http │ │Google │ │with a new │
│packs │ │long-tail │ │first-party │ │trusted-code │
│presets │ │integrations │ │curated UX │ │RFC │
│routines │ │ │ │ │ │ │
└───────────┘ └─────── ───────┘ └──────────────┘ └──────────────┘
Current Seraph State
Seraph already has multiple extension seams, but they are not unified under one package/runtime model.
Existing typed extension surfaces
SKILL.mdskills loaded from disk:backend/src/skills/loader.pybackend/src/skills/manager.py
- markdown-defined reusable workflows:
backend/src/workflows/loader.pybackend/src/workflows/manager.py
- runtime-managed MCP server definitions:
backend/src/tools/mcp_manager.pybackend/src/api/mcp.py
- catalog/install flows for bundled skills and MCP presets:
backend/src/api/catalog.pybackend/src/api/capabilities.py
Existing bundled native-tool discovery surface
Seraph also has repo-local Python tool discovery:
backend/src/native_tools/loader.pybackend/src/native_tools/registry.py
Important nuance:
- this is not a general arbitrary-code plugin system
- it only auto-discovers trusted, bundled Python tools in
backend/src/tools - it does not install or sandbox third-party code
That means Seraph already behaves like a multi-surface extension product, but not yet like a coherent extension platform.
Reference Findings
Hermes
Hermes is closest to the right shape for Seraph.
What Hermes appears to do well:
- uses typed capability systems instead of one universal plugin SDK
- treats installable skills as the main packageable surface
- keeps tools/toolsets as code-shipped runtime capability
- uses MCP as a first-class external integration path
- has explicit security controls around tools, MCP, and skill installation
Useful lesson:
- Hermes compounds through
skills + tools + MCP + presets, not through arbitrary in-process plugins
Sources:
- https://hermes-agent.nousresearch.com/docs/developer-guide/architecture/
- https://hermes-agent.nousresearch.com/docs/user-guide/features/skills/
- https://hermes-agent.nousresearch.com/docs/user-guide/features/tools/
- https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp/
- https://hermes-agent.nousresearch.com/docs/user-guide/security/
OpenClaw
OpenClaw is broader and more flexible, but also more trust-heavy.
What OpenClaw appears to do:
- supports real code plugins
- allows plugins to register tools, routes, commands, services, context engines, and channels
- separates skills, hooks, and channels as distinct extension surfaces
- installs plugins through packages, not just local config
Useful lesson:
- OpenClaw proves that a broad plugin runtime is powerful
- it also proves that such plugins are effectively trusted code and expand the operator/security burden significantly
Sources:
- https://docs.openclaw.ai/plugins
- https://docs.openclaw.ai/plugins/agent-tools
- https://docs.openclaw.ai/automation/hooks
- https://docs.openclaw.ai/skills
- https://docs.openclaw.ai/security
Obsidian-style plugins
The cleanest lessons here are packaging, lifecycle, and settings UX.
What Obsidian-style plugin ecosystems do well:
- manifest-driven packaging
- clean install/update/remove lifecycle
- explicit settings UI per extension
- strong host-owned lifecycle: load, enable, disable, unload
- clear distinction between host runtime and plugin contribution
Useful lesson:
- Seraph should copy the packaging and lifecycle discipline
- Seraph should not copy the "any plugin can do anything" trust model by default
Sources:
MCP and Anthropic's packaging response
MCP is useful, but the ecosystem itself has already moved toward packaging and install ergonomics on top of raw MCP.
Anthropic's own response is important:
- MCP remained powerful
- raw installation was too complex
- Anthropic introduced Desktop Extensions / MCP Bundles to package local MCP servers with manifests, dependencies, config, permissions, and updates
Useful lesson:
- the problem is not that MCP is worthless
- the problem is that raw MCP alone is not a complete product surface
Source:
MCP Investigation
What MCP is good at
MCP is strongest as a standard connector protocol for external tool surfaces.
It gives Seraph:
- ecosystem reach
- transport-level standardization
- reusable client/server implementations
- a common abstraction for tools, prompts, and resources
- easier leverage of third-party integrations without Seraph inventing a new external protocol
For Seraph, that makes MCP valuable for:
- SaaS integrations
- local companion services
- developer tools
- cross-app connectors
- external tool surfaces not worth implementing natively
What the current pushback actually is
I did not find strong evidence that serious teams are broadly "abandoning MCP."
What I did find is:
- strong security warnings in the official MCP documentation
- real product friction around install/auth/update/debug
- credible operator complaints about context overhead and tool-schema noise
- ecosystem movement toward packaged, curated MCP experiences rather than raw manual MCP setup
So the correct conclusion is:
- people are not mainly rejecting the protocol category
- they are pushing back on raw MCP-first product design
Why people push back on MCP
1. Security and trust complexity
The official MCP security docs are explicit about several non-trivial risk classes:
- confused deputy attacks
- token passthrough anti-patterns
- SSRF during OAuth metadata discovery
- session hijacking and injected events
- local MCP server compromise
- scope minimization failures
Sources:
- https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
- https://modelcontextprotocol.io/specification/2025-03-26/basic/authorization
Key implications for Seraph:
- MCP is not "safe by default"
- the client must enforce serious trust boundaries
- local stdio servers are particularly sensitive because the spec says stdio should use environment-provided credentials rather than HTTP auth
Official spec detail:
- authorization is optional overall
- HTTP transports should implement the authorization spec
- stdio transports should not follow that HTTP auth flow and instead retrieve credentials from the environment
Source:
2. Installation and update friction
Anthropic explicitly says the same thing:
- users needed runtimes installed
- users had to edit config files manually
- dependency conflicts were common
- discovery was poor
- updates were manual and fragile
That is why Anthropic packaged MCP into .mcpb bundles.
Source:
3. Context and schema overhead
There is credible secondary criticism that large MCP tool inventories and heavy JSON schemas create a context tax:
- more tool schema tokens
- harder tool selection for smaller models
- higher latency and cost
- more distractor context
This is not a formal protocol flaw in the spec, but it is a real product concern for agent UX and spend.
Secondary source:
This matches Seraph's needs:
- we want dense, legible operator control
- we do not want raw, uncontrolled tool sprawl pushing budget and context up
4. Quality inconsistency across servers
MCP solves transport and shape better than it solves quality.
In practice, MCP servers vary widely on:
- schema quality
- naming quality
- auth handling
- update cadence
- operational reliability
- policy fit
That means "MCP support" is not enough. Seraph still needs:
- validation
- health checks
- policy mapping
- install/repair UX
- curated defaults
5. Compositional risk
Even if one MCP server seems safe in isolation, tool combinations can create unexpected risk.
Recent reporting on flaws in Anthropic's Git MCP server highlights exactly this kind of compositional danger: safe-looking servers can become dangerous when chained together with other capabilities like filesystem access.
Secondary source:
This fits a broader Seraph rule:
- capability safety must be evaluated compositionally, not just per extension
Should Seraph replace MCP with plugins?
No.
That would create the wrong architecture.
The better framing is:
- MCP is one extension transport
- Seraph needs a broader extension platform above it
So the right answer is:
- do not replace MCP with a custom general plugin protocol
- do not make MCP the only external-capability model either
What Seraph should build instead
Seraph should build a typed extension platform with three trust tiers.
Trust Tier 1: Safe declarative extensions
These should be the default user/operator-extensible surfaces.
Types:
- skills
- workflows
- runbooks
- starter packs
- catalog/installable capability packs
- provider presets
- prompt/personality packs
- scheduled routines/jobs
- observer source definitions where possible
Properties:
- markdown, yaml, or json only
- validated before save/install
- installable, enable/disable, update/remove
- explicit compatibility and permission declarations
- no arbitrary code execution
Trust Tier 2: Connector extensions
These bridge Seraph to external systems.
Types:
- MCP server definitions
- managed first-party connectors
- observer source connectors
- delivery/channel connectors
- workspace/surface adapters such as Obsidian-style integrations
Properties:
- explicit auth/config schema
- explicit permissions
- health checks
- bounded telemetry and audit
- ideally out-of-process or transport-bounded
This is where MCP belongs.
Trust Tier 3: Trusted code plugins
These should exist only later, and only under strict rules.
Types:
- new runtime-native tools
- deep host extensions
- custom in-process integrations that cannot fit typed or connector models
Properties:
- signed, bundled, or explicitly trusted only
- no default marketplace exposure in v1
- stronger review and policy gates
This should not be Seraph's main extension story.
What should become extensions
The earlier plugin discussion should be expanded into the actual Seraph capability types:
- skills
- workflows
- runbooks
- starter packs
- installable catalog packages
- MCP server definitions
- managed connector definitions
- observer source connectors
- delivery/channel connectors
- provider presets
- prompt/personality bundles
- scheduled routines/jobs
Important additions versus the earlier rough list:
- observer sources are a first-class capability type
- scheduled routines/jobs are a first-class capability type
- installable capability packs are a first-class capability type
What must stay core
These systems define Seraph's trust boundary and should stay host-owned:
- policy engine
- approval engine
- audit and activity ledger model
- secret-ref handling
- session and thread model
- world model and guardian state core synthesis
- workflow execution engine
- capability preflight and repair engine
- routing/provider control
- extension lifecycle enforcement
Extensions should contribute capabilities inside those systems, not replace them.
Recommended Seraph Package Model
Seraph should introduce one extension manifest and one package/install lifecycle.
For the current migration, the canonical manifest should cover capability-pack
and connector-pack only. Trusted code remains deferred to the later RFC slice
instead of being normalized into the first manifest contract.
Manifest structure
capability-pack
├─ manifest.yaml
├─ skills/
│ └─ web-briefing.md
├─ workflows/
│ └─ web-brief-to-file.md
├─ runbooks/
│ └─ research-briefing.yaml
├─ starter-packs/
│ └─ research.json
├─ mcp/
│ └─ http-request.json
├─ observers/
│ ├─ definitions/
│ │ └─ calendar.yaml
│ └─ connectors/
│ └─ calendar-sync.yaml
├─ presets/
│ └─ provider/
│ └─ routing.yaml
├─ prompts/
│ └─ guardian.md
├─ routines/
│ └─ daily-review.yaml
├─ connectors/
│ └─ managed/
│ └─ slack.yaml
├─ channels/
│ └─ desktop.yaml
└─ workspace/
└─ live-view.yaml
Example:
id: seraph.research-briefing
version: 2026.3.21
display_name: Research Briefing
kind: capability-pack
compatibility:
seraph: ">=2026.3.19"
publisher:
name: Seraph
trust: bundled
contributes:
skills:
- skills/web-briefing.md
workflows:
- workflows/web-brief-to-file.md
runbooks:
- runbooks/research-briefing.yaml
mcp_servers:
- mcp/http-request.json
permissions:
tools:
- web_search
- write_file
network: true
Here trust is package provenance (bundled, local, or later verified),
not a replacement for the trust-tier architecture above.
For the current migration, these package roots are canonical:
skills/workflows/runbooks/starter-packs/presets/provider/prompts/routines/mcp/connectors/managed/observers/definitions/observers/connectors/channels/workspace/
This lets one package contribute multiple typed surfaces without inventing a universal runtime plugin contract.
Runtime flow from install to execution
┌──────────────────┐
│ Extension file │
│ or registry │
└────────┬─────────┘
│ install
▼
┌──────────────────┐
│ Manifest parse │
│ + compatibility │
│ + signature │
└────────┬─────────┘
│ validate
▼
┌──────────────────┐
│ Contribution │
│ scanners │
│ skills/workflows │
│ MCP/connectors │
└────────┬─────────┘
│ permission review
▼
┌──────────────────┐
│ Core policy │
│ mapping │
│ approvals │
│ execution bnds │
└────────┬─────────┘
│ enable
▼
┌──────────────────┐
│ Capability │
│ registry │
│ tools/skills │
│ workflows/etc. │
└────────┬─────────┘
│ surface in cockpit
▼
┌──────────────────┐
│ Operator UI │
│ install/repair │
│ runbooks/packs │
│ activity trace │
└────────┬─────────┘
│ invoke
▼
┌──────────────────┐
│ Runtime exec │
│ routed through │
│ audit/policy │
│ secret guards │
└──────────────────┘
Recommended Lifecycle
Every extension should support:
- install
- validate
- review permissions
- enable/disable
- configure
- test/health check
- update
- remove
The UI should present one unified extension/operator surface even when the underlying extension type differs.
Managed connectors as the alternative to raw MCP
Seraph should add a second connector path, but only for curated, high-value systems.
This should be a managed connector model, not a second open ecosystem.
Use managed connectors when Seraph wants:
- first-party auth UX
- better enterprise rollout/control
- stronger telemetry and audit
- smoother install/update/repair
- stricter permission mapping
- tighter support guarantees
Use MCP when Seraph wants:
- broad compatibility
- faster integration with existing ecosystems
- external tool reuse
- lower implementation cost for long-tail integrations
Rule of thumb:
- if the value is ecosystem breadth, use MCP
- if the value is trust, enterprise operability, and polished first-party UX, use a managed connector
Connector choice matrix
┌────────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┐
│ Dimension │ MCP connector │ Managed connector │ Trusted code plugin │
├────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Main goal │ ecosystem breadth │ curated UX + trust │ deep host extension │
│ Install UX │ medium / often rough │ polished / owned │ heavy / explicit │
│ Auth ownership │ shared w/ server │ Seraph-owned │ plugin-owned/core │
│ Update path │ per server │ first-party managed │ plugin lifecycle │
│ Context overhead │ can be high │ controllable │ controllable │
│ Safety posture │ transport-standard │ tighter policy fit │ highest risk │
│ Best for │ long-tail tools │ top enterprise apps │ rare deep runtime │
│ Should be default? │ yes, for breadth │ yes, curated cases │ no │
└────────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┘
What Seraph should not do
- do not build a second open-ended connector protocol that competes with MCP
- do not make arbitrary third-party Python code the main extension story
- do not let extensions own approval, policy, or audit logic
- do not let package installation bypass capability preflight or secret handling
- do not let MCP servers appear as trusted just because they follow the protocol
Recommended Execution Plan
Canonical slice ownership lives in docs/implementation/00-master-roadmap.md.
This section groups the same transition into phases so the architectural logic
stays readable without duplicating a competing queue.
Phase 1: Clarify today's architecture
Goal:
- reduce naming confusion and establish the new model without changing behavior first
Work:
- rename the internal
plugins/concept in code/docs to something likenative_toolsorbundled_tools - document current extension types explicitly in API and docs
- define the extension manifest schema
Queue slices:
extension-model-terminology-v1extension-manifest-schema-v1extension-registry-and-loader-v1extension-validation-and-doctor-v1
Phase 2: Package the declarative surfaces
Goal:
- move from loose files to versioned extension packages
Work:
- package skills, workflows, runbooks, and starter packs under one manifest
- make bundled defaults ship as real extension packages
- support local install/update/remove for capability packs
Queue slices:
extension-package-layout-v1extension-scaffold-tools-v1extension-authoring-docs-v1example-capability-pack-v1capability-packaging-skills-v1capability-packaging-workflows-v1capability-packaging-runbooks-and-starter-packs-v1bundled-capability-packs-v1
Phase 3: Normalize connector surfaces
Goal:
- treat MCP and non-MCP connectors as siblings under one extension UI
Work:
- define connector manifests
- package MCP server definitions and setup flows
- add managed connector abstraction for first-party integrations
- keep the same cockpit lifecycle for both
Queue slices:
extension-lifecycle-api-v1extension-studio-manifest-awareness-v1extension-lifecycle-ui-v1connector-manifest-and-health-v1mcp-packaging-and-install-flow-v1managed-connectors-v1
Phase 4: Extend input/output reach cleanly
Goal:
- move observer and channel reach into the same typed platform
Work:
- observer source connectors
- delivery/channel adapters
- workspace/surface adapters
Queue slices:
observer-source-extensions-v1channel-adapter-extensions-v1extension-permissions-and-approvals-v1extension-audit-and-activity-v1extension-versioning-and-update-flow-v1legacy-loader-cleanup-v1
Phase 5: Reassess trusted code plugins
Goal:
- decide later whether trusted code plugins are actually necessary
Work:
- only after phases 1-4 prove insufficient
- if needed, introduce signed or explicitly trusted code plugins with strong policy gates
Queue slice:
trusted-code-plugins-rfc-v1
Product recommendation
The recommended product contract is:
- Seraph is an extension platform built around typed capability contributions
- MCP is one external connector path inside that platform
- managed connectors are the alternative to raw MCP for curated first-party experiences
- the core runtime remains the owner of safety, policy, audit, approval, and threading
This gives Seraph:
- better safety than a broad plugin runtime
- better product coherence than raw file-based extensibility
- better install/update UX than raw MCP
- better enterprise operability than unmanaged connectors
- better ecosystem reach than a purely first-party integration strategy
Decision
Seraph should change from:
- separate skills/workflows/MCP/catalog surfaces
to:
- one extension platform with typed contributions
But it should not change into:
- one broad arbitrary-code plugin runtime
That is the crucial architectural boundary.
Sources
- Seraph code and docs:
backend/src/skills/loader.pybackend/src/skills/manager.pybackend/src/workflows/loader.pybackend/src/workflows/manager.pybackend/src/tools/mcp_manager.pybackend/src/api/catalog.pybackend/src/api/capabilities.py
- Hermes:
- https://hermes-agent.nousresearch.com/docs/developer-guide/architecture/
- https://hermes-agent.nousresearch.com/docs/user-guide/features/skills/
- https://hermes-agent.nousresearch.com/docs/user-guide/features/tools/
- https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp/
- https://hermes-agent.nousresearch.com/docs/user-guide/security/
- OpenClaw:
- Obsidian:
- MCP:
- Secondary sources used as supporting evidence, not protocol truth: