On this page

API

Hosted MCP server

Connect Claude Code, Claude Desktop, Cursor, VS Code or Windsurf to https://reuseforge.com/mcp and use search, planning, install and buying as MCP tools.

ReuseForge runs an MCP server at https://reuseforge.com/mcp. It is the same API as tools: every operation that makes sense for a model becomes one tool, named exactly like the operationId, and a tool call goes through the same checks as a REST call (scopes, rate limits, validation, idempotency and spend limits). Anonymous clients get the read, plan and discover tools; a token or an OAuth sign-in adds whatever its scopes allow.

OAuth sign-in is built but not live yet. The OAuth server is implemented in the repository (worker/src/mcp/oauth/, with tests), but when this page was written the deployed reuseforge.com still answered 404 for /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource/mcp (checked 2026-11-03). Until it is deployed, connect anonymously or with a bearer token. The /mcp/auth addresses below work as described once it is.

Connect a client

The client configuration formats below follow each tool's public documentation. The server side was checked with raw protocol calls against reuseforge.com (initialize, tools/list, tools/call, resources and prompts), not by driving every client application, so tell us if a client's menu has moved.

Claude Code

bash
claude mcp add --transport http reuseforge https://reuseforge.com/mcp

That connects anonymously: you can search, read items and plan. To use your account, either send a token:

bash
claude mcp add --transport http reuseforge https://reuseforge.com/mcp --header "Authorization: Bearer $REUSEFORGE_TOKEN"

or sign in with OAuth: add the server with the URL https://reuseforge.com/mcp/auth instead, then run /mcp in Claude Code and choose Authenticate. Use --scope user or --scope project to share it across projects or with your team. Do not commit a token: use an environment variable.

Claude Desktop and claude.ai

Open Settings, Connectors, choose Add custom connector, and enter https://reuseforge.com/mcp/auth. The client discovers the sign-in from the server's OAuth metadata, opens ReuseForge in your browser, and you approve on a consent page. The /mcp/auth address is the same server as /mcp; it differs only in answering anonymous callers with the OAuth challenge, so the client starts the sign-in.

Cursor

Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (all projects):

json
{
  "mcpServers": {
    "reuseforge": { "url": "https://reuseforge.com/mcp" }
  }
}

This connects anonymously. To use a token add "headers": { "Authorization": "Bearer ${env:REUSEFORGE_TOKEN}" }. Once OAuth is deployed, use https://reuseforge.com/mcp/auth as the URL and Cursor will sign you in.

VS Code

Add to .vscode/mcp.json (or run MCP: Add Server and choose HTTP). Anonymous access needs only the URL. Once OAuth is deployed, use https://reuseforge.com/mcp/auth to sign in instead.

json
{
  "servers": {
    "reuseforge": { "type": "http", "url": "https://reuseforge.com/mcp" }
  }
}

