loading…
Search for a command to run...
loading…
Enables to manage Freedcamp projects, tasks, users, and comments through natural language with HMAC-SHA1 authentication and name resolution.
Enables to manage Freedcamp projects, tasks, users, and comments through natural language with HMAC-SHA1 authentication and name resolution.
A Model Context Protocol server that wraps the Freedcamp REST API. It lets any MCP-compatible LLM client (Claude Code, Claude Desktop, etc.) manage Freedcamp projects, tasks, users, and comments through natural language.
id,title,comments.created_ts) to reduce response size"in progress" instead of numeric codesgit clone https://github.com/mahrukh-n8n/freedcampMCP.git
cd freedcampMCP
npm install
cp .env.example .env
# Edit .env with your Freedcamp API key and secret
No .env file needed — pass credentials as environment variables:
claude mcp add freedcamp npx tsx /path/to/freedcampMCP/scripts/mcp-server.ts \
-e FREEDCAMP_API_KEY=your_key \
-e FREEDCAMP_API_SECRET=your_secret
| Variable | Required | Default | Description |
|---|---|---|---|
FREEDCAMP_API_KEY |
Yes | — | Freedcamp API key |
FREEDCAMP_API_SECRET |
Yes | — | Freedcamp API secret |
FREEDCAMP_API_URL |
No | https://freedcamp.com |
Base URL (for self-hosted) |
LOG_LEVEL |
No | info |
Log level: debug, info, warn, error |
REQUEST_TIMEOUT_MS |
No | 30000 |
HTTP request timeout (ms) |
CACHE_TTL_MS |
No | 60000 |
Name resolution cache TTL (ms) |
MAX_CONCURRENT_REQUESTS |
No | 6 |
Max concurrent API requests |
After adding the MCP server with claude mcp add, just start a conversation. Claude will call tools automatically when needed.
npx @modelcontextprotocol/inspector npx tsx scripts/mcp-server.ts
Opens a browser UI where you can call each tool and inspect responses.
npx tsx scripts/mcp-server.ts
The server listens on stdin/stdout using the MCP stdio transport. The host process (Claude Code, Claude Desktop) manages its lifecycle.
| Tool | Description |
|---|---|
health.check |
Verify API credentials and connection status |
| Tool | Write | Description |
|---|---|---|
project.list |
List projects (paginated, sortable, field-limitable) | |
project.get |
Get project by ID or name | |
project.create |
Yes | Create a project (name, description, color, group, members) |
project.update |
Yes | Update project fields (partial update) |
| Tool | Write | Description |
|---|---|---|
task.list |
List tasks with filters (assignee, status, date range, search, tags) | |
task.get |
Get task by ID with comments and tag detail; injects task_url |
|
task.create |
Yes | Create task (status labels accepted, file attachments) |
task.update |
Yes | Update task fields (partial update, file attachments) |
task.delete |
Yes | Delete a task |
task.assign |
Yes | Assign users to a task |
| Tool | Write | Description |
|---|---|---|
user.list |
List users (optionally filter by project) | |
user.get |
Get user by ID, email, or name | |
user.current |
Get authenticated user's profile | |
user.create |
Yes | Create user (email, password, first_name, OAuth) |
user.update_current |
Yes | Update authenticated user's profile |
| Tool | Write | Description |
|---|---|---|
comment.add |
Yes | Add a comment (requires item_id + app_id) |
comment.update |
Yes | Update comment text |
comment.delete |
Yes | Delete a comment |
Most ID parameters accept names, emails, or numeric IDs. Examples:
project_id: "Marketing" — resolves to the project's numeric IDassigned_to_id: "[email protected]" — resolves to the user's numeric IDassigned_to_id: ["Alice", 42] — mixed lists acceptedResolution results are cached with a configurable TTL (CACHE_TTL_MS).
Task status accepts both numeric codes and string labels:
| Code | Label |
|---|---|
| 0 | not started |
| 1 | in progress |
| 2 | completed |
Example: status: "in progress" is equivalent to status: 1.
All list and get tools accept a fields parameter with dot-notation paths:
fields="id,title,priority,comments.created_ts"
This reduces response size and focuses the LLM on relevant data. Nested arrays are preserved — comments.created_ts on [{created_ts: 1}] yields [{created_ts: 1}], not a flat list.
| App | ID |
|---|---|
| tasks | 2 |
| milestones | 3 |
| discussions | 5 |
| files | 6 |
| time | 8 |
| issue_tracker | 9 |
The server uses HMAC-SHA1 authentication. On every request:
HMAC-SHA1(secret, apiKey + timestamp)?api_key=...×tamp=...&hash=...The secret never goes over the wire. At boot, the server validates credentials with GET /api_key/check.
| Code | Meaning |
|---|---|
PERMISSION_DENIED |
Invalid API key/secret or insufficient access |
NOT_FOUND |
Requested resource or name resolution target does not exist |
VALIDATION_ERROR |
Invalid input parameters |
CONFLICT |
Resource already exists |
INTERNAL_ERROR |
Server error, rate limit, or network failure |
# Type check
npx tsc --noEmit
# Run tests
npx vitest run
# Watch mode
npx vitest
# Run server in dev mode
npm run dev
The test suite uses Vitest with mocked API responses:
npx vitest run # Single run
npx vitest # Watch mode
npx vitest --coverage # With coverage
scripts/mcp-server.ts Entry point
src/lib/freedcamp/
api-client.ts HTTP client with HMAC auth, retry, filtering
register-tools.ts Wire all tools to the MCP registry
auth/hmac.ts HMAC-SHA1 computation
auth/hmac-validator.ts Boot-time credential validation
tools/
health.ts health.check
projects.ts project.list/get/create/update
tasks.ts task.list/get/create/update/delete/assign
users.ts user.list/get/current/create/update_current
comments.ts comment.add/update/delete
utils/
name-resolver.ts Name/email → ID resolution with caching
response-filter.ts Strip internal fields from API responses
field-limiter.ts Dot-notation field extraction
date-utils.ts Date validation and formatting
resolution-cache.ts TTL-based LRU cache
logger.ts Structured logging with verbose mode
validation.ts Input validation helpers
src/modules/mcp/
registry/tool-registry.ts MCP tool registry
services/create-mcp-server.ts MCP server factory
services/stdio-transport.ts Stdio transport
types.ts MCP result types
utils/serialize.ts Result envelope helpers (dataResult, commitResult, etc.)
MIT
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"freedcamp-mcp-server": {
"command": "npx",
"args": []
}
}
}