Squad AI
README.md
# Squad MCP Server
[](https://smithery.ai/servers/squadai/squad)
A remote MCP server that brings [Squad](https://meetsquad.ai) ā the AI product feedback intelligence platform ā directly into your AI workflows. Connect Squad to Claude, ChatGPT, or any MCP-compatible AI assistant to turn raw user feedback into signals, insights, actions, and briefs without context switching.
Squad continuously ingests feedback, clusters it into **signals**, distils it into **insights**, and links it to the **actions** and **goals** that move your product forward. The MCP server exposes that same intelligence ā read the evidence behind a decision, capture new feedback, and generate briefs from your assistant.
## š Quick Start
### For Users
Connect Squad to your AI assistant in seconds:
**Claude Code:**
```bash
claude mcp add --transport http squad https://mcp.meetsquad.ai/mcp
```
On first use, you'll be prompted to authenticate via OAuth in your browser.
**Other MCP Clients:**
Connect using `https://mcp.meetsquad.ai/mcp` ā OAuth configuration is automatically discovered via the server's `.well-known/oauth-protected-resource` metadata (which points clients at PropelAuth as the authorization server).
## š Usage Examples
See **[USAGE_EXAMPLES.md](./USAGE_EXAMPLES.md)** for detailed real-world examples. A few things you can ask:
- **Triage feedback** ā "Capture this support ticket in Squad and tell me if it's a known theme."
- **Weekly review** ā "Run my weekly product review: what changed and what needs deciding?"
- **Ground the evidence** ā "Show me the customer signals behind insight IN-42."
- **Draft a brief** ā "Generate a brief for action AC-12."
- **Search everything** ā "Find all feedback related to onboarding friction."
- **Ground a ticket** ā "Pull the customer evidence behind AC-7 before I build it."
Squad entities are referenced by short **display IDs** so the assistant can cite its evidence:
| Prefix | Entity | Prefix | Entity |
| ------ | --------------- | ------ | ----------------- |
| `SI-` | Signal | `GL-` | Goal |
| `IN-` | Insight | `BR-` | Brief |
| `AC-` | Action | `DC-` | Document |
| `CL-` | Cluster | | |
## Tools
The server exposes 30 tools. Write tools require a token minted with the `write:workspace` scope; read tools only need `read:workspace`.
- `list_workspaces` ā List every organisation and workspace you can access, with the current selection marked.
- `select_workspace` ā Select which organisation and workspace subsequent tools operate on.
- `get_workspace_overview` ā One-call orientation: mission and description, top goals, recent signal activity, evidence-chain health, and open work counts.
- `update_workspace` ā Update the current workspace's name, description, mission statement or logo.
- `list_members` ā People in the current organisation with their user IDs.
- `search` ā Keyword search across signals, insights, actions, goals, documents and clusters.
- `get_entity` ā Fetch any entity by display ID (`SI-1`, `IN-1`, `AC-1`, `GL-1`, `BR-1`, `DC-1`, `CL-1`) or UUID. Also how you check on async work.
- `list_signals` ā Browse raw feedback signals with filters for source, type, sentiment, cluster and date range.
- `find_similar_signals` ā Semantically related signals for a given signal ā "has anyone else said this?".
- `list_clusters` ā Browse signal clusters (recurring themes in feedback) with sizes and labels.
- `get_cluster` ā A cluster's label, stats, member signals and linked insights.
- `list_insights` ā Browse distilled insights ranked by combined score, with category/score/status filters or scoped to a goal.
- `list_actions` ā Ranked actions (what the evidence says to do next) filtered by status, assignee, priority or parent insight.
- `get_action_context` ā Everything needed to execute an action in one call: the action, the parent insight, the customer evidence behind it, and the goals it serves.
- `update_action` ā Edit an action's priority, effort, category or notes; assign it; or link it to an insight or brief.
- `update_action_status` ā Move an action through its lifecycle: start, complete, dismiss or snooze.
- `list_goals` ā Strategic goals ordered by importance.
- `create_goal` ā Create a strategic goal.
- `update_goal` ā Update a goal's title, description or importance.
- `update_insight` ā Curate an insight: set category or status, and link/unlink the goal it supports.
- `dismiss_signal` ā Permanently remove a signal from the workspace (noise, spam, or mis-ingested content).
- `get_activity` ā The workspace change feed (humans and Squad agents), newest first.
- `list_documents` ā Browse workspace knowledge documents (and briefs) with their paths and tags.
- `create_document` ā Create a knowledge document from markdown (research summaries, meeting notes, analyses).
- `update_document` ā Replace a document's markdown body and/or title, and manage tags.
- `list_briefs` ā Briefs with their status (building/draft/in_review/finalised/failed) and recommendation.
- `generate_brief` ā Kick off AI generation of a brief from an action or insight.
- `update_brief_status` ā Move a brief through its review lifecycle: draft, in_review, or finalised.
- `ingest_signal` ā Pipe user feedback into the evidence chain (1ā50 items, deduplicated server-side).
- `list_integrations` ā Connected feedback sources for this workspace and their sync health.
### Prompts
Ready-made workflows exposed as MCP prompts:
- **`triage-feedback`** ā check for duplicates, ingest a piece of feedback, and report where it landed.
- **`weekly-product-review`** ā what changed, what the evidence says, and what needs deciding.
- **`draft-decision-brief`** ā generate a brief from an action or insight and walk it to a readable draft.
- **`ground-this-ticket`** ā for coding agents: pull the customer evidence behind a piece of work before building it.
### Resources
Pin these so strategy questions need no tool calls:
- **`squad://workspace/context`** ā the current workspace's mission and product context.
- **`squad://goals`** ā the workspace's strategic goals with importance rankings.
### Tool Capabilities
- ā
Safety annotations (`readOnlyHint` / `destructiveHint`) on every tool
- ā
Structured Zod input schemas
- ā
User- and workspace-isolated data access via OAuth
- ā
Scope-gated writes (`write:workspace`)
## šļø Architecture
```
āāāāāāāāāāāāāāā OAuth āāāāāāāāāāāāāāāā
ā Claude / ā āāāāāāāāāāāāāāāāāāāāāāŗ ā PropelAuth ā
ā ChatGPT ā (Authentication) ā (IdP) ā
āāāāāāāāāāāāāāā āāāāāāāāāāāāāāāā
ā
ā HTTPS + Bearer Token
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Squad MCP Server ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā OAuth ā introspect + verify token ā ā
ā ā JWT minting ā service credentials ā ā
ā ā Redis ā workspace selection + tokens ā ā
ā ā MCP handler ā tools / prompts / res. ā ā
ā ā PostHog ā tool-call telemetry ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā Squad API Calls (minted JWT)
ā¼
āāāāāāāāāāāāāāāā
ā Squad API ā
āāāāāāāāāāāāāāāā
```
The server is built on [`mcp-use`](https://github.com/mcp-use/mcp-use) v2 and talks to the Squad platform API over **GraphQL**. Each request is served statelessly: the MCP layer holds no session, and every call re-introspects its own bearer token. **Redis** stores the durable per-user state (workspace selection and minted-token cache), so any instance can serve any request. Backend types are generated from a committed GraphQL schema snapshot (see [GraphQL codegen](#graphql-codegen)).
## š ļø Development
This repository contains the source code for the Squad MCP remote server.
### Prerequisites
- Node.js 22+
- pnpm
- Nix (optional, for a reproducible dev environment via `flake.nix`)
- PropelAuth credentials (OAuth 2.1 client + backend API key)
- Redis (optional locally; workspace selection falls back to in-memory)
### Local Setup
```bash
# Clone repository
git clone https://github.com/the-basilisk-ai/squad-mcp.git
cd squad-mcp
# Install dependencies
pnpm install
# Configure environment
cp .env.example .env
# Edit .env with your PropelAuth credentials (and SQUAD_ENV=dev to target the dev platform)
# Start development server with hot reload
pnpm dev
# Server available at http://localhost:3232
```
### Environment Variables
| Variable | Required | Purpose |
| ----------------------------------------------------------------- | -------- | -------------------------------------------------------------- |
| `PROPELAUTH_CLIENT_ID` / `PROPELAUTH_CLIENT_SECRET` | ā
| OAuth 2.1 client credentials for token introspection |
| `PROPELAUTH_API_KEY` | ā
| Backend integration key for minting service JWTs |
| `SQUAD_ENV` | | `dev` or `production` (default `production`) ā selects auth/API/app URLs |
| `PORT` / `MCP_URL` / `BASE_URI` | | Server port and externally-advertised base URL |
| `REDIS_URL` | | Redis connection for deploy-safe workspace selection and token cache (in-memory if unset) |
| `SQUAD_GRAPHQL_URL` | | Override the Squad GraphQL endpoint (also used by codegen) |
| `POSTHOG_API_KEY` / `POSTHOG_HOST` | | Enable tool-call telemetry |
| `LOG_LEVEL` | | Logger verbosity |
### Available Commands
```bash
pnpm dev # Start dev server with hot reload (mcp-use)
pnpm build # Build the server (mcp-use)
pnpm start # Start the built server
pnpm deploy # Deploy via mcp-use
pnpm test # Run unit tests (vitest)
pnpm format # Lint/format check (biome)
pnpm format:fix # Auto-fix lint/format issues
pnpm codegen # Regenerate GraphQL types from schema.graphql
pnpm codegen:check # Fail if generated GraphQL types are stale
```
### Testing the Server
```bash
# Check health
curl http://localhost:3232/health
# Check OAuth discovery
curl http://localhost:3232/.well-known/oauth-protected-resource
# Check server-card discovery (SEP-2127)
curl -H 'Accept: application/mcp-server-card+json' \
http://localhost:3232/mcp/server-card
curl http://localhost:3232/.well-known/ai-catalog.json
# Test with the built-in inspector
pnpm dev # then open the inspector and connect to http://localhost:3232/mcp
```
### Project Structure
```
squad-mcp/
āāā server.ts # MCP server entry point (OAuth, tool/prompt/resource registration)
āāā server.json # MCP registry metadata (see MCP_REGISTRY.md)
āāā schema.graphql # Committed snapshot of the Squad platform GraphQL schema
āāā codegen.ts # GraphQL Code Generator config
āāā src/
ā āāā tools/ # Tool implementations, grouped by surface
ā ā āāā registry.ts # Single registration path (annotations, errors, telemetry)
ā ā āāā workspace.ts # list/select workspaces, overview, members
ā ā āāā search.ts # semantic search
ā ā āāā get-entity.ts # fetch any entity by display ID / UUID
ā ā āāā evidence.ts # signals, clusters, insights
ā ā āāā actions-read.ts # list actions, action context
ā ā āāā actions-write.ts # update actions + status
ā ā āāā strategy-read.ts # goals, activity
ā ā āāā strategy-write.ts # create/update goals, insights, dismiss signals
ā ā āāā knowledge.ts # documents + briefs
ā ā āāā ingest.ts # ingest new signals
ā ā āāā integrations.ts # list connected sources
ā āāā prompts/ # MCP prompt workflows
ā āāā resources/ # MCP resources (workspace context, goals)
ā āāā gql/ # Generated GraphQL types (pnpm codegen)
ā āāā graphql/ # GraphQL operation documents
ā āāā helpers/ # OAuth provider, token minting, workspace selection, KV/Redis
ā āāā lib/ # Squad API client, logger, telemetry, server card
āāā railway.toml # Railway deployment config
āāā .env.example # Environment template
```
## š Production Deployment
This is a hosted service maintained by Squad. Users connect via OAuth ā no self-hosting required.
**Architecture notes (for contributors):**
- Deployed on Railway with a `/health` readiness check
- Stateless request handling, with Redis holding the per-user workspace selection and token cache, so instances scale horizontally
- Follows the [MCP specification](https://modelcontextprotocol.io/specification) for streamable HTTP transport
- Publishes [SEP-2127](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127) discovery documents: a Server Card at `https://mcp.meetsquad.ai/mcp/server-card` and an AI Catalog at `https://mcp.meetsquad.ai/.well-known/ai-catalog.json`, both public, cacheable and built from `server.json`
## š¬ Support
Need help with the Squad MCP server?
- **Email:** support@meetsquad.ai
- **Documentation:**
- [Squad MCP Guide](https://docs.meetsquad.ai/guides/squad-mcp) ā complete setup and integration guide
- [USAGE_EXAMPLES.md](./USAGE_EXAMPLES.md) ā real-world usage examples
- **Issues:** [GitHub Issues](https://github.com/the-basilisk-ai/squad-mcp/issues) ā bug reports and feature requests
- **Privacy Policy:** [meetsquad.ai/privacy-policy](https://meetsquad.ai/privacy-policy)
- **Squad Platform:** [meetsquad.ai](https://meetsquad.ai)
## š¤ Contributing
Contributions welcome! Pre-commit hooks run biome and vitest automatically. Please ensure:
- `pnpm format` passes (biome)
- `pnpm build` compiles without errors
- `pnpm test` passes
- `pnpm codegen:check` passes if you touched GraphQL operations
- All tools include safety annotations
## š License
MIT
## š Links
- [Squad MCP Documentation](https://docs.meetsquad.ai/guides/squad-mcp) ā complete setup and integration guide
- [Squad Platform](https://meetsquad.ai)
- [MCP Specification](https://modelcontextprotocol.io)
- [Issue Tracker](https://github.com/the-basilisk-ai/squad-mcp/issues)
## GraphQL codegen
Backend access is typed via GraphQL Code Generator. `schema.graphql` is a
committed snapshot of the Squad platform API schema; `src/gql/` is generated
from it plus the operation documents in `src/graphql/`.
- Refresh the snapshot: copy `packages/graphql/src/schema/generated.graphql`
from the API repo over `schema.graphql` (or set `SQUAD_GRAPHQL_URL` to
introspect a live endpoint), then run `pnpm codegen`.
- CI runs `pnpm codegen:check` and fails when `src/gql/` is stale.
This server cannot be deployed
Maintenance
ActivityActive
ResponsivenessSlow