# FreelanceOS

AI-powered freelance business manager. Manage clients, proposals, invoices, time tracking, scope, and follow-ups � 37 tools covering the full freelance lifecycle from lead to payment.

## Quick Start

```bash
# Connect this server (installs CLI if needed)
npx -y @smithery/cli@latest mcp add Sohlin2/freelance-os

# Browse available tools
npx -y @smithery/cli@latest tool list Sohlin2/freelance-os

# Get full schema for a tool
npx -y @smithery/cli@latest tool get Sohlin2/freelance-os clients.records.create

# Call a tool
npx -y @smithery/cli@latest tool call Sohlin2/freelance-os clients.records.create '{}'
```

## Direct MCP Connection

Endpoint: `https://freelance-os--sohlin2.run.tools`

**Optional config:**
- `x-api-key` (header) — Your FreelanceOS API key — get one at https://buy.stripe.com/00w4gAac7bQP2HQ1vY2Ji01
- `server_url` (query) — Custom server URL override for self-hosted deployments. Leave empty to use the default production server.

## Tools (37)

- `clients.records.create` — Create a new client record in the FreelanceOS database. Use this tool whenever a freelancer mentions a new client they'…
- `clients.records.get` — Retrieve the full profile for a single client, including all associated projects and follow-up communications. Use this…
- `clients.records.list` — List all active (non-archived) clients with optional name search, sorting, and pagination. Use this tool when a freelan…
- `clients.records.update` — Update one or more fields on an existing client record. Use this tool when a freelancer wants to correct contact detail…
- `clients.records.archive` — Soft-delete a client by setting their archived_at timestamp, hiding them from all active client lists while preserving …
- `projects.records.create` — Create a new project linked to an existing client and persist it to the FreelanceOS database. Use this tool when a free…
- `projects.records.get` — Retrieve full details for a single project, including the associated client name and contact information. Use this tool…
- `projects.records.list` — List all non-archived projects with optional full-text search, status and client filters, sorting, and pagination. Use …
- `projects.records.update` — Update one or more fields on an existing project record, including name, description, budget, dates, or lifecycle statu…
- `projects.records.archive` — Soft-delete a project by setting its archived_at timestamp, hiding it from all active project lists while preserving al…
- `proposals.records.create` — Store a new proposal for a project, capturing all relevant details such as title, deliverables, pricing, and expiry dat…
- `proposals.records.get` — Retrieve a single proposal by its unique identifier, returning all stored fields including status, amount, and content.…
- `proposals.records.list` — List proposals filtered by project, client, or status with support for sorting and pagination. Use when the freelancer …
- `proposals.records.update` — Update one or more fields on an existing proposal, including content, pricing, status, or key timestamps. Use when the …
- `proposals.records.accept` — Mark a proposal as accepted, record the response timestamp, and automatically seed the linked project's scope_definitio…
- `invoices.records.create` — Create and persist a new invoice with line items, tax, and totals in the FreelanceOS database. Use when the freelancer …
- `invoices.records.get` — Retrieve the full details of a single invoice by its UUID. Use when the freelancer asks to view, review, or share the d…
- `invoices.records.list` — Return a paginated, filtered list of invoices for the authenticated freelancer. Use when the freelancer asks about outs…
- `invoices.records.update` — Update one or more fields on an existing invoice, including its status or financial totals. Use when the freelancer mar…
- `time.entries.create` — Log a time entry against a project to record hours worked. Use when the freelancer reports time spent on a task, meetin…
- `time.entries.get` — Retrieve a single time entry record by its unique identifier. Use when the freelancer asks to view the details of a spe…
- `time.entries.list` — List time entries with optional filtering by project, date range, and billable status. Use when reviewing logged hours …
- `time.entries.update` — Update one or more fields on an existing time entry record. Use when the freelancer needs to correct a logged entry's d…
- `time.entries.archive` — Soft-delete a time entry by setting its archived_at timestamp, hiding it from all queries. Use when the freelancer want…
- `time.entries.aggregate` — Calculate the total minutes and hours logged against a project over an optional date range. Use when preparing an invoi…
- `scope.definition.create` — Define and persist the agreed project scope with deliverables, boundaries, and exclusions. Use this tool when starting …
- `scope.definition.get` — Retrieve the current active scope definition for a project, including deliverables, boundaries, assumptions, and exclus…
- `scope.definition.update` — Update one or more fields of the active scope definition for a project. Use when the client and freelancer have mutuall…
- `scope.changes.log` — Record a client scope change request with classification and impact notes to maintain an auditable history of scope cre…
- `scope.changes.list` — List all scope change requests logged against a project, with optional filtering by classification and configurable sor…
- `scope.definition.check` — Retrieve the agreed scope definition and full change history for a project so Claude can assess whether a new client re…
- `followups.messages.create` — Store a drafted follow-up message in the FreelanceOS database. Use when the freelancer has composed a follow-up and wan…
- `followups.messages.get` — Retrieve a single follow-up record by its unique ID. Use when the freelancer asks to view the full details of a specifi…
- `followups.messages.list` — List and filter follow-up records for a client or project with pagination support. Use when the freelancer asks to revi…
- `followups.messages.update` — Update the content or metadata of an existing follow-up record. Use when the freelancer wants to revise a drafted follo…
- `followups.sent.mark` — Record the current timestamp as the sent date on a follow-up, transitioning it from draft to sent status. Use when the …
- `followups.context.get` — Fetch all relevant context needed to draft an effective follow-up for a client, including outstanding invoices, recent …

```bash
# Get full input/output schema for a tool
npx -y @smithery/cli@latest tool get Sohlin2/freelance-os <tool-name>
```

## Resources

- `freelance://summary` — High-level overview of your freelance business: total clients, active projects, pending invoices, and recent activity.

## Prompts (2)

- `freelance-onboarding` — Step-by-step guide to set up your freelance business in FreelanceOS.
- `weekly-review` — Generate a weekly summary of time logged, invoices due, and follow-ups needed across all active projects.
