Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Calq MCPstart a timer for the Website Redesign project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Calq MCP
A Model Context Protocol (MCP) server for time tracking, project management, AI-powered memory, and team collaboration.
Features
β±οΈ Time Tracking
Timer system - Start/stop timers for real-time tracking
Manual logging - Log time with backdating support
Billing - Mark entries as billable/billed, track unbilled time
π§ AI-Powered Memory
Semantic search - Find memories and entries by meaning, not just keywords
Personal & shared - Keep notes private or share with your team
Project/client linking - Associate memories with specific projects or clients
Vector storage - Powered by ChromaDB and Voyage AI embeddings
π₯ Team Collaboration
GitHub OAuth - Authenticate team members via GitHub (integrated into MCP flow)
Role-based access - Admin and member roles
Per-user data - Timers and entries are user-scoped
π Project & Client Management
Clients - Manage client information
Projects - Link projects to clients with hourly rates
Invoice summaries - Get unbilled time grouped by client with calculated values
Prerequisites
Node.js 20+
PostgreSQL - Relational database for structured data
ChromaDB - Vector database for semantic search
Voyage AI API key - For generating embeddings
GitHub OAuth App - For user authentication
Installation
Option 1: Docker Compose (Recommended)
This automatically sets up Calq, PostgreSQL, and ChromaDB:
git clone https://github.com/Calq-dev/calq-mcp.git
cd calq-mcp
# Copy and configure environment
cp .env.example .env
# Edit .env with your API keys
# Start services (uses default ports 3000 and 8000)
docker compose up -d
# Or with custom ports
MCP_PORT=3001 CHROMA_PORT=8001 docker compose up -dServices:
Calq MCP:
http://localhost:${MCP_PORT}/mcp(default: 3000)PostgreSQL: Internal to Docker (port 5432)
ChromaDB:
http://localhost:${CHROMA_PORT}(default: 8000, internal to Docker)
Option 2: Local Development
# 1. Start PostgreSQL and ChromaDB (required)
docker run -d --name postgres -p 5432:5432 \
-e POSTGRES_USER=calq -e POSTGRES_PASSWORD=calq -e POSTGRES_DB=calq \
postgres:16-alpine
docker run -d --name chromadb -p 8000:8000 chromadb/chroma:latest
# 2. Clone and install
git clone https://github.com/Calq-dev/calq-mcp.git
cd calq-mcp
npm install
# 3. Configure environment
cp .env.example .env
# Edit .env with your API keys
# 4. Push database schema
npm run db:push
# 5. Start the server
node src/index.jsConfiguration
Environment Variables
Variable | Required | Description |
| Yes | PostgreSQL connection URL |
| No | PostgreSQL password for Docker (default: calq) |
| Yes | Voyage AI API key for embeddings |
| No | ChromaDB URL (default: |
| Yes | GitHub OAuth App client ID |
| Yes | GitHub OAuth App client secret |
| No | Server port (default: 3000) |
| No | OAuth callback (default: |
Database Management
Calq uses Drizzle ORM with PostgreSQL:
# Generate migrations from schema changes
npm run db:generate
# Apply migrations
npm run db:migrate
# Push schema directly (development)
npm run db:push
# Open Drizzle Studio
npm run db:studioGitHub OAuth Setup
Click "New OAuth App"
Fill in:
Application name: Calq
Homepage URL:
http://localhost:3000Authorization callback URL:
http://localhost:3000/oauth/github/callback
Copy the Client ID and generate a Client Secret
Add both to your
.envfile
Claude Desktop Configuration
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"calq": {
"url": "http://localhost:3000/mcp"
}
}
}When you first use Calq, Claude Desktop will open a browser for GitHub authentication.
Tools
Time Tracking
Tool | Description |
| Log time with message, project, and optional date |
| Start a timer for a project |
| Stop timer and log the time |
| Check if a timer is running |
| Discard timer without logging |
| Delete a time entry |
| Modify an existing entry |
Summaries
Tool | Description |
| List all projects with total time |
| Projects with client info and values |
| Detailed summary for a project |
| Today's time by project |
| This week's time by day |
| Unbilled time summary |
| Unbilled time by client with values |
Memory
Tool | Description |
| Store a memory (personal/shared, linked to project/client) |
| Quick capture an idea |
| Search memories semantically |
| Search time entries semantically |
| List all memories |
| List all captured ideas |
| Delete a memory |
Clients & Projects
Tool | Description |
| Add a new client |
| List all clients |
| Create/update project with client and hourly rate |
Users
Tool | Description |
| Show current user info |
| List all users (admin only) |
| Change user role (admin only) |
| Team activity summary |
Usage Examples
"Start timing the website project"
"Stop - finished the navbar"
"Log 2 hours to API work yesterday: implemented auth"
"Remember: client wants deadline moved to January"
"Recall: what did the client say about deadlines?"
"What's my unbilled time for Acme Corp?"
"Configure project website with client Acme and rate 95"Architecture
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Claude Desktop ββββββΆβ Calq MCP ββββββΆβ ChromaDB β
β β β (Port 3000) β β (Port 8000) β
βββββββββββββββββββ ββββββββββ¬βββββββββ βββββββββββββββββββ
β
βΌ
βββββββββββββββββββ
β PostgreSQL β
β (Port 5432) β
βββββββββββββββββββPostgreSQL - Source of truth for structured data (entries, projects, users)
ChromaDB - Vector store for semantic search (memories, entry embeddings)
Drizzle ORM - Type-safe database access layer
Data Storage
In Docker, data is persisted via volumes:
calq-data- Application datapostgres-data- PostgreSQL databasechroma-data- ChromaDB embeddings
License
MIT