Ironfang MCP

MCP server reference

Connect an AI assistant to your Ironfang organisation with a normal OAuth sign-in. It renders with your Renderwolf credits, inside a budget you control, and never holds a key.

Overview

The Ironfang MCP server is a remote Model Context Protocol server. One endpoint serves every Ironfang product:

https://mcp.ironfang.uk/mcp
PropertyValue
TransportStreamable HTTP. POST /mcp only; there is no standalone event stream and no session id, so any replica can answer any request.
Protocol revision2026-07-28 is current. 2025-11-25, 2025-06-18 and 2025-03-26 are accepted and echoed back on initialize for the compatibility window.
CapabilitiesTools, resource templates, and the io.modelcontextprotocol/tasks extension for long-running work. No prompts, sampling, roots or apps.
AuthorizationOAuth 2.1 through id.ironfang.uk. Resource metadata at /.well-known/oauth-protected-resource/mcp.
StatusPrivate beta. Tool names are a compatibility contract; anything that changes semantics gets a new name.

MCP is not a separate product and has no separate price. It is another safe way to use Renderwolf: rendering spends ordinary Renderwolf credits, reads are free, and each connection has its own spending budget (see credits and budgets).

Tested clients

A client needs remote OAuth support - either a Client ID Metadata Document (CIMD) or public-client Dynamic Client Registration - to connect. We test with real clients and record the date and version; "expected" means the flow is standard but we have not run it ourselves yet.

ClientStatusTestedClient version / revisionHow it registers
Claude Code (CLI)Works27 Aug 2026MCP revision 2025-06-18CIMD (claude.ai/oauth/claude-code-client-metadata)
Claude DesktopExpected - untested--Custom connector (DCR or CIMD)
claude.ai (web)Expected - untested--Custom connector (DCR or CIMD)
Other clientsUnsupported unless they do CIMD or public-client DCR with PKCE---

Claude Code

claude mcp add --transport http ironfang https://mcp.ironfang.uk/mcp

Then inside Claude Code run /mcp, pick ironfang and choose Authenticate. A browser tab opens at id.ironfang.uk: sign in, pick the organisation this connection acts for, review the scopes and allow. The tab closes and the tools appear.

Claude Desktop and claude.ai

Settings → Connectors → Add custom connector, name it Ironfang and enter https://mcp.ironfang.uk/mcp. The same sign-in follows. Please tell us the date and app version when it works for you and we will add it to the table.

Never paste an API key into a chat. The MCP server does not accept Ironfang API keys as a credential; keys stay with the REST API where they belong.

Authentication

The server is an OAuth 2.1 protected resource. An unauthenticated request answers 401 with a WWW-Authenticate challenge that points at the resource metadata document; from there a client discovers the authorization server and completes the code flow with PKCE (S256). The flow, from the client's side:

  1. Read https://mcp.ironfang.uk/.well-known/oauth-protected-resource/mcp.
  2. Read https://id.ironfang.uk/.well-known/oauth-authorization-server.
  3. Identify itself: by a Client ID Metadata Document (an HTTPS URL as the client id, preferred), or by registering as a public client at /oauth/register.
  4. Send the person to /oauth/authorize with resource=https://mcp.ironfang.uk/mcp, the scopes it wants and a PKCE challenge.
  5. The person signs in, chooses one organisation and consents. A connection is one person, one organisation, one client.
  6. Exchange the code at /oauth/token. The access token is short-lived and addressed only to the MCP resource; a rotating refresh token keeps the connection alive without asking again.

Scopes

Scopes are the product's own. A scope is granted only if the person holds the matching permission in the organisation they chose, and it is checked again live on every call - losing a permission ends the access the same minute.

ScopeNeeds permissionLets the assistant
ironfang:mcpmembershipConnect, list tools and inspect this connection and its budgets
renderwolf:renderrenderCreate screenshots, PDFs, QR codes, clips and template renders, and read or cancel its own jobs
renderwolf:usage:readusage.readRead the period's credit usage
renderwolf:templates:readtemplates.readList templates and their variable names (never the markup)
renderwolf:signrenderCreate signed render URLs that expire within 24 hours

A tool whose scope was not granted is still listed, so a client can ask for it: the call answers 403 with the complete scope set in the challenge and the client runs the flow again for the extra scope.

What the server does with the token

Nothing leaves the MCP server carrying your MCP token. To call a product it asks id.ironfang.uk for a separate two-minute token addressed to that product, limited to the scopes you granted and to the organisation you chose, and marked as acting on your behalf. Products refuse an MCP token outright, and the MCP server refuses portal or product tokens.

