COR MCP Server
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., "@COR MCP Serverlist my open tasks"
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.
COR MCP Server
Comprehensive MCP server for Project COR — a project management platform for creative and professional teams.
Exposes 61 tools covering the complete COR REST API surface as MCP tools, usable from any MCP-compatible client (Hermes Agent, Claude Desktop, Cursor, Claude Code, Cline, Windsurf, etc.).
Features
61 MCP tools — full CRUD for all COR entities across 11 modules
Dual authentication — pick what suits you:
User Credentials (email + password) — quick personal use
Client Credentials (API key + client secret) — server-to-server
Async everywhere —
httpx+asyncio, non-blocking I/ODual transport —
stdio(default for agents) andsse(HTTP for remote access)OAuth token auto-refresh — never worry about expiry mid-session
Docker support — one-command deployment
Hermes Agent skill included —
skills/cor-mcp-setup/for easy integration24 passing tests — fully mocked, no live credentials required
Entity Coverage
Module | Tools | Covers |
Projects | 14 | CRUD, collaborators, costs, labels, ratecards, templates, profitability |
Tasks | 10 | Search, CRUD, collaborators, labels |
Clients | 6 | CRUD, fees |
Contracts | 5 | CRUD, positions |
Time Tracking | 5 | Log, search, status, accept suggested |
Team & Users | 8 | Profile, users, teams, working time |
Messaging | 4 | Project + task messages |
Allocations | 3 | CRUD |
Ratecards | 3 | CRUD |
Products | 2 | CRUD |
Labels | 1 | By entity type |
Related MCP server: Redmine MCP Server
Quick Start
Prerequisites
Python 3.11+
uv (recommended) or pip
COR account with credentials
Install & Run
# Clone the repo
git clone https://github.com/YOUR_USER/cor-mcp-server.git
cd cor-mcp-server
# Install with uv (recommended)
uv sync
# Or with pip
pip install -e .Configure
Copy .env.example to .env:
cp .env.example .envThen choose one auth mode in .env:
Mode A — Email + Password (recommended for personal use):
COR_EMAIL=your.email@company.com
COR_PASSWORD=your_password
COR_API_URL=https://api.projectcor.com/v1Mode B — API Key + Client Secret (for server-to-server):
COR_API_KEY=your_api_key
COR_CLIENT_SECRET=your_client_secret
COR_API_URL=https://api.projectcor.com/v1The server auto-detects which mode you configured. Email/password takes priority when both are set.
Run
# stdio transport (default — for MCP agents)
uv run cor-mcp-server
# SSE/HTTP transport (for remote access)
uv run cor-mcp-server --transport sse --host 0.0.0.0 --port 8000
# Verbose logging
uv run cor-mcp-server --verboseAuthentication
Two modes supported. The server auto-detects which to use.
User Credentials (Mode A)
POST https://api.projectcor.com/v1/auth/login
Content-Type: application/x-www-form-urlencoded
email=user@corp.com&password=*****Returns JWT access_token + refresh_token. Auto-refresh built in.
Client Credentials (Mode B)
POST https://api.projectcor.com/v1/oauth/token?grant_type=client_credentials
Authorization: Basic base64(COR_API_KEY:COR_CLIENT_SECRET)Returns access_token (1-hour TTL). Cached and auto-refreshed with a 60-second safety margin.
Connecting from MCP Clients
Hermes Agent (recommended)
Add to ~/.hermes/config.yaml:
mcp_servers:
cor:
command: "uv"
args: ["run", "--directory", "/path/to/cor-mcp-server", "python", "-m", "cor_mcp_server"]
env:
COR_EMAIL: "your.email@company.com"
COR_PASSWORD: "your_password"
COR_API_URL: "https://api.projectcor.com/v1"
timeout: 180
connect_timeout: 60Then restart or run /reload-mcp.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"cor": {
"command": "uv",
"args": ["run", "--directory", "/path/to/cor-mcp-server", "python", "-m", "cor_mcp_server"],
"env": {
"COR_EMAIL": "your.email@company.com",
"COR_PASSWORD": "your_password",
"COR_API_URL": "https://api.projectcor.com/v1"
}
}
}
}Cursor / Windsurf / Cline
In MCP Servers settings, add:
Name: COR
Type: command
Command:
uv run --directory /path/to/cor-mcp-server python -m cor_mcp_serverEnvironment variables:
COR_EMAIL,COR_PASSWORD,COR_API_URL
Claude Code
env COR_EMAIL=your@email.com COR_PASSWORD=your_pass COR_API_URL=https://api.projectcor.com/v1 \
npx @anthropic/claude-code --mcp "uv run --directory /path/to/cor-mcp-server python -m cor_mcp_server"Docker
Build with the included Dockerfile, pass env vars at runtime (supports either auth mode).
docker build -t cor-mcp-server .
# stdio mode
docker run -i --rm \
-e COR_EMAIL=your@email.com \
-e COR_PASSWORD=your_password \
-e COR_API_URL=https://api.projectcor.com/v1 \
cor-mcp-server
# SSE mode
docker run -i --rm \
-p 8000:8000 \
-e COR_EMAIL=your@email.com \
-e COR_PASSWORD=your_password \
-e COR_API_URL=https://api.projectcor.com/v1 \
cor-mcp-server --transport sseAvailable Tools
All tool names are prefixed with cor_ for clean discoverability.
Projects (14 tools)
Tool | Description |
| List projects with filters (clientId, status, health, dates) |
| Get project details |
| Create a new project |
| Update a project (partial) |
| Delete a project |
| Get project collaborators |
| Add collaborator to project |
| Remove collaborator from project |
| Get project costs/estimates |
| Add cost to project |
| Get project labels |
| Get project ratecard |
| Get available project templates |
| Get project profitability |
Tasks (10 tools)
Tool | Description |
| Search tasks with filters (projectId, clientId, status, text, dates, labels) |
| Get my pending tasks |
| Get task details |
| Create a new task |
| Update a task |
| Delete a task |
| Get task collaborators |
| Sync (replace) task collaborators |
| Add label to task |
| Remove label from task |
Clients (6 tools)
Tool | Description |
| List clients |
| Get client details |
| Create a new client |
| Update a client |
| Delete a client |
| Get client fees |
Contracts (5 tools)
Tool | Description |
| List contracts |
| Get contract details |
| Create a new contract |
| Get contract positions |
| Create position in contract |
Time Tracking (5 tools)
Tool | Description |
| Log hours against a task |
| Search time entries with filters |
| Get time entries by date |
| Change time entry status |
| Accept suggested hours |
Team & Users (8 tools)
Tool | Description |
| Get current user profile |
| List users with filters |
| Get user details |
| List teams |
| Create a new team |
| Add users to a team |
| Remove users from a team |
| Get working time for users |
Messaging (4 tools)
Tool | Description |
| Get messages on a task |
| Post a message on a task |
| Get messages on a project |
| Post a message on a project |
Ratecards (3 tools)
Tool | Description |
| List ratecards |
| Get ratecard details |
| Create a new ratecard |
Allocations (3 tools)
Tool | Description |
| Get allocations for a project |
| Create/update a resource allocation |
| Delete a resource allocation |
Products (2 tools)
Tool | Description |
| List products |
| Create a new product |
Labels (1 tool)
Tool | Description |
| Get labels (filter by entity type: project, task, user) |
Architecture
┌──────────────────────┐ ┌───────────────────────────┐ ┌──────────────────────┐
│ MCP Client │ │ COR MCP Server │ │ COR REST API │
│ (Hermes / Claude / │◄───►│ (FastMCP + httpx) │────►│ api.projectcor.com │
│ Cursor / etc.) │ │ │ │ /v1 │
└──────────────────────┘ ├───────────────────────────┤ └──────────────────────┘
│ Auth auto-detection │
│ • Email/Password (prio) │
│ • API Key + Secret │
└───────────────────────────┘Development
# Install dev deps
uv sync --dev
# Run tests (24 passing tests — no live API needed, uses mocking)
uv run pytest tests/ -v
# Test server startup
uv run cor-mcp-server --help
# Lint
uv run ruff check .Adding New Tools
To add a new tool to the COR MCP Server:
Create or edit a tool module in
cor_mcp_server/tools/(e.g.,reports.py).Write an async function with the
cor_prefix pattern:from ..context import get_client async def cor_list_reports(page: int = 1, per_page: int = 20) -> str: """List reports. Args: page: Page number (default: 1) per_page: Results per page (default: 20) """ client = get_client() data = await client.get("/reports", page=page, per_page=per_page) import json return json.dumps(data, indent=2, ensure_ascii=False, default=str)Register the tool in
cor_mcp_server/server.py:from .tools import reports as _reports mcp.tool( name="cor_list_reports", description=_reports.cor_list_reports.__doc__, )(_reports.cor_list_reports)Add tests in
tests/test_tools.pyfollowing the existing patterns (import assertion + tool count update).Update the tool count in
tests/test_tools.pyif needed.
The get_client() function provides a fully-authenticated CORClient instance with automatic Bearer token handling. All tools return JSON strings for consistent serialization.
Test Structure
Tests are in tests/test_tools.py and cover:
TestTokenStore— Thread-safe token caching, expiry, and refresh logicTestCORClient— HTTP methods (GET, POST, PUT, DELETE), pagination, auth headersTestToolFunctions— Import verification for all 61 tool functions across 11 modulesTestServerCreation— Server factory creates a valid FastMCP instance
All tests use mocking — no live COR credentials required to run them.
Project Structure
cor-mcp-server/
├── pyproject.toml # Dependencies and metadata
├── README.md # This file
├── .env.example # Env var template (both auth modes)
├── Dockerfile # Container deployment
├── skills/ # Hermes Agent skills
│ └── cor-mcp-setup/
│ └── SKILL.md # Skill: setup + usage guide
├── handoff-personal-hermes.md # Self-contained instructions for personal Hermes
├── cor_mcp_server/
│ ├── __init__.py # Package init
│ ├── __main__.py # CLI entry point (argparse: --transport, --host, --port)
│ ├── server.py # FastMCP server + tool registration (all 61 tools)
│ ├── auth.py # OAuth 2.0 dual-mode (user creds + client creds)
│ ├── client.py # COR API HTTP client (httpx, async)
│ ├── context.py # Shared client context / dependency injection
│ ├── models.py # Pydantic models (14 entity types)
│ └── tools/
│ ├── __init__.py
│ ├── projects.py # 14 tools
│ ├── tasks.py # 10 tools
│ ├── time_tracking.py # 5 tools
│ ├── clients.py # 6 tools
│ ├── contracts.py # 5 tools
│ ├── messaging.py # 4 tools
│ ├── team.py # 8 tools
│ ├── labels.py # 1 tool
│ ├── ratecards.py # 3 tools
│ ├── allocations.py # 3 tools
│ └── products.py # 2 tools
├── tests/
│ ├── __init__.py
│ └── test_tools.py # 24 tests for auth, client, and tools
└── .venv/ # Virtual environment (local)License
MIT
Author
Alejandro Duran — Omnicom Media Group
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/fxckcode/mcp-cor'
If you have feedback or need assistance with the MCP directory API, please join our Discord server