Skip to content
Back to skills

Mcp Stack Setup

ASecurity

Installs and configures an arm's MCP stack while respecting Arm Isolation: cloud MCPs go to user scope, database MCPs to .mcp.json inside the client repo. Triggers on 'setup MCP para X', 'agregar MCP al arm', or when onboarding a new arm.

  • 17 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 2, 2026
ai-agentsgoshellbashsqlazuregitapidatabase

Works with

  • claude code
  • cursor
  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned September 20, 2026

npx -y skills add CarlosCaPe/octorato --skill mcp-stack-setup --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Mcp Stack Setup?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Mcp Stack Setup
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/carloscape-mcp-stack-setup/badge)](https://www.skillsdirectory.com/skills/carloscape-mcp-stack-setup)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: mcp-stack-setup
description: "Installs and configures an arm's MCP stack while respecting Arm Isolation: cloud MCPs go to user scope, database MCPs to .mcp.json inside the client repo. Triggers on 'setup MCP para X', 'agregar MCP al arm', or when onboarding a new arm."
---

# Skill: MCP Stack Setup for Octopus Arms

## Purpose
Install and configure the full MCP stack for any Octopus arm, respecting Arm Isolation rules:
- **Cloud MCPs** → `user` scope (OAuth per Claude account, shared brain, never per-client)
- **Database MCPs** → `arm` scope (`.mcp.json` inside client repo, per-client credentials)

## Triggers
- "setup MCP for [CLIENT]"
- "agregar MCP al arm"
- "configurar herramientas MCP"
- "install MCP stack"
- "setup MCPs"
- New arm onboarding

---

## MCP Catalog

| Tool | MCP Server | Type | URL / Command | Auth |
|------|-----------|------|---------------|------|
| Teams | Microsoft 365 | Remote (directory) | `https://microsoft365.mcp.claude.com/mcp` | OAuth |
| Outlook | Microsoft 365 | Remote (directory) | `https://microsoft365.mcp.claude.com/mcp` | OAuth |
| SharePoint | Microsoft 365 | Remote (directory) | `https://microsoft365.mcp.claude.com/mcp` | OAuth |
| Outlook Calendar | Microsoft 365 | Remote (directory) | `https://microsoft365.mcp.claude.com/mcp` | OAuth |
| Gmail | Gmail | Remote (directory) | `https://gmailmcp.googleapis.com/mcp/v1` | OAuth |
| Google Calendar | Google Calendar | Remote (directory) | `https://calendarmcp.googleapis.com/mcp/v1` | OAuth |
| Jira + Confluence | Atlassian Rovo | Remote (directory) | `https://mcp.atlassian.com/v1/mcp` | OAuth |
| Slack | Slack | Remote (directory) | `https://mcp.slack.com/mcp` | OAuth |
| GitHub | github-mcp-server | Remote HTTP | `https://api.githubcopilot.com/mcp` | PAT header |
| PostgreSQL | @bytebase/dbhub | stdio (local) | `npx -y @bytebase/dbhub` | DSN string |
| SQL Server / Azure SQL | microsoft_sql_server_mcp | stdio (local) | `uvx microsoft_sql_server_mcp` | env vars |
| Snowflake | Snowflake-Labs/mcp | stdio (local) | `uvx --from git+https://github.com/Snowflake-Labs/mcp mcp-server-snowflake` | env vars o OAuth nativo |

---

## Workflow

### Step 1 — Cloud MCPs (run ONCE at brain level, not per arm)

Connect via `claude.ai/settings/connectors`:

| Service | Action |
|---------|--------|
| Microsoft 365 (Teams/Outlook/SharePoint/Calendar) | Connect at claude.ai/settings/connectors |
| Atlassian Rovo (Jira/Confluence) | Connect at claude.ai/settings/connectors |
| Slack | Connect at claude.ai/settings/connectors |
| Gmail / Google Calendar | Connect at claude.ai/settings/connectors |
| GitHub | See Step 1b |

#### Step 1b — GitHub (PAT-based, user scope)

```bash
claude mcp add --transport http \
  --scope user \
  github https://api.githubcopilot.com/mcp \
  --header "Authorization: Bearer ${GITHUB_PAT}"
```

Add to `~/.env` or environment:

```bash
GITHUB_PAT=ghp_your_token_here
```

---

### Step 2 — Database MCPs (.mcp.json per arm)

Create or update `~/Documents/github/[CLIENT_NAME]/.mcp.json`.
**Only include the DB servers this client actually uses — delete unused blocks.**

```json
{
  "mcpServers": {
    "postgres-[CLIENT_NAME]": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@bytebase/dbhub", "--dsn", "${[CLIENT_NAME]_PG_DSN}"]
    },
    "sqlserver-[CLIENT_NAME]": {
      "type": "stdio",
      "command": "uvx",
      "args": ["microsoft_sql_server_mcp"],
      "env": {
        "MSSQL_SERVER": "${[CLIENT_NAME]_MSSQL_SERVER}",
        "MSSQL_DATABASE": "${[CLIENT_NAME]_MSSQL_DATABASE}",
        "MSSQL_USER": "${[CLIENT_NAME]_MSSQL_USER}",
        "MSSQL_PASSWORD": "${[CLIENT_NAME]_MSSQL_PASSWORD}"
      }
    },
    "snowflake-[CLIENT_NAME]": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "--from", "git+https://github.com/Snowflake-Labs/mcp",
        "mcp-server-snowflake",
        "--account", "${[CLIENT_NAME]_SF_ACCOUNT}",
        "--username", "${[CLIENT_NAME]_SF_USER}",
        "--role", "${[CLIENT_NAME]_SF_ROLE}",
        "--warehouse", "${[CLIENT_NAME]_SF_WAREHOUSE}",
        "--database", "${[CLIENT_NAME]_SF_DATABASE}"
      ],
      "env": {
        "SNOWFLAKE_PASSWORD": "${[CLIENT_NAME]_SF_PASSWORD}"
      }
    }
  }
}
```

---

### Step 3 — Client .env (add to `~/Documents/github/[CLIENT_NAME]/.env`, NEVER commit)

```bash
# PostgreSQL
[CLIENT_NAME]_PG_DSN=postgresql://user:pass@host:5432/dbname

# SQL Server / Azure SQL
[CLIENT_NAME]_MSSQL_SERVER=server.database.windows.net
[CLIENT_NAME]_MSSQL_DATABASE=mydb
[CLIENT_NAME]_MSSQL_USER=myuser
[CLIENT_NAME]_MSSQL_PASSWORD=secret

# Snowflake
[CLIENT_NAME]_SF_ACCOUNT=myorg-myaccount
[CLIENT_NAME]_SF_USER=myuser
[CLIENT_NAME]_SF_PASSWORD=secret
[CLIENT_NAME]_SF_ROLE=MYROLE
[CLIENT_NAME]_SF_WAREHOUSE=COMPUTE_WH
[CLIENT_NAME]_SF_DATABASE=MYDB

# GitHub (brain-level, documented here for reference only)
GITHUB_PAT=ghp_token
```

---

### Step 4 — Verify Arm Isolation

Run from within the arm directory:

```bash
# Claude Code:
claude mcp list
# Cursor: Settings → MCP, or GetMcpTools in-session (no claude CLI required)

# Should show ONLY database MCPs scoped to this arm.
# Cloud MCPs (Teams, Slack, Jira) appear via user-scope — that is CORRECT.
```

Verify `.gitignore` includes:

```
.env
.env.*
.mcp.json   # optional: if credentials are hardcoded (prefer env vars instead)
```

---

## Arm Isolation Rules

| MCP Category | Scope | Isolation Mechanism |
|---|---|---|
| Cloud MCPs (Teams, Gmail, Slack, Jira, GitHub) | `user` (brain) | OAuth is per-user; each service enforces access at API level — no client data crosses arms |
| Database MCPs (Postgres, SQL Server, Snowflake) | `arm` (`.mcp.json`) | Prefixed env vars per client (e.g., `CLIENT_A_PG_DSN`, `CLIENT_B_MSSQL_SERVER`) prevent cross-contamination even when two arms are open simultaneously |

**Rule: The brain NEVER sees database credentials. Only the arm's local `.env` does.**

---

## Usage Pattern (per arm)

1. Duplicate this skill reference
2. Replace `[CLIENT_NAME]` with the client code (e.g., `CLIENT_A`, `CLIENT_B`, `CLIENT_C`, `CLIENT_D`)
3. Delete `.mcp.json` blocks for DBs this client does NOT use
4. Populate `.env` with actual credentials for this client
5. Verify MCP on the active runtime (Claude Code: `claude mcp list`; Cursor: Settings → MCP / GetMcpTools)

## Arms Reference (example shape)

The actual list lives in your private `company/COMPANY.md`. Generic example:

| Arm | DB MCPs needed |
|-----|---------------|
| portfolio-arm | postgres |
| client-arm-a | postgres, snowflake |
| client-arm-b | postgres, sqlserver |
| analytics-arm | postgres |
| client-arm-c | postgres |
| client-arm-d | postgres |
| client-arm-e | sqlserver (Azure SQL) |

## Lessons Learned

- **2024-04**: `.mcp.json` should use env var references (`${VAR}`) not hardcoded values — enables arm isolation without `.gitignore` dependency on the file itself
- **2024-04**: Cloud MCP OAuth tokens are scoped to the Claude account, not to the workspace directory — they safely appear in all arms without leaking client data
- **2024-04**: Prefix all DB env vars with the client code (`CLIENT_E_MSSQL_SERVER` not `MSSQL_SERVER`) to prevent collisions when two arms share the same shell session

## See also

- AstrBot (https://github.com/AstrBotDevs/AstrBot, `astrbot/core/agent/mcp_client.py`): reference implementation of an MCP client embedded inside an IM-bot runtime, with tools fanning into the agent loop.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…