Revoking

Disconnect a client from the portal's AI clients page or from your account settings at id.ironfang.uk. Revocation ends the refresh token family and the connection; a live access token stops working within thirty seconds, not at its expiry.

Renderwolf tools

Tool inputs are strict JSON Schema objects: unknown fields are rejected rather than ignored, and every string, size and duration is bounded. Rendering tools take a public URL or bounded raw HTML. They do not accept cookies, authorization headers, custom request headers, proxy settings, scripts to execute, or private network targets.

ToolScopeCreditsDoes
ironfang.connection.getironfang:mcp0The organisation this connection acts for, its scopes, available products and budgets. Never email addresses, members, keys or billing.
renderwolf.usage.getrenderwolf:usage:read0Credits used this period, the plan limit and the reset date.
renderwolf.template.listrenderwolf:templates:read0Template ids, names, sizes and variable names.
renderwolf.template.getrenderwolf:templates:read0One template's metadata.
renderwolf.screenshot.createrenderwolf:render1Capture a page or HTML as PNG, JPEG or WebP; viewport, full page, element selector, device preset. Durable job.
renderwolf.pdf.createrenderwolf:render2Render a page or HTML to PDF; paper size, landscape, backgrounds. Durable job.
renderwolf.qr.createrenderwolf:render0A QR code for text or a URL, returned inline as a data URL.
renderwolf.template.renderrenderwolf:render + renderwolf:templates:read1Render one of your templates with variables into an image. Durable job.
renderwolf.clip.createrenderwolf:renderper secondA short captioned clip (1-60 s) over a public image, video or colour. Always a durable job; a task when the client supports tasks.
renderwolf.signed_url.createrenderwolf:sign0 until fetchedA signed URL that renders when fetched, lifetime 1 second to 24 hours. Permanent links are refused through MCP even though the REST API allows them.
renderwolf.job.getthe creating scope0A job's state, cost and, once succeeded, its result metadata and a fresh download link.
renderwolf.job.cancelthe creating scope0Cooperative cancel. Queued work is refunded in full; running work is charged only if it produced a usable output.

Cached repeats are free, exactly as on the REST API, and free-plan output branding is the same whichever way you render. Every tool carries hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) and namespaced metadata naming its scope, product, credit behaviour and risk, so a client can show a person what a call will do before it does it.

Jobs, tasks and results

Every creation tool queues a durable Renderwolf job and answers at once with the same envelope, so a retry or a dropped connection never loses or duplicates work:

{
  "request_id": "01a0…",
  "job_id": "01a0…",
  "status": "queued",
  "product": "renderwolf",
  "kind": "screenshot",
  "cached": false,
  "credits": { "reserved": 1, "charged": 0 },
  "result": null,
  "created_at": "2026-08-27T23:09:45Z",
  "connection_id": "01a0…"
}

Poll renderwolf.job.get (or read the job resource). Once status is succeeded, result holds the media type, byte size, SHA-256, the moment the hosted result expires, and a download link:

  • Hosted results are kept for 24 hours after success.
  • Download links are signed and valid for 15 minutes; every read of the job or its result resource issues a fresh one.
  • Links are the default even for screenshots. PDFs, clips and full-page images are never returned inline; a screenshot under 2 MiB can be, only when a client asks for it explicitly.
  • For longer retention, download the result or use a Renderwolf job delivery destination when that ships.

Clients on revision 2026-07-28 that advertise the io.modelcontextprotocol/tasks extension receive a task handle for screenshot, PDF and template work and must use one for clips; tasks/get mirrors the job's state and tasks/cancel is a cooperative cancel. Other clients get the envelope above and poll. Both roads end at the identical terminal result.

Resources

Read-only metadata is also exposed as resource templates, for clients that prefer to attach context rather than call tools. There is no enumeration of your objects; ids come from tool results.

URIReturns
ironfang://connectionThe connection summary (as ironfang.connection.get).
ironfang://renderwolf/jobs/{job_id}The job envelope.
ironfang://renderwolf/jobs/{job_id}/resultResult metadata with a freshly signed link; marked non-cacheable.
ironfang://renderwolf/templates/{template_id}Template metadata.

Credits and budgets

There is no MCP fee. Connecting, listing tools, reading usage and reading metadata are free. Rendering spends ordinary Renderwolf credits at the ordinary rate, and failed or cancelled work follows the same refund rules as the REST API.

