Openspace MCP Server
MCP server for the openspace.ai squad β exposes squad tools and resources via Model Context Protocol
Ask AI about Openspace MCP Server
Powered by Claude Β· Grounded in docs
I know everything about Openspace MCP Server. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
openspace.ai
Make human and AI better together. openspace.ai is a web-based squad management tool that gives people a rich, intuitive interface to manage, direct, and collaborate with AI agent teams in real time β including through natural voice conversation. It wraps around the existing .squad/ file system and agent framework, providing a visual dashboard, task board, live activity feed, chat interface, decision log, and real-time group voice chat so anyone β not just engineers β can work with AI teams effectively.
β¨ Features
| Feature | Description |
|---|---|
| Squad Dashboard | Visual overview of all agents β status, current tasks, queue depth, and recent activity. Auto-refreshes via WebSocket. Agent cards show live work status (π’ Working / βΈοΈ Idle). |
| Task Management | Kanban board and list views for creating, assigning, prioritizing, and tracking tasks. Drag-and-drop reordering, filters by agent/status/priority, AI-powered task execution, retry button for blocked tasks, and full sync with .squad/ task files. |
| Chat Interface | ChatGPT-style conversation with assistant-ui β Slack-style agent avatars, markdown rendering, code blocks, copy/reload buttons, suggestion chips, voice dictation, and conversation history as context. |
| A2A Protocol | Agent-to-Agent protocol support β each agent is discoverable via AgentCard, callable via JSON-RPC, and can delegate work to other agents. External A2A agents can join the squad. |
| AI Traces | Full observability β every AI call logged with prompt, response, model, agent, task, and duration. OTLP collector receives spans from Copilot CLI. View at /traces. |
| Dynamic Team | Hire/fire team members via API or UI. New members automatically get .squad/ charter files, A2A endpoints, and agent worker queues. .squad/ files are the source of truth, SQLite is a cache. |
| Voice Interface | Real-time voice chat with browser speech recognition + TTS. Continuous listening, multi-agent responses, voice-triggered actions. |
| Real-time Activity Feed | Live chronological stream of agent events β task starts, completions, decisions, errors β pushed via WebSocket. |
| Decision Log | Browse and search all team decisions with full-text search and filtering. |
| Mobile Responsive | Full mobile support β collapsible sidebar with hamburger menu, touch-friendly layouts across all pages. |
π Tech Stack
| Layer | Technology |
|---|---|
| Frontend | Next.js (App Router), React 18, Tailwind CSS, shadcn/ui, assistant-ui (ChatGPT-style chat), TanStack Query |
| Backend | Fastify, TypeScript, better-sqlite3 (cache/index layer) |
| AI | GitHub Copilot SDK (@github/copilot-sdk) β server mode via TCP, session retry with exponential backoff |
| A2A | A2A JavaScript SDK (@a2a-js/sdk) β Agent-to-Agent protocol for inter-agent communication |
| Real-time | WebSocket (native), file watching via chokidar |
| Voice | Browser SpeechRecognition + SpeechSynthesis, react-speech-recognition |
| Observability | OpenTelemetry (@opentelemetry/sdk-node) β OTLP trace collection + custom AI interaction logging |
| Shared | TypeScript monorepo with shared type contracts (@openspace/shared) |
| Data Layer | .squad/ file system (source of truth), SQLite (rebuildable cache with FTS5 search) |
| Build | Turborepo, pnpm workspaces |
| Quality | ESLint (flat config), Prettier, Husky + lint-staged, Vitest, Playwright |
π Architecture
openspace.ai is a monorepo with a Next.js frontend, Fastify API backend, and a shared types package. The .squad/ directory on disk is the single source of truth β the backend reads/watches it and serves data to the frontend via REST + WebSocket. SQLite acts as a rebuildable cache for fast queries and full-text search.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client (Browser) β
β ββββββββββββ ββββββββββββ βββββββββ βββββββββββββββββ β
β βDashboard β βTask Boardβ β Chat β β Voice + Traces β β
β β(agent β β(kanban, β β(asst- β β (speech rec, β β
β β status) β β retry) β β -ui) β β OTel viewer) β β
β ββββββ¬ββββββ ββββββ¬ββββββ βββββ¬ββββ βββββββββ¬ββββββββ β
β ββββββββββββββββ΄βββββββββββββ΄βββββββββββββββ β
β β β
β REST + WebSocket β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββ
β Fastify API Server β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββββββββββ β
β β REST API β β WebSocket β β A2A Protocol β β
β β /api/* β β /ws β β /a2a/:agentId β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββββ¬βββββββββββ β
β β β β β
β ββββββββ΄ββββββββββββββββββ΄βββββββββββββββββββββ΄βββββββββββ β
β β Agent Worker Service β β
β β Queue per agent β copilot-sdk β AI β result β β
β β Retry logic, crash recovery, progress streaming β β
β βββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββ β
β β Copilot SDK (server mode via TCP to CLI on port 3100) β β
β β Session retry β’ sendAndWait retry β’ OTLP tracing β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββ β
β β .squad/ files β β SQLite Cache β β
β β (source of truth) β β (tasks, chat, team, traces) β β
β ββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Squad Orchestration Layer β β ββββββββββββββββββΌβββββββββββββββββ β β β .squad/ File System β β β β (agents, tasks, decisions, β β β β sessions, orchestration log) β β β βββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
**Key data flow:**
1. The backend watches `.squad/` for file changes (chokidar)
2. Changes are classified into events and pushed to connected clients via WebSocket
3. The frontend displays real-time updates without polling
4. Write operations (task create/update, chat messages) go through the REST API, which writes to `.squad/` files and updates the SQLite cache
---
## π Getting Started
### Prerequisites
- **Node.js** 22+
- **pnpm** 9+ β install via `corepack enable` or `npm install -g pnpm`
- **Copilot CLI** (optional) β for AI-powered agents. Without it, agents use mock responses.
### Quick Start
```bash
# Clone and start everything
git clone https://github.com/your-org/openspace.ai.git
cd openspace.ai
./start.sh
start.sh handles everything: checks Node/pnpm, installs deps, starts Copilot CLI server, launches API + Web.
Manual Setup
# Install dependencies
pnpm install
# Start Copilot CLI server (optional, in a separate terminal)
copilot --headless --port 3100 --model claude-opus-4.6
# Start dev servers
pnpm dev
Environment Variables
# apps/api/.env
COPILOT_CLI_URL=localhost:3100 # Copilot CLI server (TCP, not subprocess)
COPILOT_MODEL=claude-opus-4.6 # Default AI model
COPILOT_OTLP_ENDPOINT=http://localhost:3001 # Traces collected by our server
URLs
| Service | URL |
|---|---|
| Web App | http://localhost:3000 |
| API | http://localhost:3001 |
| LAN Access | http://<your-ip>:3000 |
| Agent Cards (A2A) | http://localhost:3001/.well-known/agent-card.json |
| Traces | http://localhost:3000/traces |
Other Commands
pnpm build # Production build (both apps)
pnpm lint # Lint all packages
pnpm typecheck # TypeScript type checking
pnpm test # Run unit/integration tests (Vitest)
pnpm e2e # Run end-to-end tests (Playwright)
pnpm format # Format code with Prettier
π Project Structure
openspace.ai/
βββ apps/
β βββ web/ # Next.js frontend (App Router)
β β βββ app/ # Next.js app directory (routes)
β β βββ src/
β β β βββ components/ # UI components (dashboard, tasks, chat, voice, etc.)
β β β βββ hooks/ # Custom React hooks
β β β βββ lib/ # Utilities and helpers
β β βββ ...
β βββ api/ # Fastify backend
β βββ src/
β βββ routes/ # REST API route handlers
β βββ services/ # Business logic (file watcher, WebSocket, DB, activity)
β βββ lib/ # Shared utilities (parsers, writers)
β βββ ...
βββ packages/
β βββ shared/ # @openspace/shared β shared TypeScript types & constants
β βββ src/ # Agent, Task, Decision, Chat, Voice, Activity types
βββ docs/
β βββ prd.md # Product Requirements Document
β βββ execution-plan.md # Phased execution plan
β βββ pending-approval-workflow.md # Pending-approval task lifecycle & API
βββ e2e/ # Playwright end-to-end tests
βββ .squad/ # Squad file system (source of truth)
β βββ agents/ # Agent charters and history
β βββ tasks/ # Task files (YAML frontmatter + markdown)
β βββ decisions.md # Decision log
β βββ team.md # Team roster
β βββ ...
βββ turbo.json # Turborepo pipeline config
βββ pnpm-workspace.yaml # pnpm workspace definition
βββ package.json # Root workspace scripts
π MCP Server
openspace.ai exposes a Model Context Protocol (MCP) server so external AI tools β Claude Desktop, Cursor, VS Code Copilot β can interact with your squad directly.
Connecting to the MCP Server
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"openspace": {
"command": "npx",
"args": ["--yes", "-w", "packages/mcp-server", "openspace-mcp"],
"env": {
"OPENSPACE_API_URL": "http://localhost:3001"
}
}
}
}
Cursor
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"openspace": {
"command": "npx",
"args": ["--yes", "-w", "packages/mcp-server", "openspace-mcp"],
"env": {
"OPENSPACE_API_URL": "http://localhost:3001"
}
}
}
}
VS Code (GitHub Copilot)
Add to .vscode/mcp.json or .copilot/mcp-config.json:
{
"mcpServers": {
"openspace-stdio": {
"command": "npx",
"args": ["--yes", "-w", "packages/mcp-server", "openspace-mcp"],
"env": {
"OPENSPACE_API_URL": "http://localhost:3001"
}
}
}
}
SSE Transport (Remote / Shared)
For remote or multi-client setups, start the SSE server and point clients at it:
# Start SSE server (default port 3002)
pnpm --filter @openspace/mcp-server start:sse
# Or with a custom port
MCP_PORT=8080 pnpm --filter @openspace/mcp-server start:sse
Then configure clients with the SSE URL:
{
"mcpServers": {
"openspace": {
"type": "sse",
"url": "http://localhost:3002/sse"
}
}
}
Available Tools
| Tool | Description | Example |
|---|---|---|
list_agents | List all squad agents with status and current tasks | "Show me the squad" |
get_agent | Get detailed info about a specific agent | "What is Bender working on?" |
list_tasks | List tasks, filter by status or assignee | "Show all in-progress tasks" |
get_task | Get task details | "Get details on task-ABC123" |
create_task | Create and assign a new task | "Create a P1 task for Fry to fix the dashboard" |
update_task_status | Change task status | "Mark task-ABC123 as done" |
list_decisions | List or search squad decisions | "Find decisions about auth" |
send_chat_message | Send a message to an agent or the team | "Tell Leela we're ready for review" |
get_squad_status | High-level squad overview | "What's the team status?" |
Available Resources
| URI | Description |
|---|---|
openspace://squad | Current squad overview |
openspace://agents | Full agent roster |
openspace://tasks | Current task board |
openspace://decisions | Squad decision log |
Configuration Options
| Variable | Default | Description |
|---|---|---|
OPENSPACE_API_URL | http://localhost:3001 | URL of the openspace.ai API server |
MCP_PORT | 3002 | Port for the SSE transport server |
Transport modes:
- stdio (default) β launched by the client as a subprocess. Best for local, single-user setups (Claude Desktop, Cursor, VS Code).
- SSE β runs as an HTTP server. Best for remote access, shared environments, or multi-client setups.
π‘ API Reference
All endpoints are prefixed with /api. The API runs on port 3001 by default.
| Method | Endpoint | Description |
|---|---|---|
GET | /api/health | Health check β returns status and timestamp |
GET | /api/agents | List all agents with status, role, and current task |
GET | /api/agents/:id | Get agent detail (charter, history, expertise) |
GET | /api/tasks | List tasks (filterable by status, assignee, priority) |
GET | /api/tasks/:id | Get task detail |
POST | /api/tasks | Create a new task |
PUT | /api/tasks/:id | Update a task |
PATCH | /api/tasks/:id/status | Update task status |
PATCH | /api/tasks/:id/priority | Reorder task priority (sortIndex) |
DELETE | /api/tasks/:id | Delete a task |
PATCH | /api/tasks/:id/approve | Approve a pending-approval task β moves to backlog |
PATCH | /api/tasks/:id/reject | Reject a pending-approval task β deletes it |
GET | /api/decisions | List all decisions (newest first) |
GET | /api/decisions/search | Full-text search decisions (?q=query) |
GET | /api/decisions/:id | Get decision detail |
GET | /api/squad | Squad overview / dashboard summary |
GET | /api/activity | Paginated activity history (?limit=&offset=) |
POST | /api/chat/messages | Send a chat message |
GET | /api/chat/messages | Get message history (filterable by agent, threadId) |
WebSocket: Connect to ws://localhost:3001 for real-time events. Events follow the { type, payload, timestamp } envelope format. Supported event types include task updates, decision additions, agent status changes, and chat messages.
π Voice Chat
openspace.ai's voice interface is a real-time, multi-party group voice conversation with your AI squad β like being in a meeting room with your team.
How It Works
- Start a voice session from the
/voicepage - Talk naturally β the microphone is always listening (Voice Activity Detection handles turn boundaries automatically)
- The Coordinator routes your speech to the right agent(s) using LLM-based intent classification
- Agents respond by voice β each agent has a distinct voice profile so you can tell them apart by sound:
- Leela β confident and direct (
nova) - Fry β enthusiastic and friendly (
echo) - Bender β blunt and matter-of-fact (
onyx) - Zoidberg β methodical and precise (
shimmer)
- Leela β confident and direct (
- Multi-agent responses are supported β ask "What's the status?" and Leela gives the summary, Bender adds a backend update, Fry mentions a frontend blocker
- Voice commands trigger real actions β "Bender, create an auth endpoint" actually creates a task and assigns it
Architecture
The voice pipeline uses the OpenAI Realtime API over a persistent WebSocket connection:
User speaks β [Browser VAD] β [Audio Stream via WebSocket] β [Realtime STT]
β [Coordinator / Agent Router] β [Agent Response] β [Streaming TTS]
β [Audio Stream via WebSocket] β Speaker
- Target latency: < 2 seconds from end-of-speech to start-of-agent-audio
- Text fallback: Every voice interaction has a text equivalent β voice is additive, never required
- Session history: All voice sessions are preserved with full transcripts
π₯ Team
openspace.ai was built by the openspace.ai squad β a team of AI agents orchestrated via the .squad/ framework:
| Agent | Role | Personality |
|---|---|---|
| Leela | Lead | Strategic, decisive, keeps the team focused. Authored the PRD, execution plan, and coordinates all work. |
| Fry | Frontend Dev | Enthusiastic, creative. Built the Next.js frontend β dashboard, task board, chat UI, voice interface. |
| Bender | Backend Dev | Blunt, efficient, gets things done. Built the Fastify API, data layer, WebSocket pipeline, voice backend. |
| Zoidberg | Tester | Methodical, thorough. Wrote the test suite β unit, integration, and E2E coverage across the full stack. |
Owner: Matanel Cohen
π€ Contributing
Contributions are welcome! Here's how to get started:
Development Workflow
- Fork and clone the repository
- Create a feature branch from
main:git checkout -b feat/my-feature - Install dependencies:
pnpm install - Make your changes β follow the existing code patterns and conventions
- Run checks before committing:
pnpm lint && pnpm typecheck && pnpm test - Commit with clear, descriptive messages
- Open a pull request against
main
Guidelines
- TypeScript only β no plain JavaScript
- Tests required β every feature or bug fix should include test coverage
- Lint clean β Husky pre-commit hooks enforce linting and formatting
- Types first β if you're adding new data shapes, start in
packages/shared .squad/is sacred β the file system is the source of truth. Never bypass it in favor of SQLite-only storage.- Keep it accessible β UI components should follow WAI-ARIA guidelines
Architecture Principles
- The frontend renders data and manages UI state; it never reads
.squad/directly - The backend owns all file system access and serves data via REST + WebSocket
- Shared types in
packages/sharedare the contract between frontend and backend - SQLite is a rebuildable cache β if you delete it, it reconstructs from
.squad/files
π License
This project is private and proprietary. All rights reserved.
