Phase 54 OMD Multi Program MCP Initiative - TerrenceMcGuinness-NOAA/global-workflow GitHub Wiki
Version: 0.2.0 (Ground-Truth Refresh)
Status: Initiative — pilot target identified
Created: 2026-05-06
Updated: 2026-05-22 (folded in five-pillar reality discovered during dev/sfs deep dive)
Author: Terry McGuinness + AI Assistant
Type: Initiative (multi-phase; spawns phase54a_* … phase54f_* execution specs)
Dependency: Phase 11E (n8n / orchestration), Phase 26 (Docker MCP Gateway), Phase 53 (Gateway Tool Quality)
Related: Phase 4d (Multi-tenant SDD workspaces), Phase 52 (v17 paradigm coverage)
The v0.1 draft (2026-05-06) described a 4-tenant target —
gw-mcp / gw-v17-mcp / ufs-mcp / mpas-mcp — based on partial
visibility into the OMD program portfolio. The 2026-05-22 deep dive on
the freshly connected global-workflow_dev-sfs submodule surfaced ground
truth that materially expands the picture: five active development
pillars exist inside NOAA-EMC/global-workflow.git alone, and develop
is no longer the canonical view of "global-workflow" — it is one of six
living trajectories. This refresh folds that reality into the Initiative
and identifies dev/sfs as the natural pilot target.
The NOAA Office of Modeling Development (OMD, formerly EMC) maintains
a portfolio of modeling programs that increasingly need first-class
AI/RAG support — not just the global-workflow:develop line that the
current agentcore-mcp-rag server was built for. Discovered during the
2026-05-22 dev/sfs investigation, the live portfolio inside the single
NOAA-EMC/global-workflow.git repository is:
| Pillar | Branch | Ahead of develop | Behind | Diff vs develop | Last commit | Maturity |
|---|---|---|---|---|---|---|
| GFS v17 (next-gen coupled) | dev/gfs.v17 |
71 | 163 | 894 files / +40 700 / -27 347 | 2026-05-21 | Massive — entire system rewrite |
| GFS v16 (current operational, evolving) | dev/gfs.v16 |
855 | 2 053 | 2 287 files / +128 261 / -120 285 | 2026-03-06 | Largest delta, sync-stalled |
| GCAFS v1 (chemistry & aerosols) | dev/gcafs.v1 |
33 | 115 | 667 files / +11 875 / -9 432 | 2026-05-13 | Active, focused |
| JEDI-GFS (DA experimentation) | dev/jedi-gfs |
0 | 179 | 834 files / +18 930 / -29 725 | 2025-12-09 | Stale — 5 mo no commits |
| SFS (S2S post-processing) | dev/sfs |
284 | 0 | 112 files / +3 829 / -145 | 2026-05-22 (today) | Fresh, in PR review — pilot candidate |
| develop (canonical operational) | develop |
— | — | (baseline) | hourly | Currently the only tenant in the AgentCore RAG |
Beyond global-workflow, the OMD portfolio also includes UFS (a shared component embedded inside multiple downstream programs), MPAS (which contains UFS components), and future programs (RRFS, HAFS, …) as the portfolio grows.
The current architecture has one monolithic AgentCore Runtime
(<PYTHON_RUNTIME_ID>) ingesting one branch of one
repo into one Neptune cluster and one set of OpenSearch indices. There
is no way to ask the platform "reason about the gfs.v17 coupled branch"
or "reason about MPAS" without re-pointing the entire server. The
configuration-management hazard the v0.1 draft warned about is already
real: agents asking about JGLOBAL_FORECAST get develop-branch
answers when the user is working from dev/gfs.v17 where the same file
may not exist or has materially different behaviour.
This Initiative establishes the architecture and execution plan to decompose that monolith into program-scoped MCP tenants — one per OMD pillar, with shared-component inheritance, branch-scoped isolation, content-addressed storage dedupe, lifecycle states, and a router that helps agents pick the right tenant.
A secondary capability (third-party MCP discovery with a headless secret broker) is included because it shares the catalog/auth machinery that the multi-tenant arm needs and because it unlocks several adjacent OMD workflows (literature review, external dataset ingestion). It is intentionally framed as supporting, not leading.
As a repo configuration manager juggling six living branches across
global-workflow(develop,dev/sfs,dev/gfs.v17,dev/gcafs.v1,dev/gfs.v16,dev/jedi-gfs) plusufsand future programs, I want one gateway URL where each pillar is a distinct MCP tenant (gw-mcp,gw-sfs-mcp,gw-v17-mcp,gw-gcafs-mcp,gw-v16-mcp,gw-jedi-mcp,ufs-mcp,mpas-mcp) with its own data view, and where shared components (UFS) are referenced from a single source of truth, so that an agent working a v17-coupled bug never seesdevelop-branch code, an SFS user gets the post-processing pipeline that doesn't yet exist on develop, an MPAS agent transparently inherits UFS tools, and divergence between branches stops causing cross-contaminated answers.
As an OMD program lead onboarding a new model (e.g., MPAS, RRFS, HAFS) or a new branch within an existing program (e.g., the next
dev/*line), I want a documented "tenant template" that defines what a new pillar needs (repo reference, branch, optionalextends:parent, lifecycle state, staleness threshold, auth requirements), so that onboarding a new pillar is a configuration change, not a code change to the MCP server.
As an OMD researcher writing a forward-looking technical document, I want the agent to autonomously discover, authenticate to, and call third-party knowledge MCPs (arXiv, Semantic Scholar, OpenAlex) through the same gateway, so that literature review and citation discovery are part of the same conversation as the code analysis, without me hand-managing API keys.
| ID | Workstream | Primary arm | Outcome |
|---|---|---|---|
| 54a | Tenant catalog schema | Multi-pillar | Define the YAML schema for an OMD pillar tenant: tenant_id, repo_ref, branch, extends:, index_prefix / label_prefix, lifecycle_state ∈ {experimental, staging, production, merged}, staleness_threshold_days, secrets:. |
| 54b | Per-tenant data isolation | Multi-pillar | Implement isolation in the AWS data layer: per-tenant OpenSearch index prefix and per-tenant Neptune label prefix (since AWS Neptune doesn't have multi-database semantics). Re-package the existing 52 tools to honor tenant_id. |
| 54c | Shared-component inheritance (extends:) |
Multi-pillar | Allow mpas-mcp to declare extends: [ufs-mcp] and inherit UFS tool results without duplicate ingestion. Decision required on resolution semantics (catalog-time merge vs query-time fan-out — see R7). |
| 54d | Branch-scoped tenants & content-addressed dedupe | Multi-pillar | Six gw-* tenants on the same Docker image with different WORKFLOW_REF env vars. SHA-keyed dedupe so an SFS chunk identical to a develop chunk is stored once and referenced from both tenant indices. Critical-path, was R3 in v0.1. |
| 54e | Tenant routing & attribution | Multi-pillar | Agent-facing which_pillar(file_or_topic) recommender; gateway-side tenant_id tag on every tool response. |
| 54g | Lifecycle & staleness (NEW) | Multi-pillar | Tenants carry a lifecycle state. [STALE] marker auto-prepended to responses from a tenant whose branch has had no commits in N days (default 60). When a dev/* branch merges to develop, the corresponding tenant auto-deprecates with a deprecation notice. Promotion path: experimental → staging → production → merged. |
| 54f | Headless auth broker + 3rd-party MCP pilot | Supporting | Replace Docker-Desktop secrets with a Linux-native broker (age/sops or Vault); pilot one no-key MCP (arxiv-mcp-server) and one keyed MCP (semantic-scholar-mcp) end-to-end. Catalog/auth schema reused from 54a. |
- Cross-tenant query federation — "find this symbol across UFS and MPAS".
-
Tenant lifecycle CLI —
eib-tenant create gw-sfs --extends gw --branch dev/sfs --lifecycle experimental. - Audit log — who-invoked-which-tool-on-which-tenant.
- Per-MCP rate-limit / cost caps at the broker layer (54f).
- OAuth 2.0 device-code flow for third-party MCPs needing interactive consent.
- Cross-pillar diff tooling — "show me what dev/gfs.v17 changed in the forecast driver" implemented as a tenant-pair query.
- Re-introducing Docker Desktop on the gateway host.
- Re-implementing the existing 52-tool surface — 54b re-packages the existing tools to be tenant-aware; their behaviour is unchanged.
- Migrating away from Neptune or OpenSearch — 54b uses native index-prefix and label-prefix scoping.
- Onboarding non-OMD programs in v1.
- Any third-party MCP requiring a paid plan beyond a free tier.
- The catalog lists ≥6 OMD pillar tenants by end-of-Initiative:
gw-mcp(develop),gw-sfs-mcp,gw-v17-mcp,gw-gcafs-mcp,gw-v16-mcp, plusufs-mcp. (gw-jedi-mcpandmpas-mcpmay be staged per R5.) -
Branch-isolation probe: querying
analyze_code_structureondev/scripts/exglobal_atmos_post.shreturns the SFS post-processing implementation fromgw-sfs-mcpand a "file not found" fromgw-mcp(the file does not exist on develop). -
Inheritance probe:
mpas-mcp.find_callers_calleeson a UFS symbol returns results withoutufs-mcpbeing explicitly invoked. -
Tenant attribution: every response from any tenant carries a
tenant_idfield; audit-log entries reference it. -
CM-hazard regression: an agent prompt "summarize the SFS atmos post pipeline" returns SFS-pillar code only; never returns content from
develop(verified by file-path inspection — files underdev/jobs/JGLOBAL_ATMOS_POSTonly exist ondev/sfs). - Onboarding cost: adding a seventh tenant (e.g., RRFS) is documented as a catalog-only change; no edits to the MCP server source code.
-
(NEW) Staleness flag: querying
gw-jedi-mcp(5 mo stale) returns a[STALE]marker on every response with the last-commit timestamp. -
(NEW) Promotion: when a
dev/*branch merges to develop, the corresponding tenant transitions tolifecycle: merged; subsequent calls return a deprecation notice pointing atgw-mcp.
-
mcp-find arxivon the production gateway returns ≥1 result. -
mcp-config-setrejects a config that omits a required secret with a schema-validation error. - The agent runs ≥10 chained
search_papers/get_paper_detailscalls againstsemantic-scholar-mcpwithout manual key intervention. - Gateway restart preserves the catalog, the secret store, and any saved tenant configurations. No manual re-bootstrap.
| # | Risk / Question | Owner |
|---|---|---|
| R1 |
Neptune label-prefix scoping at scale — every Cypher query in the 52-tool surface needs a tenant_id label predicate. Migration mechanics: index alias swap or full re-ingestion? |
54b spike |
| R2 |
extends: resolution semantics — does mpas-mcp extends: [ufs-mcp] resolve at catalog time (UFS tools merged into the MPAS server's tool list) or at query time (MPAS server fans out to UFS server per call)? Former is simpler, latter scales better. |
54c design |
| R3 | Branch-divergence ingestion cost — six pillars × ~125K nodes × five OpenSearch indices × Bedrock embedding cost. Naive ingestion is 6× the current bill. Critical-path (was nice-to-have in v0.1). | 54d |
| R4 |
Tenant discovery UX — if the agent has to learn 6+ tenants up front, prompt overhead grows. The which_pillar router (54e) is on the critical path. |
54e |
| R5 |
MPAS repo readiness — MPAS is not yet a submodule of supported_repos/. v1 may stage external programs after the six in-repo pillars land. |
Terry / OMD |
| R6 |
Headless secret store choice — age/sops vs HashiCorp Vault — which is acceptable to NCO security review? |
54f / Terry |
| R7 |
AgentCore Runtime per-tenant deployment cost — option A: one AgentCore Runtime per tenant (clean isolation, expensive). Option B: one Runtime per all tenants, route on tenant_id header (cheap, requires routing layer). |
54b architecture |
| R8 | Stale-branch detection threshold — 60 days arbitrary. Should be tunable per-tenant (some pillars iterate slowly by design). | 54g |
| R9 |
Tenant-merge auto-detection — how does the system know dev/sfs merged into develop? Polling git? Webhook? Manual catalog update? |
54g |
| R10 | Stakeholder alignment — OMD program leads beyond global-workflow have not yet been consulted on what "tenant readiness" means for their program. The Initiative needs an OMD review checkpoint before 54b execution begins. | Terry |
| R11 | OMD vs EPIC naming — every public-facing artifact must consistently use "Initiative" not "EPIC" to avoid clash with the Earth Prediction Innovation Center. | All |
54a (catalog schema) ─┐
├─► 54b (data isolation + tenant_id propagation)
│ │
│ ├─► 54c (extends:)
│ └─► 54d (branch tenants + dedupe) ──► 54g (lifecycle + staleness)
│ │
│ ▼
└────────────────────► 54e (routing & attribution)
│
└─► 54f (auth broker + 3rd-party pilot) [parallel]
Pilot rollout sequence (refined for incremental validation):
-
omd-tenants-1-foundation= 54a + 54b minimum. Existing AgentCore Runtime becomes the single tenantgw; nothing else changes from the user perspective but the plumbing is in place. -
omd-tenants-2-sfs-pilot= 54d against the smallest pillar. Stand upgw-sfsagainstsupported_repos/global-workflow_dev-sfs, ingest only the 112-file diff, run the branch-isolation probe. -
gw-v17-tenant= the operational prize. Repeat fordev/gfs.v17once the SFS pilot proves the foundation. -
Remaining pillars =
gw-gcafs-mcp,gw-v16-mcp,gw-jedi-mcpin order of community urgency. -
extends:(54c) + UFS tenant = once 2 + pillars share UFS, dedupe is worth the engineering. - Routing + lifecycle (54e + 54g) = once 3 + tenants exist, the UX work pays off.
- Auth broker (54f) = parallel to all of the above.
Each will get its own SDD spec under sdd_framework/workflows/:
phase54a_tenant_catalog_schema.md
phase54b_per_tenant_data_isolation.md
phase54c_shared_component_inheritance.md
phase54d_branch_scoped_tenants.md
phase54e_tenant_routing_and_attribution.md
phase54f_headless_auth_broker_and_3p_mcp_pilot.md
phase54g_tenant_lifecycle_and_staleness.md
Use start_sdd_session({phase:"phase54_omd_multi_pillar_mcp_initiative", role:"initiative"})
to open the umbrella session. Each sub-phase opens its own session and
links back to this Initiative via the parent_phase field.
-
.kiro/settings/mcp.json— current single-tenant gateway config -
supported_repos/global-workflow—develop(current single tenant) -
supported_repos/global-workflow_dev-sfs— first multi-tenant pilot target -
phase4d_multi_tenant_sdd_workspaces.md— prior multi-tenant work (SDD-workspace scope) -
phase52_v17_paradigm_coverage.md— earlier work specifically on v17 paradigm gaps -
v17_paradigm_assessment.md— 2026-04-22 v17 branch-comparison
# .kiro/settings/agentcore_tenants.yaml (illustrative, post-54a/54b/54d)
defaults:
runtime_image: <ACCOUNT_ID>.dkr.ecr.us-east-1.amazonaws.com/mdc-mcp-rag:python-titan-v5
staleness_threshold_days: 60
tenants:
# === In-repo pillars (NOAA-EMC/global-workflow.git) ===
gw:
tenant_id: gw
repo_ref: NOAA-EMC/global-workflow
branch: develop
index_prefix: gw_
label_prefix: GW_
lifecycle: production
description: "Operational GFS/GEFS line — current canonical baseline"
gw-sfs:
tenant_id: gw_sfs
repo_ref: NOAA-EMC/global-workflow
branch: dev/sfs
extends: [gw] # Inherit develop's untouched code
index_prefix: gw_sfs_
label_prefix: GW_SFS_
lifecycle: experimental
description: "Seasonal Forecast System post-processing pipeline (atmos/ocean/ice + ocean diags)"
gw-v17:
tenant_id: gw_v17
repo_ref: NOAA-EMC/global-workflow
branch: dev/gfs.v17
extends: [gw]
index_prefix: gw_v17_
label_prefix: GW_V17_
lifecycle: staging
description: "Next-generation coupled GFS — operational target"
gw-gcafs:
tenant_id: gw_gcafs
repo_ref: NOAA-EMC/global-workflow
branch: dev/gcafs.v1
extends: [gw]
index_prefix: gw_gcafs_
label_prefix: GW_GCAFS_
lifecycle: experimental
description: "Global Chemistry & Aerosol Forecast System v1"
gw-v16:
tenant_id: gw_v16
repo_ref: NOAA-EMC/global-workflow
branch: dev/gfs.v16
extends: [gw]
index_prefix: gw_v16_
label_prefix: GW_V16_
lifecycle: production
description: "Current operational v16 line (parallel evolution)"
gw-jedi:
tenant_id: gw_jedi
repo_ref: NOAA-EMC/global-workflow
branch: dev/jedi-gfs
extends: [gw]
index_prefix: gw_jedi_
label_prefix: GW_JEDI_
lifecycle: experimental
staleness_marker: true # 5 mo idle as of 2026-05-22
description: "JEDI-based DA experimentation (currently stale)"
# === Cross-program pillars (future) ===
ufs:
tenant_id: ufs
repo_ref: ufs-community/ufs-weather-model
branch: develop
index_prefix: ufs_
label_prefix: UFS_
lifecycle: production
description: "Shared atmosphere/ocean/ice/wave coupled component"
mpas:
tenant_id: mpas
repo_ref: MPAS-Dev/MPAS-Model
branch: main
extends: [ufs]
index_prefix: mpas_
label_prefix: MPAS_
lifecycle: experimental
description: "Model for Prediction Across Scales — voronoi-mesh dynamical core"Key property: all tenants run the same Docker image. The 52-tool surface is identical; only the data view differs. CM divergence between six pillars becomes a catalog concern, not a server-code concern. Onboarding a new OMD program is adding ~10 lines of YAML.
| Property | dev/sfs | dev/gfs.v17 | dev/gfs.v16 |
|---|---|---|---|
| Diff size | 112 files / +3 829 | 894 files / +40 700 | 2 287 files / +128 K |
| Develop sync recency | today | 4 days | 2 months stale |
| In-flight | PR review (today) | active dev | sync-stalled |
| Likely promotion event | weeks away | months | unknown |
| Engineering cost (ingest) | lowest | high | highest |
| Validation value | branch-isolation probe + lifecycle drill | full operational scale | sync-stale baseline |
The dev/sfs branch is small enough to ingest in one Bedrock embedding run, in active code review (so the lifecycle promotion drill is imminent), and tightly synced with develop (so dedupe shows its value immediately). It is the canonical "learn the foundation cheaply, then apply it to the operational prize" target.