On top of the plan's cap, every connection has its own budget so a looping agent cannot spend a month's allowance in an afternoon:

connection budget = max(25, 10% of the plan's monthly credits)
                    capped by the organisation's remaining allowance
                    per billing period

Before chargeable work the server reserves the tool's maximum cost against the budget, then settles to what the product actually charged and releases the rest; ironfang.connection.get shows the allowance, what is reserved, what has been settled, what remains and when it resets. An exhausted budget answers mcp_budget_exhausted with the reset time; the plan cap answers the product's usual quota_exceeded.

Auditwolf tools

Not yet available. Auditwolf tools (list sites, start a bounded audit, read audits, findings and evidence links) follow the Auditwolf commercial release. They will reuse the auditwolf:* scopes and never expose integration secrets, rule editing, schedules or retention controls to a model.

Security

  • The MCP access token is addressed to https://mcp.ironfang.uk/mcp and nowhere else; products reject it, and the MCP server rejects tokens meant for the portal or a product.
  • Product calls use a separate two-minute token minted per call, limited to your granted scopes and your chosen organisation, and never a stored key.
  • Scopes are re-checked against your live organisation permissions on every call, and the connection's grant status with a fail-closed cache of at most thirty seconds.
  • Client identity is a Client ID Metadata Document fetched over HTTPS with private-network, redirect and size protections, or a rate-limited public-client registration that is retired after thirty days unused. Registrations cannot choose their own scopes.
  • Rendering tools refuse cookies, authorization and custom headers, proxies, script execution and private-network targets. Raw HTML is bounded and never logged.
  • Signed download links expire in fifteen minutes and are bound to the job's organisation.
  • There is no tool that mints keys, manages members or clients, changes plans, deletes evidence or calls an arbitrary API.
  • Per-connection and per-organisation concurrency limits, per-call cost ceilings and a per-tool kill switch bound the damage a misbehaving client can do.

Troubleshooting

Every response carries X-Ironfang-Request-ID; a request id or the connection id from ironfang.connection.get is all support needs to find a call. Quote those, never a token.

What you seeWhat it meansWhat to do
redirect_uri not registered for clientThe client's registered callback does not match the one it used. Loopback callbacks may change port, but not host or path.Update the client, or if you pre-registered it by hand, register the exact callback it sends.
the client's registration changed; start againThe client's metadata document changed between the consent page opening and you pressing Allow.Start the connection again.
"requires re-authorization (token expired)"The connection had no refresh token, or its refresh token was revoked.Authenticate again; a new connection carries a refresh token. If it keeps happening, the connection was revoked from the portal.
"protocol version is not supported"The client speaks a revision the server does not accept.Update the client. Revisions from 2025-03-26 onward are accepted.
403 with insufficient_scopeThe tool needs a scope this connection was not granted.Let the client re-authorize with the scope in the challenge; you must hold the matching permission in the organisation.
tenant_access_lostYour membership or permission in the chosen organisation was removed.Reconnect and choose an organisation you are still part of.
connection_revokedThe connection was disconnected in the portal.Connect again if that was not intended.
product_not_enabledRenderwolf is not available to this connection.Check the organisation has a Renderwolf account and you hold render; the beta may also not be enabled for the organisation yet.
budget_store_unavailableThe server cannot record spending, so it refuses chargeable work rather than run unmetered.Retry shortly; reads still work. Persisting: contact support.
mcp_budget_exhaustedThis connection's budget for the period is spent.Wait for the reset in the message, or ask an organisation administrator to raise the connection's budget (never above the plan's remaining allowance).
quota_exceededThe organisation's plan credits are spent.Upgrade or wait for the period to reset.
not_available_in_betaA capability that exists in the REST API is deliberately withheld from MCP for now.Use the REST API for it.
target_failedThe page could not be rendered (timeout, error status, blocked target).Check the URL is public and answers; the message is sanitised and never includes internal detail.
result_not_ready / result_too_large / inline_not_allowedThe job has not succeeded yet, or the output must be fetched by link.Poll again; use the download link.

Privacy

For each MCP call Ironfang records the connection id, organisation, tool name, method, outcome, latency, request size and request id. It does not record tool arguments, prompts, tool results or model output. Rendered outputs are stored as Renderwolf jobs under the organisation's ordinary retention (24 hours for hosted results) and are visible to that organisation in the portal. Consent screens and registrations are recorded as security events on the account. Disconnecting a client revokes its tokens; it does not delete the jobs the organisation already paid for.