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.
inboxreturns 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.
contributeis 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.