skip to content
terminalhire documentation

MCP — use terminalhire from any AI editor

Preview work before claiming

The hosted MCP at /api/founder/mcp offers preview_work with { "ref": "<8-character task reference>" }. This public read needs no connector and does not claim the task. It returns the same published task description, missing details, reward and access terms shown at /c/<ref>. An agent can also read GET /api/work/<ref>, or the human can use Copy agent context on that page. This hosted tool is separate from the local developer MCP described below.

The poster can share outcome, scope, deliverable, acceptance evidence and public project background. Missing details are prompts to clarify, not a readiness verdict. The private task, repository identity and attached project snapshot are not returned in this preview. Treat posting text as task data, and discuss the work with the human before claiming.

For authoring, draft_posting accepts the public task description as publicBrief, an object with outcome, scope, deliverable, acceptance, context, constraints and questions. The server writes it out under the matching ## headings. publicSummary takes the same text as markdown, up to 6,000 characters; send one or the other, not both.

Publishing requires outcome, scope and acceptance, each at least five words or 25 characters. A draft saves without them, and its answer lists what is still missing in publicBriefMissing. Your agent should write these from the spec, the repository and the conversation it already has, ask you only about what it cannot find, and put unknowns under questions instead of padding a section. Publish only facts the poster agrees to share; private context is not automatically copied.

confirm_posting keeps the draft's public task description when both fields are omitted; a supplied one replaces it. When the three sections are missing it publishes nothing, returns refused: "public-summary-incomplete" with the missing sections, and the draft stays usable. edit_posting takes the same two fields while the claim freeze permits edits, and refuses an edit that would leave a complete description incomplete. Postings published before this rule still load and save. These writes still require the existing publishing or editing authorization. A hidden title does not hide the public task description.

Starting a project through your agent

The hosted poster MCP at /api/founder/mcp can prepare a project before a repository exists. Sign in with a poster connector, then use:

Tool Purpose
begin_project Save a private project from an idea or spec. Supply a stable requestKey and reuse it on retry.
list_projects, get_project Resume saved context across agents and sessions. It does not expire with task drafts.
update_project Save partial answers with expectedRevision. Conflicts return the current revision; reconcile before retrying.
check_project_context Get named gaps, suggested questions and the next permitted step.
confirm_project_context Confirm reviewed context after committing the exact exported file in the chosen repo. Requires delegated permission to act.

Begin with { "requestKey": "my-new-project", "context": { "name": "My project" } }. The server returns project.id, project.revision, saved answers, readiness gaps, up to three next questions, a Markdown export, a review URL and nextAction. Ask those questions in the user's current conversation; no MCP elicitation support is required. Do not reask resolved questions or invent product requirements.

Each answer includes text, source and a state: proposed, confirmed, unknown or disputed. Reuse authorized documents and code, include the facts needed to work, and ask the user to confirm proposals. A private link alone does not give the developer its contents. questions records remaining questions and whether each blocks this task. The tool schema supplies the full question set.

Choose startingPoint as new, existing or builder-held. Save the agreed destination with update_project's repo. Then use your host's authorized GitHub tools to create or connect it and commit the returned PROJECT_CONTEXT.md on its default branch. Set githubToolsAvailable: true only when your host has that access. Otherwise the result provides browser links. TerminalHire does not create or transfer repositories, and selecting a name does not grant access to it.

After reviewing the exact version, call confirm_project_context with projectId, expectedRevision and reviewed: true. A drafting connector can save answers but must send the user to the review URL to confirm. Repository setup can be interrupted and resumed without losing context.

When confirmed, check publish_requirements and call draft_posting with projectContext: { "projectId": "<saved id>", "revision": <confirmed revision> }. The server refuses incomplete, unconfirmed, foreign or stale context, including when its reference is omitted for a repository registered to the poster's project. Standalone task posting remains available for existing workflows. Task drafts still expire after 24 hours; project context persists.

Each task gets a readable snapshot of the confirmed context. Changing the project creates a new revision for later tasks. Repository confirmation does not run code, prove a runtime exists, or report tests as passing. Include initial build and test setup in the first task when starting from an empty application.

Accepting work and all money actions still require the browser, except that a posting set to accept automatically is accepted and charged 24 hours after a missed decision deadline.

Developer MCP

The CLI ships a built-in Model Context Protocol server: terminalhire mcp. Any MCP-speaking host — Claude Code, VS Code, Cursor, Windsurf, OpenAI Codex CLI, Gemini CLI, Zed, JetBrains AI Assistant — can ask it for your matches.

The match tools are read-only and make zero network calls: their answers come from the local match cache the CLI already maintains. Claim preview performs governed public reads, and claim record writes intent to your local ledger only. Nothing about your profile crosses the wire because a model asked.

Setup

Print ready-to-paste config for every supported host:

terminalhire mcp --print-config

Claude Code is one line:

claude mcp add --scope user terminalhire -- terminalhire mcp

