Sea Haven MCP platform — trust-tiered MCP servers + Cognito/Google auth broker, replacing seahaven-slack-bot and exec-aide (design phase)
Find a file
dependabot[bot] a8ade39849
chore(deps): bump the minor-and-patch group with 10 updates
Bumps the minor-and-patch group with 10 updates:

| Package | From | To |
| --- | --- | --- |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `4.1.10` | `4.1.11` |
| [aws-cdk](https://github.com/aws/aws-cdk-cli/tree/HEAD/packages/aws-cdk) | `2.1136.0` | `2.1138.0` |
| [aws-cdk-lib](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk-lib) | `2.265.0` | `2.266.0` |
| [eslint](https://github.com/eslint/eslint) | `10.8.1` | `10.9.0` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.10` | `4.1.11` |
| [jose](https://github.com/panva/jose) | `6.2.9` | `6.2.10` |
| [@aws-sdk/client-cognito-identity-provider](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-cognito-identity-provider) | `3.1111.0` | `3.1116.0` |
| [@aws-sdk/client-dynamodb](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-dynamodb) | `3.1111.0` | `3.1116.0` |
| [@aws-sdk/client-secrets-manager](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-secrets-manager) | `3.1111.0` | `3.1116.0` |
| [@aws-sdk/lib-dynamodb](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/lib/lib-dynamodb) | `3.1111.0` | `3.1116.0` |


Updates `@vitest/coverage-v8` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/coverage-v8)

Updates `aws-cdk` from 2.1136.0 to 2.1138.0
- [Release notes](https://github.com/aws/aws-cdk-cli/releases)
- [Commits](https://github.com/aws/aws-cdk-cli/commits/aws-cdk@v2.1138.0/packages/aws-cdk)

Updates `aws-cdk-lib` from 2.265.0 to 2.266.0
- [Release notes](https://github.com/aws/aws-cdk/releases)
- [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.alpha.md)
- [Commits](https://github.com/aws/aws-cdk/commits/v2.266.0/packages/aws-cdk-lib)

Updates `eslint` from 10.8.1 to 10.9.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.8.1...v10.9.0)

Updates `vitest` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/vitest)

Updates `jose` from 6.2.9 to 6.2.10
- [Release notes](https://github.com/panva/jose/releases)
- [Changelog](https://github.com/panva/jose/blob/main/CHANGELOG.md)
- [Commits](https://github.com/panva/jose/compare/v6.2.9...v6.2.10)

Updates `@aws-sdk/client-cognito-identity-provider` from 3.1111.0 to 3.1116.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-cognito-identity-provider/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1116.0/clients/client-cognito-identity-provider)

Updates `@aws-sdk/client-dynamodb` from 3.1111.0 to 3.1116.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-dynamodb/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1116.0/clients/client-dynamodb)

Updates `@aws-sdk/client-secrets-manager` from 3.1111.0 to 3.1116.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-secrets-manager/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1116.0/clients/client-secrets-manager)

Updates `@aws-sdk/lib-dynamodb` from 3.1111.0 to 3.1116.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/lib/lib-dynamodb/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.1116.0/lib/lib-dynamodb)

---
updated-dependencies:
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: aws-cdk
  dependency-version: 2.1138.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: aws-cdk-lib
  dependency-version: 2.266.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: eslint
  dependency-version: 10.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: vitest
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: jose
  dependency-version: 6.2.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: "@aws-sdk/client-cognito-identity-provider"
  dependency-version: 3.1116.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@aws-sdk/client-dynamodb"
  dependency-version: 3.1116.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@aws-sdk/client-secrets-manager"
  dependency-version: 3.1116.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: "@aws-sdk/lib-dynamodb"
  dependency-version: 3.1116.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-25 11:37:11 +00:00
.github chore(ci): remove pr policy workflow caller (#61) 2026-08-24 15:12:53 -04:00
.security-review chore(deps): batch Dependabot updates (#31, #32) (#33) 2026-07-21 15:49:13 -04:00
auth chore(deps): bump the minor-and-patch group with 10 updates 2026-08-25 11:37:11 +00:00
docs ci(deploy): switch deploy trigger from push-to-main to manual workflow_dispatch (#39) 2026-07-28 16:29:49 +00:00
infra chore(deps): bump the minor-and-patch group in /infra with 3 updates (#54) 2026-08-18 17:30:58 +00:00
packages chore(deps): bump the minor-and-patch group with 10 updates 2026-08-25 11:37:11 +00:00
servers chore(deps): bump the minor-and-patch group with 10 updates 2026-08-25 11:37:11 +00:00
.editorconfig Phase 0b slice: monorepo scaffold + @sh-mcp/shared core + integration packages (#2) 2026-06-26 12:42:17 -04:00
.gitignore Phase 0b slice: monorepo scaffold + @sh-mcp/shared core + integration packages (#2) 2026-06-26 12:42:17 -04:00
.mergify.yml chore(ci): switch auto-merge from seahaven-bot to Mergify (#60) 2026-08-24 13:53:04 -04:00
.prettierignore Phase 1: runnable MCP + OpenAPI servers (ops + finance) (#3) 2026-06-26 13:33:21 -04:00
.prettierrc Phase 0b slice: monorepo scaffold + @sh-mcp/shared core + integration packages (#2) 2026-06-26 12:42:17 -04:00
AGENTS.md ci: add org PR policy caller (PLAT-62) (#52) 2026-08-11 12:04:16 -04:00
cdk.json Phase 2a: Cognito auth substrate (CDK) + pre-token & group-sync Lambdas (#4) 2026-06-26 14:33:46 -04:00
eslint.config.js Phase 2a: Cognito auth substrate (CDK) + pre-token & group-sync Lambdas (#4) 2026-06-26 14:33:46 -04:00
package-lock.json chore(deps): bump the minor-and-patch group with 10 updates 2026-08-25 11:37:11 +00:00
package.json chore(deps): bump the minor-and-patch group with 10 updates 2026-08-25 11:37:11 +00:00
README.md ci(deploy): switch deploy trigger from push-to-main to manual workflow_dispatch (#39) 2026-07-28 16:29:49 +00:00
tsconfig.base.json Phase 0b slice: monorepo scaffold + @sh-mcp/shared core + integration packages (#2) 2026-06-26 12:42:17 -04:00
tsconfig.json Phase 2a: Cognito auth substrate (CDK) + pre-token & group-sync Lambdas (#4) 2026-06-26 14:33:46 -04:00
vitest.config.ts Phase 1: runnable MCP + OpenAPI servers (ops + finance) (#3) 2026-06-26 13:33:21 -04:00

sh-mcp

CI TypeScript Node AWS CDK Slack

Sea Haven MCP platform. A TypeScript monorepo of trust-tiered MCP servers that expose Sea Haven's proprietary integrations as tools, plus the Cognito/Google auth broker and the rebuilt scheduled jobs. This service replaces seahaven-slack-bot and exec-aide, which are deprecated completely; the conversational surface becomes a configurable Slack task agent.

Status: BUILDING. Platform + auth substrate built; nothing deployed to AWS yet. Phase 0b (monorepo + @sh-mcp/shared core), Phase 1 (runnable sh-mcp-ops / sh-mcp-finance over MCP + OpenAPI), and Phase 2a (the Cognito auth substrate CDK stack + pre-token/group-sync Lambdas) are on main. The servers run locally (SH_MCP_ENV=local); SH_MCP_ENV=aws is wired but not yet deployed. The authoritative spec is docs/design.md.

Documentation

The canonical map of Sea Haven's AWS infrastructure lives in Confluence. This project's sh-mcp-auth, sh-mcp-ops, and sh-mcp-finance stacks are represented there as Mermaid subgraphs.

Infrastructure (CDK app)

All AWS infrastructure is defined as code with the AWS CDK (TypeScript, aws-cdk-lib pinned in package.json). The repo root is the CDK app: cdk.json is the app config and points the CDK CLI at the app entry point.

// cdk.json
{
  "app": "tsx infra/bin/app.ts", // entry point (run with tsx, no pre-compile)
  "output": "cdk.out",           // synth output dir (git-ignored)
  "context": { "@aws-cdk/core:newStyleStackSynthesis": true }
}
  • Entry point — infra/bin/app.ts constructs the App and instantiates the stacks. Every stack sets an explicit kebab-case stackName and pins env to account 328440206208 / us-east-1, so synth needs no AWS credentials (shared CMKs are referenced by ARN, not fromLookup).
  • Stacks — infra/lib/. Currently one: ShMcpAuthStack → sh-mcp-auth (the Cognito auth substrate, detailed below). The per-tier sh-mcp-ops / sh-mcp-finance hosting stacks join the same app in Phase 2b. The Lambda handler source the stacks bundle lives in auth/ (and later servers/ / jobs/), not under infra/.
  • Deploy-time context — the app reads two optional -c context inputs: callbackUrls (per-tier OAuth callback URLs; defaults to a placeholder until the conversational surface is chosen) and logsKmsArn (the alias/seahaven-logs CMK for the Lambda log groups; AWS-managed encryption is used if absent).
# from the repo root
npm ci
npx cdk synth                         # synthesize CloudFormation into cdk.out/
npx cdk diff  sh-mcp-auth             # preview changes against the deployed stack
npx cdk deploy sh-mcp-auth \
  -c logsKmsArn=<cmk-arn> \
  -c callbackUrls='["https://…/oauth/callback"]'

CI runs npx cdk synth at the repo root on every PR (the ci-typescript-cdk reusable workflow with run-cdk-synth: true); deploys are triggered manually (Actions → deploy → Run workflow on main, i.e. workflow_dispatch) via the cd-cdk reusable workflow over the per-repo githubdeploy-sh-mcp OIDC role. Nothing is deployed to AWS yet — see status above.

Auth substrate (Phase 2a — infra/ + auth/)

infra/ is the root CDK app; cdk synth builds the sh-mcp-auth stack: a Google-federated Cognito user pool (ESSENTIALS feature plan), per-tier app clients whose AllowedOAuthScopes are the trust-tier boundary (sh-agentforce-ops / -finance / -exec), a suppress-only V2 pre-token Lambda (auth/pre-token-gen), a 5-minute group-sync Lambda (auth/group-sync), and the sync-state + deny-list tables.

Revocation has two layers. Group membership (Google → Cognito, 5-min cadence) is the primary entitlement control, with a fail-closed 30-minute freshness window: if group-sync stalls, the pre-token Lambda drops every caller to base ops:read. The sh-mcp-deny-list table is a hard-kill overlay the pre-token Lambda consults on every mint — a sub listed there is stripped to no tier scopes immediately (TTL-expiring), ahead of the next sync. The deny-list read is fail-open (a DynamoDB blip logs deny_list_read_failed and does not lock everyone out, since group membership + its fail-closed window remain authoritative). The finance app client additionally caps its refresh token at 8h (vs 30d for ops/exec) so a stolen finance refresh token cannot ride past the short access-token TTL for a month.

Deploy is gated on two manual prerequisites (owner: Adam):

  1. Google Cloud OAuth 2.0 web client (Cognito federation) → Secrets Manager sh-mcp/google-oidc ({client_id, client_secret}).
  2. Google Workspace service account w/ domain-wide delegation (Directory groups.readonly) → Secrets Manager sh-mcp/google-directory-sa.

App-client OAuth callback URLs are a placeholder (-c callbackUrls=...) until the conversational surface (Agentforce vs Bolt) is chosen — the substrate is surface-agnostic. The optional alias/seahaven-logs CMK for the Lambda log groups is supplied at deploy via -c logsKmsArn=....

Shape (planned)

  • MCP servers (trust-tiered, remote HTTP, per-server IAM):
    • sh-mcp-ops — read-mostly, agent-facing (WO/PO/site lookups, KB search, Google Maps, Gmail/Calendar, tasks, reminders).
    • sh-mcp-finance — sensitive, read-only, audited (QBO vendor search, payment lookups).
    • sh-mcp-physical — DEFERRED, admin/out-of-band only (Lenel/Yealink/3CX control).
  • Auth — Google Workspace is the single IdP; an Amazon Cognito user pool federated to Google issues scoped, audience-bound JWTs; group → scope mapping via a pre-token Lambda. See design §2.
  • Jobs — rebuilt proactive Lambdas (email classify/digest, KB syncs).
  • Language — TypeScript everywhere (servers, packages, CDK, jobs).

Open decisions

  • Task-agent surface: Agentforce (recommended) vs marketplace Claude app vs custom Bolt assistant (design §12). Drives the model + guardrail story.
  • Endpoint exposure specifics (Slack egress ranges / WAF) — design §9 / §11.

Layout (target)

cdk.json    CDK app config (app → infra/bin/app.ts)
infra/      CDK app: bin/app.ts entry + lib/ stack definitions
packages/   shared + one package per integration
servers/    sh-mcp-ops, sh-mcp-finance  (CDK stacks)
auth/       cognito, pre-token-lambda, group-sync-lambda
jobs/       rebuilt scheduled Lambdas
docs/       design.md  (the canonical plan)

See docs/design.md for the authoritative spec.