Skip to main content
Glama
liquiddesign

Freelo MCP Server

by liquiddesign
README.md
# freelo-mcp

A Model Context Protocol (MCP) server built with mcp-framework that provides integration with [Freelo](https://www.freelo.io) project management API.

## Features

This MCP server exposes tools for interacting with Freelo tasks, subtasks, and files:

- **freelo_get_task** - Get detailed information about a task including comments and attached files
- **freelo_list_task_subtasks** - List all subtasks with completion status
- **freelo_download_file** - Download files from task comments using UUID

## Quick Start

### 1. Get Your Freelo API Key

1. Log in to your [Freelo Dashboard](https://app.freelo.cz/dashboard)
2. Click on your avatar in the top right corner → **Settings**
3. Scroll to the bottom to find your **API Key**

### 2. Add to Claude Code

```bash
claude mcp add freelo-mcp -e FREELO_EMAIL=your-email@example.com -e FREELO_API_KEY=your-api-key -- npx -y @liquiddesign/freelo-mcp
```

That's it! You can now use Freelo tools in Claude Code.

## Alternative Setup

### Claude Code (Manual)

Add to your MCP settings (`~/.claude/settings.json` or project `.mcp.json`):

```json
{
  "mcpServers": {
    "freelo-mcp": {
      "command": "npx",
      "args": ["-y", "@liquiddesign/freelo-mcp"],
      "env": {
        "FREELO_EMAIL": "your-email@example.com",
        "FREELO_API_KEY": "your-api-key-here"
      }
    }
  }
}
```

### Claude Desktop

Add to Claude Desktop configuration file:

**MacOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "freelo-mcp": {
      "command": "npx",
      "args": ["-y", "@liquiddesign/freelo-mcp"],
      "env": {
        "FREELO_EMAIL": "your-email@example.com",
        "FREELO_API_KEY": "your-api-key-here"
      }
    }
  }
}
```

## Development

```bash
# Install dependencies
npm install

# Build the project
npm run build

# Watch mode during development
npm run watch
```

For local development, configure Claude to use the built project directly:

```json
{
  "mcpServers": {
    "freelo-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/freelo-mcp/dist/index.js"],
      "env": {
        "FREELO_EMAIL": "your-email@example.com",
        "FREELO_API_KEY": "your-api-key-here"
      }
    }
  }
}
```

## Project Structure

```
freelo-mcp/
├── src/
│   ├── tools/                           # MCP Tools
│   │   ├── FreeloGetTask.ts             # Get task details with comments & files
│   │   ├── FreeloListTaskSubtasks.ts    # List task subtasks
│   │   └── FreeloDownloadFile.ts        # Download files by UUID
│   ├── utils/
│   │   └── freeloApi.ts                 # Freelo API client & types
│   └── index.ts                         # Server entry point
├── package.json
├── tsconfig.json
└── CLAUDE.md                            # Claude Code instructions
```

## Available Tools

### 1. freelo_get_task

Get detailed information about a specific Freelo task, including all comments and attached files.

**Parameters:**
- `taskId` (number) - The unique ID of the task

**Returns:**
- Task name, description, priority, state
- Author and assignee information
- Dates (created, due, completed)
- Project and task list details
- Tags and time estimates
- Comments with content, author, timestamps, and attached files (with UUIDs)

**Example:**
```
Use freelo_get_task with taskId: 12345
```

### 2. freelo_list_task_subtasks

List all subtasks of a specific task with completion statistics.

**Parameters:**
- `taskId` (number) - The unique ID of the task

**Returns:**
- Array of subtasks with names, state, dates, author, assignee
- Statistics (total, completed, remaining, completion percentage)

**Example:**
```
Use freelo_list_task_subtasks with taskId: 12345
```

### 3. freelo_download_file

Download a file from Freelo using its UUID. File UUIDs are found in task comments (use `freelo_get_task` first).

**Parameters:**
- `fileUuid` (string) - The UUID of the file (from task comments)
- `filename` (string, optional) - Custom filename to save as

**Returns:**
- Downloaded file path (in system temp directory)
- File metadata (UUID, filename, size)

**Example:**
```
Use freelo_download_file with fileUuid: "550e8400-e29b-41d4-a716-446655440000"
```

## Adding New Tools

You can extend this MCP server with additional Freelo API tools:

```bash
# Add a new tool using mcp-framework CLI
mcp add tool my-tool

# Examples of additional Freelo tools you might create:
# - freelo_list_projects
# - freelo_create_task
# - freelo_add_comment
```

## Tool Development

Example tool structure:

```typescript
import { MCPTool } from "mcp-framework";
import { z } from "zod";

interface MyToolInput {
  message: string;
}

class MyTool extends MCPTool<MyToolInput> {
  name = "my_tool";
  description = "Describes what your tool does";

  schema = {
    message: {
      type: z.string(),
      description: "Description of this input parameter",
    },
  };

  async execute(input: MyToolInput) {
    // Your tool logic here
    return `Processed: ${input.message}`;
  }
}

export default MyTool;
```

## Publishing to npm

1. Update your package.json:
   - Ensure `name` is unique and follows npm naming conventions
   - Set appropriate `version`
   - Add `description`, `author`, `license`, etc.
   - Check `bin` points to the correct entry file

2. Build and test locally:
   ```bash
   npm run build
   npm link
   freelo-mcp  # Test your CLI locally
   ```

3. Login to npm (create account if necessary):
   ```bash
   npm login
   ```

4. Publish your package:
   ```bash
   npm publish
   ```

After publishing, users can add it to their Claude Desktop client (see below) or run it with npx.

## Usage with Claude Desktop

After building the project and configuring your credentials (see [Freelo API Setup](#freelo-api-setup)), restart Claude Desktop to load the MCP server.

You can then use the Freelo tools in your conversations with Claude:

**Example conversation:**
```
You: "Get details for Freelo task 12345"
Claude: [Uses freelo_get_task tool and returns task info with comments and files]

You: "Show me the subtasks"
Claude: [Uses freelo_list_task_subtasks tool and displays subtasks]

You: "Download the first file attachment"
Claude: [Uses freelo_download_file with the UUID from the task comments]
```

## Building and Testing

1. Make changes to your tools
2. Run `npm run build` to compile
3. The server will automatically load your tools on startup

## Learn More

### MCP Framework
- [MCP Framework GitHub](https://github.com/QuantGeekDev/mcp-framework)
- [MCP Framework Docs](https://mcp-framework.com)
- [Model Context Protocol](https://modelcontextprotocol.io)

### Freelo API
- [Freelo API Documentation](https://freelo.docs.apiary.io/) - Official API reference
- [Freelo API Help](https://help.freelo.io/help/api-klic/) - How to get your API key
- [Freelo Website](https://www.freelo.io) - Project management platform

## API Reference

This MCP server uses the Freelo REST API v1:

- **Base URL**: `https://api.freelo.io/v1`
- **Authentication**: HTTP Basic Auth (email:apiKey)
- **Response Format**: JSON
- **Current Support**: Read-only operations (GET endpoints)

For detailed API specifications, see the [official Freelo API documentation](https://freelo.docs.apiary.io/).

## Contributing

This is a personal project for Freelo API integration. Feel free to extend it with additional tools or improvements.

## License

MIT