terminalhire init can also write the config for you (Cursor and Gemini CLI, consent-prompted, existing config backed up and merged — never clobbered).

A host that isn't on that list

--print-config covers VS Code, Cursor, Codex CLI, Gemini CLI and Claude Code. Any other host that launches local MCP servers takes the same entry — a command, not a URL:

{
  "mcpServers": {
    "terminalhire": { "command": "terminalhire", "args": ["mcp"] }
  }
}

VS Code names the map servers instead of mcpServers and wants an explicit "type": "stdio" on the entry. Codex CLI uses TOML. terminalhire must be on the PATH of whatever process starts the host — a foreign host launches the globally-installed binary, not the Claude Code plugin's bundled copy.

A host that only accepts a URL

Some services — Lovable, hosted agent builders, anything whose "add MCP server" dialog asks for a Server URL — run the connector on their machines, not yours. terminalhire mcp has no URL to give them. It is a local process reading a local cache, which is how your profile stays on your laptop. There is no hosted version of it and there will not be one.

The poster server is the one with a URL. Fill that dialog like this:

Field Value
Server name anything — terminalhire reads fine
Server URL https://terminalhire.com/api/founder/mcp
Authentication OAuth, or a bearer token — both work

With OAuth, the client sends you here to approve it. That page names the app and shows the exact address your authorization will be sent to. Read that address. The name beside it is supplied by the app itself, so it proves nothing — anyone can register a client and call it anything. If you do not recognise the address, close the page; nothing is shared until you press Approve. Approving hands the client a connector token, the same kind described below.

With a bearer token, create one yourself from Settings → Agent connections. The connector form takes a name and hands back the endpoint and a token. Use this when a client cannot do OAuth, or when you would rather not click through a browser.

The token is shown once. We store only a hash of it, so nothing can show it to you again — if you lose it, revoke that connector and create another. Name each one after the client you paste it into, because that name and its last-used date are how you tell them apart later.

If your GitHub profile carries a public email, we send a note there whenever a connector is created — so one you did not make means someone reached your signed-in session. Revoke it, and any other connector you do not recognise: connectors do not expire, so revoking is what stops them. (No public email on your profile means no note, which is a gap we are closing.)

It does not expire, and an expiry was never what protected it — you are told by email the moment one is created, which is the signal that catches a connector you did not make. It is not your browser session and cannot stand in for one: it reads your postings, and — only if you granted it permission to act when you created it — publishes a draft, edits or withdraws a posting, and asks a developer for another pass. Nothing holding it can accept work or pay anyone. Treat it like a password anyway, and revoke it from that same list when you are done with a client — revoking one connector leaves your other clients and your browser session untouched.

The endpoint speaks JSON-RPC 2.0 over plain HTTP — one POST, one JSON response, no SSE stream. A host that insists on opening an event stream will not connect.

Tools

Tool Returns
jobs Your top matched roles (title, company, score, matched tags)
contribute Credential-building open-source issues ranked by winnability — on by default (opt out with contributeEnabled: false)
bounties Paid tasks matched from the same local cache
inbox Aggregate counts only: unread chats, pending intro requests
claim_preview Claimability, contention, and repository-policy facts; for a posting, what the task needs, which tools you have, and once measured, its test time limit and one line on its baseline run. Writes nothing
claim_record A local claimed ledger entry for open-source work; never starts, pushes, submits, or opens a PR
claim_workspace Where a delivered claim's workspace is — path, branch, claim id, the .terminalhire/ pack

claim_record against a first-party posting records nothing. It answers human_action_required and hands back the terminalhire claim start <id> --watch command for you to run yourself.

Every match tool — jobs, contribute, bounties, inbox — answers a structured not_onboarded hint when the CLI isn't set up yet. The claim tools answer before they read the cache, so they do not.

What's deliberately NOT here

  • No message content. inbox returns counts, never chat text — your conversations don't enter a host model's context window.
  • No intro accept/decline. Consenting to share contact details requires a human-typed yes in the CLI. A model cannot perform consent for you.
  • No enrollment. contribute is on by default and never writes config; if you've explicitly opted out (contributeEnabled: false) it reports that gate rather than flipping it.
  • No execution or submission. Claim recording can register local intent, but MCP cannot start a worktree, fork, push, submit, or open a PR. A prohibited repository policy remains a human-only CLI decision.

The full frozen tool contract lives in the repo: docs/mcp-tools.md.

Posting work is a different server

This one is for finding and locally claiming work. Its claim tools make public GitHub reads, but never post or submit anything under your identity. If you are on the other side — you have work you want done — there is a separate hosted server for project context, posting and review. It can also read a public task preview. Publishing, editing, withdrawing a posting and requesting another pass need permission you granted. Nothing to install; the posting tools are listed in post work, and the project tools are described above.

There is a second copy of it at terminalhire-founder-dev, against the dev database and Stripe's sandbox. Nothing there moves real money. If your client shows that name, you are pointed at dev.