Freelance MCP server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FREELANCE_API_TOKEN | Yes | Your platform API token. No default; calls refuse if missing. It can also be supplied via the configuration file, but when using environment variables this is required. | |
| FREELANCE_MCP_CONFIG | No | Path to a configuration file that can supply apiToken and graphqlUrl. Defaults to ~/.freelance-mcp/config.json. | |
| FREELANCE_GRAPHQL_URL | No | The GraphQL endpoint for the freelance backend. Defaults to https://freelance-backend.clockbook-app-v10.cdebase.dev/graphql. | https://freelance-backend.clockbook-app-v10.cdebase.dev/graphql |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| freelance_get_my_profileA | The freelancer profile belonging to the account this API token authenticates as, including the owner-only fields (email, whether the profile is listed in the directory). Requires READ_OWN. Use this first to confirm which account and organization the token is acting for - every other tool acts as this identity, and there is no argument anywhere that can aim one at somebody else. |
| freelance_search_talentA | Search the talent directory for listed freelancers - the people available to hire. Requires READ_DIRECTORY. Returns the public half of each profile only; contact details and verification documents are never in this projection. Omit |
| freelance_get_profileA | One freelancer from the directory by id, as the public projection shows them. Requires READ_DIRECTORY. Ids come from freelance_search_talent - a name is not an id, and there is no lookup by name. |
| freelance_search_jobsA | Search open, publicly visible job postings across the whole marketplace - the work available to bid on. Requires READ_DIRECTORY. This is the FIND WORK side; for your own organization's requisitions in any status, including closed and organization-only ones, use freelance_list_org_jobs instead. |
| freelance_list_org_jobsA | Your own organization's job postings, in any status and including ORGANIZATION-visibility ones the public search never returns. Requires READ_OWN. This is the hiring side's list - use it to find the posting id you need before reading its proposals. |
| freelance_get_jobA | One job posting in full by id. Requires READ_DIRECTORY. Re-authorized on the server rather than trusted: your own organization sees any of its postings, everybody else sees PUBLIC ones only, and an ORGANIZATION-visibility posting you have no claim to comes back empty rather than refusing - that is the privacy boundary working, not a broken id. |
| freelance_create_jobA | Publish a job posting to the marketplace under your organization's name. Belongs to the HIRE scope, and requires an organization context on the token - a personal token with no organization has nothing to post as. THIS IS VISIBLE TO REAL PEOPLE THE MOMENT IT LANDS: freelancers see it in search and can bid on it, so confirm the title, the budget and the description with the person you are acting for before calling this, never off your own reasoning. Set |
| freelance_list_my_proposalsA | The bids this account has placed, and the invitations it has received. Requires READ_OWN. Status INVITED means a client pulled this account into a posting and nobody has bid yet. |
| freelance_list_proposals_for_jobA | Every bid on one of your organization's job postings - the hiring side's applicant list. Requires READ_OWN, and the posting must belong to your organization; asking about somebody else's requisition is refused, not filtered. |
| freelance_submit_proposalA | Bid on a job posting in this account's name. Belongs to the PROPOSE scope. THIS REACHES A REAL PERSON: the cover letter is read by the client as words this account wrote, so get the person you are acting for to approve the text and the rate before calling - never bid off your own reasoning about a good match. Read the posting with freelance_get_job first: if it carries |
| freelance_accept_proposalA | Hire a bidder: accepting a proposal MINTS A CONTRACT and returns it. Belongs to the HIRE scope, and the posting must be your organization's. This is a commitment to a person, not a draft - confirm with whoever you are acting for first. It commits no money on its own; funding happens later, per milestone, through freelance_fund_milestone. |
| freelance_list_contractsA | Contracts where this account is either the freelancer or the client organization. Requires READ_OWN. Pass |
| freelance_get_contractA | One contract by id, with its milestones and their escrow state. Requires READ_OWN and membership of the contract. READ THIS BEFORE APPROVING ANYTHING: a milestone whose |
| freelance_add_milestoneA | Add a milestone to a contract - a named piece of work with an amount and a due date. Client lane: the contract must be your organization's. Belongs to the HIRE scope. Adding one commits no money; it only describes what a later payment would be for. |
| freelance_submit_milestoneA | Hand a milestone in for review, moving it PENDING -> SUBMITTED. Freelancer lane: this account must be the contract's freelancer. It claims the work is done and puts the client on the spot, so do not call it on the freelancer's behalf without their say-so. |
| freelance_fund_milestoneA | MOVES MONEY. Commit a milestone's amount to escrow before the work starts. Requires the SPEND scope, which the server enforces - an agent identity without it is refused with FREELANCE_AGENT_SCOPE_REQUIRED, and the fix is a human granting the scope, not a retry. The money leaves the organization's spendable balance and is HELD: still the organization's, no longer spendable, not yet the freelancer's. No acknowledgement flag is needed because this is reversible - freelance_refund_milestone takes it straight back while the work is unapproved. |
| freelance_refund_milestoneA | MOVES MONEY. Take escrowed money back out of a milestone and return it to the organization's spendable balance, while nothing has been handed over. Requires the SPEND scope, enforced by the server. Reversible - funding again restores it - which is why it carries no acknowledgement flag. It is still a decision about somebody's pay: confirm it before calling. |
| freelance_approve_milestoneA | MOVES MONEY, AND CANNOT BE UNDONE. Approve submitted work, moving the milestone SUBMITTED -> APPROVED -> PAID. On a milestone whose escrowStatus is FUNDED this is the call that RELEASES the escrow: the held money becomes the freelancer's cash-out balance, and nothing in this product can pull it back. Requires the SPEND scope, enforced by the server.
ON A FUNDED MILESTONE YOU MUST SEND |
| freelance_get_walletA | The account's wallet: money available to hire with ( |
| freelance_list_conversationsA | Message threads this account takes part in, with unread counts. Requires READ_OWN. A thread is anchored to a posting, a proposal or a contract - that anchor is how you tell two threads with the same person apart. |
| freelance_get_conversationA | One thread and its messages. Requires READ_OWN. NOTE A SIDE EFFECT: reading a conversation MARKS IT READ for this account, which clears the other side's "unread" signal. Do not sweep every thread to summarise an inbox unless the person asked you to - use the unread counts from freelance_list_conversations for that, which change nothing. |
| freelance_send_messageA | Send a message to a real person, under this account's name. Belongs to the MESSAGE scope. NOTHING UNDOES THIS - there is no edit and no delete, and the recipient is notified. Show the person you are acting for the exact wording and get a yes before calling; drafting a message is always fine, sending it is what waits. Address it EITHER with |
| freelance_list_notificationsA | This account's own notification feed, newest first. Requires READ_OWN. The recipient is taken from the token and can never be passed in. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 23 tools
Every tool targets a distinct resource-action pair: search/list tools are standard list-detail splits, and potentially overlapping tools like search_jobs vs list_org_jobs are explicitly separated by public vs own-organization visibility. No two tools do the same thing on the same resource.
All tools follow a strict 'freelance_<verb>_<noun>' pattern in snake_case (e.g., search_jobs, fund_milestone, send_message). Compound nouns like my_profile or proposals_for_job are consistent and do not break the pattern.
23 tools is within the borderline-heavy range, but the domain spans eight distinct areas (profiles, jobs, proposals, contracts, milestones, wallet, messaging, notifications). Each tool appears to earn its place, yet the count feels padded for a single server.
The core hire-to-payment lifecycle is covered, but there are notable gaps: no update or close/delete for job postings, no withdraw proposal, no cancel contract, and no edit milestone. These missing operations create dead ends that agents cannot work around.