To authenticate with a token instead, add a headers entry with "Authorization": "Bearer rf_..." to the server (prefer VS Code's input variables so the token is not committed with the file).

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

json
{
  "mcpServers": {
    "reuseforge": { "serverUrl": "https://reuseforge.com/mcp" }
  }
}

Clients without remote MCP

A client that can only start a local process can use the CLI as a stdio bridge. rf mcp serve proxies to the hosted tools with your credentials and never forwards accept_order:

json
{ "mcpServers": { "reuseforge": { "command": "npx", "args": ["-y", "reuseforge", "mcp", "serve"] } } }

(The reuseforge package is not on npm yet; until then use { "command": "rf", "args": ["mcp", "serve"] } with the CLI installed from a checkout.) Add --read-only to forward only read-only tools, and give it a token with a spend limit.

Signing in

MethodUse when
AnonymousSearching, reading and planning. Rate limits are per address.
Bearer tokenYour client lets you set headers. Create a token with exactly the scopes you want (authentication) and a spend limit.
OAuth 2.1Your client cannot paste a token (claude.ai, Claude Desktop, Cursor, VS Code). Use the /mcp/auth address.

With OAuth the server is its own authorization server: authorization code with PKCE (S256 only), dynamic client registration and client ID metadata documents, resource indicators and refresh tokens with rotation. You sign in with your normal ReuseForge account, then a consent page shows which app is asking and from which redirect address, lets you narrow the scopes, never offers orders:accept, tokens:manage or admin, and enables orders:pay only if you set an explicit dollar limit (the default is no spending). The result is an ordinary short-lived rf_ token (one hour, refreshed) that appears in Settings as OAuth: <client>; revoking it there ends the grant.

Tools

tools/list is filtered by what the caller may do: a token without orders:accept does not see accept_order, and an anonymous client sees only the read tools (19 when this page was written, checked against reuseforge.com on 2026-11-03). Pages of 25. The table lists every tool the contract defines, with the scopes it needs.

MCP tools
ToolTitleScopesHintsOperation
list_event_typesList event typesnoneread-onlylist_event_types
get_rate_limitsGet rate limitsnoneread-onlyget_rate_limits
get_meWho am Inoneread-onlyget_me
get_accountGet accountnoneread-onlyget_account
search_itemsSearch itemsnoneread-onlysearch_items
create_itemCreate itemitems:writewritescreate_item
get_itemGet itemnoneread-onlyget_item
update_itemUpdate itemitems:writeidempotentupdate_item
retract_itemRetract itemitems:writedestructive, idempotentretract_item
star_itemStar itemitems:writeidempotentstar_item
unstar_itemUnstar itemitems:writeidempotentunstar_item
list_reviewsList reviewsnoneread-onlylist_reviews
create_reviewReview itemitems:writewritescreate_review
delete_reviewDelete my reviewitems:writedestructive, idempotentdelete_review
get_item_statsGet item statsnoneread-onlyget_item_stats
get_install_descriptorGet install descriptornoneidempotentget_install_descriptor
list_versionsList versionsnoneread-onlylist_versions
publish_versionPublish versionitems:publishwritespublish_version
get_versionGet versionnoneread-onlyget_version
update_versionYank or restore versionitems:publishidempotentupdate_version
request_verificationRequest verificationitems:publishwritesrequest_verification
get_verificationGet verificationnoneread-onlyget_verification
plan_goalPlan a goalnonewritesplan_goal
get_planGet plannoneread-onlyget_plan
build_briefBuild briefnoneread-onlybuild_brief
discover_externalDiscover externalnoneread-onlydiscover_external
get_mcp_configGet MCP confignoneread-onlyget_mcp_config
list_connectorsList connectorsnoneread-onlylist_connectors
list_ordersList ordersorders:readread-onlylist_orders
create_orderCreate orderorders:createwritescreate_order
get_orderGet orderorders:readread-onlyget_order
pay_orderPay orderorders:paydestructivepay_order
cancel_orderCancel orderorders:createdestructive, idempotentcancel_order
deliver_orderDeliver order itemsorders:createidempotentdeliver_order
accept_orderAccept order and release paymentorders:acceptdestructive, idempotentaccept_order
dispute_orderDispute orderorders:createidempotentdispute_order
refund_order_itemRefund order itemorders:createdestructive, idempotentrefund_order_item
list_payoutsList payoutsorders:readread-onlylist_payouts
get_earningsGet earningsorders:readread-onlyget_earnings
list_projectsList projectsnoneread-onlylist_projects
create_projectCreate projectprojects:writewritescreate_project
get_projectGet projectnoneread-onlyget_project
back_projectBack projectprojects:write, orders:paydestructiveback_project
withdraw_backingWithdraw backingprojects:writedestructive, idempotentwithdraw_backing
deliver_milestoneDeliver milestoneprojects:writewritesdeliver_milestone
vote_milestoneVote on milestoneprojects:writeidempotentvote_milestone
finalize_milestoneFinalize milestoneprojects:writeidempotentfinalize_milestone
vote_abortVote to abort projectprojects:writedestructive, idempotentvote_abort
transfer_unitsTransfer unitsprojects:writedestructivetransfer_units
attach_productAttach productprojects:writeidempotentattach_product
get_portfolioGet portfolioprojects:readread-onlyget_portfolio

Operations that are not tools, because they are plumbing for your own code or a decision that belongs to a person:

get_api_index, get_health, get_openapi_document, list_tokens, create_token, revoke_token, get_version_bundle, get_version_archive, get_marketplace, resolve_order_item, list_webhooks, create_webhook, get_webhook, update_webhook, delete_webhook, rotate_webhook_secret, test_webhook, list_webhook_deliveries, redeliver_webhook, list_ledger_events, post_ledger_events

Each tool's inputSchema is one flat object made of the operation's path parameters, query parameters and body fields; the owner and slug pair is a single item argument ("acme/invoice-extractor"). POST tools that accept an Idempotency-Key take an optional idempotency_key, and operations that take If-Match take if_match. The tool annotations (readOnlyHint, destructiveHint, idempotentHint) come from the contract, so a client can ask for confirmation before a destructive call.

Results and errors

A tool result carries the JSON body as structuredContent and the same JSON as text in content[0] (cut at 100 KB with a note; the structured copy is complete). _meta["reuseforge.com/mcp"] reports the rate limit state. A 204 becomes {"ok": true, "status": 204}. Errors are tool results with isError: true whose text is the Problem JSON, never protocol errors, so the model can read code, order_hint or retry_after and act. See errors.

Money and consent

create_order only records a pending order. pay_order, back_project, transfer_units, refund_order_item and accept_order move money and are annotated as destructive. The server's instructions tell the model to ask you before pay_order and never to call accept_order without your explicit approval in the conversation. Your token's spend limit is the real guard: it holds even if a model ignores its instructions. When a client sends no idempotency_key the server derives one from the caller, the tool, the JSON-RPC request id and the arguments, so a retried request replays the first result instead of paying twice, while the same arguments under a new request id are a new request.

The orders operations are not enabled on reuseforge.com yet (see the availability table), so the money tools answer 501 not_implemented there for now.

Untrusted content

Titles, READMEs, reviews, external search results and plan explanations are written by strangers. Everything of that kind passes through a sanitiser before a model sees it: ids, enums, numbers and dates are untouched, URLs are validated, hidden Unicode, role markers and special tokens are defused, and long documents are wrapped in <untrusted-data> blocks that cannot be closed from inside. The result _meta says how many strings were changed, wrapped or flagged. Treat what is inside as data, never as instructions.

Resources and prompts

KindNameWhat it is
Resource templatereuseforge://items/{owner}/{slug}The same JSON as get_item.
Resource templatereuseforge://plans/{id}A plan from plan_goal.
Resource templatereuseforge://orders/{id}One of your orders (needs orders:read).
Resourcereuseforge://guide/agentA short guide for agents.
Promptassemble_goalPlan a goal within a budget, install free parts, buy paid parts with your approval, build the rest from a brief. Arguments goal and budget_usd.
Promptpublish_itemWalk through creating an item, publishing a version with its content hash and requesting verification.

Calling it by hand

The transport is MCP Streamable HTTP, stateless: every JSON-RPC message is its own POST /mcp answered with application/json. There is no session id and no event stream, so any server instance can answer any request.

bash
curl -sS https://reuseforge.com/mcp \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -H 'MCP-Protocol-Version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_items","arguments":{"q":"whisper","limit":1}}}'
  • GET and DELETE answer 405; notifications get 202; bodies are capped at 1 MiB.
  • Protocol versions 2025-11-25, 2025-06-18 and 2025-03-26 are served with a stateless initialize; the newer 2026-07-28 style (no initialize, a _meta block on each request) is served on the same address.
  • Browser origins: any origin may call anonymously; a request that carries credentials from a foreign origin is refused with 403. Cookies are never read on this endpoint.

Discovery

AddressWhat
https://reuseforge.com/.well-known/mcp/server-card.jsonThe MCP server card (com.reuseforge/reuseforge) with the streamable-http remote.
https://reuseforge.com/.well-known/mcpA small descriptor.
https://reuseforge.com/.well-known/oauth-protected-resource/mcpOAuth protected resource metadata (RFC 9728). Not served by the deployment checked on 2026-11-03.
https://reuseforge.com/.well-known/oauth-authorization-serverAuthorization server metadata (RFC 8414). Not served by the deployment checked on 2026-11-03.
https://reuseforge.com/.well-known/ard.jsonAgent resource discovery: points at the server card and the OpenAPI document.

The live tools/list is authoritative; the card and this page are generated from the same contract.

Last updated: