Identity Forge
NPM · IDENTITYFORGE · SCANNED SEP 21
Design kits, brand naming, and domain research for coding agents.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to KasayoDotCom/identityforge-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 36 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability65
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 17038 tokens (~270/item across 63 items; 63 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 99% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "share_brand_project" implies "publish" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 64 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the Identity Forge MCP server?
Identity Forge runs locally as an npm package, launched with npx -y identityforge. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · identityforge
claude mcp add io-identityforge-mcp -- npx -y identityforge
{
"mcpServers": {
"io-identityforge-mcp": {
"command": "npx",
"args": [
"-y",
"identityforge"
]
}
}
} {
"servers": {
"io-identityforge-mcp": {
"command": "npx",
"args": [
"-y",
"identityforge"
]
}
}
} codex mcp add io-identityforge-mcp -- npx -y identityforge
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"io-identityforge-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"identityforge"
],
"enabled": true
}
}
} openclaw mcp add io-identityforge-mcp --command npx --arg -y --arg identityforge
mcp_servers:
io-identityforge-mcp:
command: "npx"
args: ["-y", "identityforge"] {
"McpServers": {
"io-identityforge-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"identityforge"
]
}
}
} assistant mcp add io-identityforge-mcp -t stdio -c npx -a -y identityforge
{
"mcpServers": {
"io-identityforge-mcp": {
"command": "npx",
"args": [
"-y",
"identityforge"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 +1
- Stability: 0.97 → pass security
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 −3
- Stability: pass → 0.80 functional
- 14 Sept 26 +1
- Stability: fail → pass ▲ security
- 9 Sept 26 +1
- Package version: 0.4.0 → 0.4.6 functional
- 6 Sept 26 −1
No change was recorded against any check on this day. Stability & Change Management went from 98 to 85.
- 3 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 92 to 95.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/identityforge@0.4.6
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | KasayoDotCom/identityforge-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/KasayoDotCom/identityforge-mcp/.github/workflows/publish-cli.yml@refs/heads/main |
| Rekor log index | 2479934691 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:bcfdf1d52648a7c9a742c11b7584808acef41d7439a7725b608460787e982f73fc5e69a456cabfdb2cdf3dcc8e0c8f3b16fd12f77761da1710b6d8d85 |
Background: How many MCP packages publish verified provenance →
Dependencies 96 packages
| Packages resolved | 96 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_brand_layer Compose a layer onto a brand ~409
Put one catalogue record onto a brand project alongside its design kit, so the choice is stored on the user's brand rather than living in this conversation. One tool for all three axes: pass `axis` to say which. The layers belong to the PROJECT and not to the kit, so swapping the kit later leaves them alone — that independence is the whole point of composing axes separately. The pin records the revision the record is at right now, which is what lets get_brand_layers later report that it moved instead of silently applying someone else's edit to the user's brand. `recordId` is the record's permanent id from list_image_directions, list_interface_styles or list_page_recipes, never a slug: slugs are mutable handles and a pin keyed on one could come to mean a different record. imageDirection and interfaceStyle hold ONE each, so composing a second is refused with 409 unless you pass `replace: true` — which is also how you accept a drifted revision after the user has seen what changed. Page recipes are a list and simply accumulate. A Pro record on a key without Pro is refused with 403 and an upgrade path; that is not a conflict and replace will not help. This overwrites live brand state without asking and mints a version recording that your key did it. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| axis | string | yes | Which axis this record belongs to. imageDirection and interfaceStyle hold one each; pageRecipe holds any number. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
| recordId | string | yes | The record's permanent id (the `id` field), not its slug. From list_image_directions, list_interface_styles or list_page_recipes. |
| replace | boolean | – | Replace what is already on a single-value axis, or accept a revision that has drifted. Ignored for pageRecipe, which is a list. Default false, so a clash is reported rather than overwritten. |
No output schema declared.
No examples provided.
add_brand_variation Add a brand variation ~221
Attach one brand proposal to a project: a kit plus an optional brand name, domain, label, and notes. Call it four or five times per project with deliberately contrasting kits, because a client choosing between similar directions cannot tell you much. The kit must be one you can resolve, meaning your own, a catalog kit, or another user's public kit, and a Pro catalog kit needs an entitled key. Variations become visible to the client only once you call share_brand_project. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| brandName | string | – | Proposed brand name to display with this direction. |
| domain | string | – | Proposed domain to display, e.g. 'example.com'. |
| kitSlug | string | yes | Slug of the kit this proposal shows. |
| label | string | – | Short label the client sees, e.g. 'Bold direction'. Helps them talk about the options. |
| notes | string | – | Rationale for this direction, shown alongside it. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
add_name_candidates Persist externally researched name candidates ~143
Persist 1-50 names your own agent, another model, or manual research produced onto the durable project board, so a shortlist never lives only in the chat transcript. This is the free counterpart to generate_names: it stores names rather than authoring them, and spends no AI credits. Each item needs a caller-generated UUID, which makes retries safe. Sending identical data again returns the same row; reusing an id with changed data returns a conflict instead of silently overwriting. Requires the naming:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| candidates | array | yes | 1-50 candidates to persist. |
| projectId | string | yes | Owned naming project id from list_naming_projects. |
No output schema declared.
No examples provided.
apply_theme Apply a theme to the current project ~652
Write a design kit into a project on disk: DESIGN.md, a tokens file named for the chosen format, and identityforge.json, a stamp recording the applied kit and a hash of every file written. This is the only tool here that touches the filesystem. It reads the stamp before writing, so it can tell its own output from the user's work. A file that already exists but is not recorded in the stamp, or one whose content changed since it was written, is a CONFLICT: by default the tool then writes NOTHING, names every conflicting file, and returns an error, so a hand-written DESIGN.md survives. Files whose content already matches the kit are left untouched. Set preview to plan without writing anything at all, and force to overwrite conflicting files, which destroys their current content permanently with no recovery path. Everything is computed before the first write, so a failed fetch cannot half-apply. Call it once the user has settled on a kit; get_design_md and get_tokens inspect a kit without writing. The stamp also records the kit's permanent id and its version as the export reported them, which is what a later apply diffs against: re-applying tells you whether the kit itself moved to a new version, or whether only the rendered file changed. A version of null means the export did not report one, and must never be read as version 0. Free kits are public, and a Pro kit returns 403 unless the key is entitled.
| Name | Type | Req | Description |
|---|---|---|---|
| dir | string | – | Target directory to write into, absolute or relative to the server's working directory. Default: the MCP server's working directory. The stamp identityforge.json is written at its root. |
| force | boolean | – | Apply despite conflicts. Default false. DESTRUCTIVE: it overwrites files this tool did not write or that were edited after it wrote them, their current content is gone permanently, and the result nam… |
| preview | boolean | – | Dry run. Default false. When true nothing is written at all, not even the stamp, and the result is the plan: which files would be created, which overwritten, which are already identical, and which co… |
| slug | string | yes | Permanent id or slug of the kit to apply, from list_themes / search_themes. Prefer the id: it never moves, while a slug can be renamed and a retired slug keeps resolving through an alias. |
| tokensEntry | string | – | Advisory note for the stamp: the project-relative path where the tokens file gets wired in, e.g. 'src/app/globals.css'. Recorded for the next agent, nothing is written to it. Carried forward from the… |
| tokensFormat | string | – | Token file format to write: dtcg (W3C JSON) | css (variables) | tailwind-v3 (config) | tailwind-v4 (@theme) | shadcn-registry. Default dtcg. Match it to the project's styling layer. |
No output schema declared.
No examples provided.
assess_domain_acquisition Assess domain acquisition paths ~188
Assess up to 20 domains for a stated acquisition intent: new registration, an aftermarket listing, or either. New-registration evidence comes only from the registrar result. Aftermarket evidence comes from a bounded, SSRF-protected public landing-page probe and reports literal sale, marketplace, reserved-page, and visible-price signals without validating a seller or guaranteeing purchase. Basic research costs one monthly unit per unique domain, aftermarket evidence adds one, and optional SERP adds one. A successful exact repeat within ten minutes is charged zero units and says so in meta.billing. Requires naming:read.
| Name | Type | Req | Description |
|---|---|---|---|
| domains | array | yes | 1-20 bare domains including the TLD. |
| includeSerp | boolean | – | Default false. Adds market-collision search evidence. |
| intent | string | yes | The acquisition path the user actually wants. |
| language | string | – | – |
| market | string | – | – |
No output schema declared.
No examples provided.
check_applied_theme Has the applied kit moved since this repo was built? ~330
Read the identityforge.json stamp in a project on disk and report what has moved since apply_theme wrote it. Takes no kit and no version: the stamp holds both, which is what makes this the tool to reach for when returning to a project rather than reconstructing the arguments for diff_kit_versions by hand. It reports THREE independent movements and never conflates them. kitMoved: the server's own version count differs, so the design itself changed and the brief is worth re-reading. documentMoved: the rendered DESIGN.md bytes differ, which a serializer change alone does to every kit at once and is not by itself a reason to touch code. contractMoved: designMdContract differs, so the document's SHAPE changed and a section was added, renamed or removed. Each is null rather than false when one side cannot answer, with a note saying which. When the kit did move and both versions are numbers, the diff_kit_versions result is included, so one call answers both what moved and how. It also hashes every artifact the stamp recorded against what is on disk, so a DESIGN.md edited by hand shows as modified before anything overwrites it. Read-only: it writes nothing and touches no file, so it is safe to call at the start of any session. Losing a key or hitting a Pro gate degrades it to a local-only report with a note rather than failing.
| Name | Type | Req | Description |
|---|---|---|---|
| dir | string | – | Project directory holding identityforge.json, absolute or relative to the server's working directory. Default: the MCP server's working directory. Same meaning as apply_theme's dir. |
No output schema declared.
No examples provided.
check_domains Check domain evidence ~214
Check up to 20 bare domains and return separate RDAP, DNS, Cloudflare Registrar, and optional self-hosted SERP evidence. Basic research spends one account-wide monthly API unit per unique domain; SERP adds one more. Results are a snapshot and reserve nothing. Use search_name_evidence for broader name research. Requires naming:read.
| Name | Type | Req | Description |
|---|---|---|---|
| acquisitionIntent | string | – | Default new_registration. Aftermarket/either also runs a bounded public landing-page probe. Prefer assess_domain_acquisition for this goal-level question. |
| domains | array | yes | 1-20 bare domains including the TLD, e.g. 'example.com'. No scheme or path. |
| includeRegistrar | boolean | – | Default true. Disable only when registrar checks are not needed. |
| includeSerp | boolean | – | Default false. Enable for finalist collision research. |
| language | string | – | Search language tag, e.g. de-DE. |
| market | string | – | Market context for SERP results, e.g. Germany heating retail. |
No output schema declared.
No examples provided.
create_brand_project Create a brand project ~136
Create the container that holds brand variations and the client share link. Do this once per client brief, then attach several directions with add_brand_variation and send the client a link with share_brand_project. Creating a project on its own shows the client nothing, so it is only the first of those three steps. Call list_brand_projects first to avoid making a second project for a client who already has one. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| brief | string | – | What is being built: audience, market, and the character the brand should have. |
| name | string | yes | Project name, usually the client or the product. |
No output schema declared.
No examples provided.
create_naming_project Create a naming project ~179
Create one durable, project-owned naming board and return its id. Do this ONCE per real naming brief, never once per generation run: every other naming tool takes the resulting projectId, and the board persists the candidate kanban, research evidence, and generation ledger across sessions so the shortlist never lives only in chat. Call list_naming_projects first and reuse an existing board rather than creating a near-duplicate. Write the real brief into `description`, because generation quality depends on it. Requires the naming:write scope; creating a board spends no AI credits.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Product, audience, market, constraints, and desired character. |
| name | string | yes | Human-readable project name, e.g. the product or client. |
| selectedTlds | array | – | TLDs to research, default com/io/co. |
No output schema declared.
No examples provided.
create_theme Create a design kit (theme) ~260
Author a new design kit, either from scratch by passing a `kit` JSON or by forking a published catalog kit with `base` and applying `overrides` for tokens, colors, fonts, and facet presets. Use `base` whenever a catalog kit is close to what you want, since a fork inherits a complete, coherent system and you only state the differences. Authoring from scratch means supplying the whole thing. The result is always PRIVATE and visible only to your key until you publish it from the web Studio; this tool cannot publish. Forking a Pro catalog kit needs an entitled key. Use remix_theme instead when you want several quick variations off one direction. Requires the kits:write scope, so regenerate your key with `identityforge login` if you get a 403 naming it.
| Name | Type | Req | Description |
|---|---|---|---|
| base | string | – | Catalog slug to fork (omit to author from `kit`). |
| kit | object | – | A kit JSON to author from scratch (merged over a renderable skeleton). Omit when `base` is set. |
| name | string | yes | Display name for the new kit. |
| overrides | object | – | Mix-and-match overrides applied on top of the base kit. Structure-level composition is not available via the API. |
No output schema declared.
No examples provided.
delete_theme Delete a saved design kit ~106
Permanently delete one of your saved design kits. This cannot be undone, so pass `confirm: true` only after you are sure. A kit referenced by a brand project is refused with 409 `kit_in_use`; retire or repoint those references before trying again. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be exactly true. Required because deletion is permanent. |
| slug | string | yes | Permanent id or slug of a kit saved under your own key. |
No output schema declared.
No examples provided.
diff_brand_project_versions Diff two brand project versions ~144
What changed between two versions of a brand project. Pass `from` alone to compare against the current version. Owner-scoped, so nothing is redacted: you are reading your own brand. Variation edits appear here as `variations.<id>.<field>` rather than as a wholesale swap, because a variation is identified by id and can be followed across a reorder. Needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| from | integer | yes | Required lower bound. Use 0 for the first recorded state. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
| to | integer | – | Upper bound. Omit to compare against the project's current version. |
No output schema declared.
No examples provided.
diff_kit_versions Diff two kit versions ~289
What changed between two versions of a kit: a list of paths with the old and new value, the CSS custom property a token change drives, and a mechanical summary. This is the tool for taking a brand change into a codebase, because it tells you the handful of things to update rather than making you re-read a whole DESIGN.md. Pass `from` alone to compare against the current version, which is the usual question: `from` is the version your repo recorded in identityforge.json. Pass both to pin a range. It reports what moved and does not judge how big the change is; whether a token shift matters to your UI is your call, not a number we invent. For a Pro kit you are not entitled to, every change comes back with `redacted: true` carrying the path, kind and CSS variable but no before or after, and `redactedChanges` counts them, so you can still see the shape of the change and know exactly what is withheld. Needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| from | integer | yes | Required lower bound, usually the version in identityforge.json. Use 0 for the first recorded state. |
| slug | string | yes | Permanent kit id or slug. |
| to | integer | – | Upper bound. Omit to compare against the kit's current version, which is what you want when asking whether it moved since you built. |
No output schema declared.
No examples provided.
export_brand Get the whole brand as one document ~328
The brand as ONE document, ready to build from: its design kit's DESIGN.md with every catalogue layer the user pinned written into it. Use this instead of assembling get_design_md plus get_image_direction plus get_interface_style plus get_page_recipe yourself, because merging those four is the part you cannot do correctly — when an interface style asks for translucent panels and the kit specifies flat opaque cards, only we know which wins. The rule is stated in the document itself: the kit owns IDENTITY (its colour tokens, typefaces, spacing and motifs, which nothing below overrides) and a layer owns APPLICATION (what a panel is made of, how a photograph is treated, how a page orders its argument). Follow it rather than re-deciding it, and where a layer would need a kit token changed, keep the token and say so. A brand with nothing pinned returns its kit's DESIGN.md unchanged, which is the honest answer and not an error. A layer this key cannot open is NAMED with its judgment page and an upgrade path, and only its implementation is withheld: build what the kit and the present layers give you and do not invent the missing one, because a guessed implementation looks finished and is not. A brand that has not chosen a kit answers 409 — there is no design system yet, and the placeholder the workspace shows is nobody's choice. Owner-scoped, so the key must own the project; read-only, mints no version, writes nothing. Requires the kits:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
generate_mockups Generate brand mockups ~127
Queue photographic mockups for selected variations and template scenes. This spends one AI credit for every variation and scene combination after the server resolves the selected kits; failed enqueue attempts are refunded. The response contains the job id and polling URL. Requires kits:write.
| Name | Type | Req | Description |
|---|---|---|---|
| idempotencyKey | string | – | Stable key for a retry that must not spend credits twice. |
| items | array | yes | Template and scene pairs to render for every variation. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
| variationIds | array | yes | Variation ids from get_brand_project. |
No output schema declared.
No examples provided.
generate_names Generate and persist brand names ~308
Generate brand names with Identity Forge's own operator-owned model and persist them to the project board's `generated` column with full model, prompt-version, and credit provenance. SPENDS the key owner's AI credits, one per uniquely persisted name, charged only after the rows commit, so a failed run costs nothing. Always pass a stable idempotencyKey so a retry after a timeout cannot bill twice. Use it when you want Identity Forge to author the names; if your own agent or an offline process produced them, use add_name_candidates instead, which is free. Requires the naming:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | How many names to generate, 1-30. Each uniquely persisted name spends one AI credit. |
| description | string | yes | The specific brief for this run: product, audience, market, and desired character. Output quality tracks this directly, so do not pass a bare product name. |
| frequencyPenalty | number | – | Model frequency penalty, -2 to 2. Raise it when a previous run returned repetitive stems. |
| idempotencyKey | string | – | Stable unique key for this exact request. Reusing it returns the original result instead of generating and charging again. Always set it. |
| projectId | string | yes | Owned naming project id from list_naming_projects. |
| recipeIds | array | yes | 1-8 recipe ids returned by list_naming_recipes. |
| styleOptions | object | – | Optional constraints on the shape of generated names. |
No output schema declared.
No examples provided.
get_brand_layers Read a brand's composition ~289
What a brand project is composed of on top of its design kit: its image direction, its interface style, and its page recipes. Read this BEFORE changing any of them, because it is the only place that tells you what the user already chose and whether it still says what it said. Every reference resolves to the revision the catalogue serves now and carries both numbers — `revision` is current, `chosenRevision` is what the project pinned — and `drift` appears only when they differ, carrying the author's note for what moved. `meta.drifted` counts them, so a brand with nothing to report answers 0 and you can stop. A record withdrawn from the catalogue since it was pinned comes back with `resolved: false` rather than vanishing, because a brand must not quietly forget what it points at, and a Pro layer this key cannot open still returns its name, tier and revision with `locked: true`. `links.preview` is that exact composition rendered as an image, which is the one thing you can put in front of a person who is not going to read a JSON object. Reading changes nothing: it mints no version and never moves a pin, so accepting a drifted revision stays a decision the user makes through add_brand_layer. Requires the kits:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
get_brand_project Read one brand project ~195
Read one board in full: every variation with its kit, brand name, domain, label and notes, plus the state of the client share and a URL for each direction. list_brand_projects gives you summaries and a variation COUNT; this is how you see what is actually on the board. Use it to check your own work after attaching variations, to answer 'what did we send them' without keeping notes of your own, and to read the share state before you change it — whether a link exists, whether it is still serving, whether it has a password, and how many times the client opened it. A project that is not yours, and an id that could never be one, both answer 404 alike, so this cannot be used to find out what exists for somebody else. Read-only and free. Requires the kits:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
get_brand_project_version Read one stored brand project version ~95
The full snapshot a given version of a brand project recorded. Owner-scoped, like the rest of the brand-project surface. A brand snapshot references its kit rather than embedding it, so this never hands back a Pro kit's tokens by another door. Needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
| version | integer | yes | Version number from list_brand_project_versions. |
No output schema declared.
No examples provided.
get_design_md Get DESIGN.md for a theme ~185
Fetch the complete DESIGN.md brief for one design kit (theme) by slug: the palette in prose, typography, layout and surface rules, elevation and shape, distinctive motifs, iconography, imagery direction, and explicit do's and don'ts. This is the document you design from. Read it before implementing a kit, or when the user wants to review a direction before committing to it. Read-only: it returns the text and writes nothing to disk (apply_theme is the tool that writes it into a project). Free kits are public; a Pro kit returns 403 with an upgrade path unless the key is entitled, without leaking the brief.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Permanent id or slug of the kit, from list_themes / search_themes. Prefer the id: it never moves, while a slug can be renamed and a retired slug keeps resolving through an alias. |
No output schema declared.
No examples provided.
get_image_direction Get an image direction ~259
Retrieve one image direction's full implementation export, as Markdown for reading and briefing or JSON for programmatic use. Follow it when generating, sourcing, or art-directing imagery, and adapt it into the project's repeatable production brief. For an existing product or other supplied subject, use its approved image as the identity source in a reference-preserving editor, apply the direction to the presentation around it, and compare every result with the source at full resolution. If the current agent cannot perform reference-led image editing, save or hand off the source plus this export instead of substituting text-to-image generation. This pairs with the design kit rather than replacing any of it. Read-only: it returns the text and writes nothing to disk. Free records are public; a Pro record returns 403 with an upgrade path unless the key is entitled, without leaking the payload.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Export representation: markdown (default) or json. |
| slug | string | yes | Opaque id or slug of the record, from list_image_directions. Either addresses it directly. The id never changes; the slug is an editorial handle that can be renamed, and unlike a kit slug it has no a… |
No output schema declared.
No examples provided.
get_interface_style Get an interface style ~185
Retrieve one interface style's full implementation export, as Markdown for reading or JSON for programmatic use. The export holds render-grammar rules only, so combine it with a design kit's tokens, typography, motifs, and brand rules; on its own it will not give the UI an identity. Read-only: it returns the text and writes nothing to disk. Free records are public; a Pro record returns 403 with an upgrade path unless the key is entitled, without leaking the payload.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Export representation: markdown (default) or json. |
| slug | string | yes | Opaque id or slug of the record, from list_interface_styles. Either addresses it directly. The id never changes; the slug is an editorial handle that can be renamed, and unlike a kit slug it has no a… |
No output schema declared.
No examples provided.
get_kit_history_event Read the kit as it stood at one history entry ~177
The full kit recorded at one line of the ledger, which is what makes the timeline useful rather than decorative: with it you can diff a past state against the current kit, or PATCH the payload back through update_theme to restore it. The response is a whole design kit, so it is large — call list_kit_history first and fetch only the entry you want. Knowing an event id is never sufficient on its own: the event must be yours AND on a kit you still own, and either test failing answers 404 identically, so a 404 here does not tell you which of the two it was. Needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| eventId | string | yes | Entry id from list_kit_history, not a version number. |
| slug | string | yes | Permanent kit id or slug of a kit you own. |
No output schema declared.
No examples provided.
get_kit_version Read one stored kit version ~185
The full snapshot a given version recorded, as it was at that moment. Reach for this when you need the old values themselves, for example to see what a token was before an edit replaced it; diff_kit_versions is the cheaper answer when you only need to know what moved. The response is a whole design kit, so it is large. A version number is permanent: version 3 is version 3 forever. This returns the entire payload, so it is gated exactly like an export, and a Pro kit without an entitled key answers 403 rather than a redacted body. Needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Permanent kit id or slug. |
| version | integer | yes | Version number from list_kit_versions. Positive integer; version 0 is never a stored row, it is the marker for a kit that has never been versioned. |
No output schema declared.
No examples provided.
get_mockup_job Get a brand mockup job ~73
Poll one mockup job in its project for status, completed count, errors, and result URLs. Read-only. Requires kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | Job id from generate_mockups or list_mockup_jobs. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
get_naming_research_context Prepare a naming research handoff ~138
Load everything you need to plan naming research in one call: the project brief, up to 100 candidates with the evidence already attached to them, which factual checks are available, workflow guidance, and a template for handing bounded questions to sub-tasks. Call it before orchestrating substantial research so you do not re-run checks that already exist on the board. It deliberately does not rank candidates, score them, or tell you which model to delegate to, because that judgement stays with you. Read-only and free. Requires the naming:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned naming project id from list_naming_projects. |
No output schema declared.
No examples provided.
get_page_recipe Get a page recipe ~177
Retrieve one page recipe's full implementation export, as Markdown for reading or JSON for programmatic use. This is what you build the page's structure and argument from, and it pairs with a design kit, which still supplies the visual and interaction rules. Read-only: it returns the text and writes nothing to disk. Free records are public; a Pro record returns 403 with an upgrade path unless the key is entitled, without leaking the payload.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Export representation: markdown (default) or json. |
| slug | string | yes | Opaque id or slug of the record, from list_page_recipes. Either addresses it directly. The id never changes; the slug is an editorial handle that can be renamed, and unlike a kit slug it has no alias… |
No output schema declared.
No examples provided.
get_project_context Read a project's stored context ~132
What this brand project's product actually is: what it does, who it is for, what the design must respect, what has already been ruled out, which screens it has, and what it is built on. Read it before proposing anything for an existing project, and read it before set_project_context, because that call replaces rather than merges. A project that exists but has no context yet answers null, which is a different fact from a project that does not exist; that one is a 404. Free, needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
get_tokens Get design tokens for a theme ~241
Fetch one design kit's machine-readable tokens in the format that matches the target stack. It covers all 28 semantic color roles in both light and dark, plus typography and spacing. Use it to wire a kit into an existing styling layer when you do not need the written brief; pair it with get_design_md when you also need the rules. Read-only: it returns the file contents as text and writes nothing to disk. apply_theme writes tokens and DESIGN.md into a project in one step. Free kits are public; a Pro kit returns 403 unless the key is entitled.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Token format, default dtcg: dtcg (W3C design-token JSON) | css (custom properties on :root and .dark) | tailwind-v3 (config object) | tailwind-v4 (@theme block) | shadcn-registry (registry item) | js… |
| slug | string | yes | Permanent id or slug of the kit, from list_themes / search_themes. Prefer the id: it never moves, while a slug can be renamed and a retired slug keeps resolving through an alias. |
No output schema declared.
No examples provided.
list_brand_project_versions List a brand project's versions ~185
The brand project's history, newest first: what changed, when, and by whom. Owner-scoped, so a project you do not own answers 404 exactly as a missing one does, and there is no tier gate. The timeline records the whole brand: its name and domain, its fonts, its pinned layers, its project context, and its variations, including a reorder. Sharing is deliberately absent, because who may see a brand is not what the brand is. An empty timeline means the project has not been written since versioning was wired, not that nothing has happened to it. Free to call, needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| before | integer | – | Return versions BELOW this number, for paging. |
| limit | integer | – | Rows per page, newest first. Default 50. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
list_brand_projects List brand projects ~102
List every brand project owned by the connected key, each with its name, brief, variation count, and whether a client share link already exists. Start here to find a projectId before add_brand_variation or share_brand_project, and to check whether a board for this client already exists instead of creating a duplicate. Read-only and free: it takes no arguments, returns all projects at once (no pagination), and changes nothing. Requires the kits:read scope.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_client_comments Read client feedback ~153
Read what the client wrote on a project's variations through the share link, oldest first, with the variation each comment is attached to and the author's display name. This is the return leg of the share loop: without it you can build a brand project, attach directions and send the link, but never learn what the client actually said about them. Call it before revising, then act on it with update_brand_variation, update_theme, or remove_brand_variation. Anonymous commenters appear as 'Guest' rather than an id, and deleted comments are omitted. Read-only, changes nothing, takes no pagination. Requires the kits:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
list_image_directions List image directions ~273
Browse reusable image directions for how a project's photography and illustration should be presented and repeated. Use one when a kit is chosen but the imagery still has no direction, which is where most agent-built pages fall back to stock-looking filler. If the user supplied a product, person, or object, its approved image is fixed input: shortlist suitable foundations, then use a reference-preserving image editor to change the setting, supporting elements, composition, light, surfaces, crop, and finish around that same reference. Never recreate an existing product from text or place its cutout over a separately generated background. Returns judgment summaries with no export payload, so pick a slug and call get_image_direction for the implementable version. A direction sits alongside the design kit and never replaces it; the kit still owns color, type, and brand rules. Read-only and free, and Pro records appear in the list without exposing their contents.
| Name | Type | Req | Description |
|---|---|---|---|
| family | array | – | One or more image-process families. |
| q | string | – | Search names, aliases, visual signals, fit, and agent tags. |
| sort | string | – | Curated order, alphabetical order, or Free records first. |
| tier | array | – | Show Free records, Pro records, or both. |
| use | string | – | The website job the image must perform. |
No output schema declared.
No examples provided.
list_interface_styles List interface styles ~221
Browse interface styles, which decide how surfaces and hierarchy render: how panels stack, how density and depth read, how structure is expressed. A style is a neutral render grammar you apply through a design kit, not a second source of palettes, fonts, or brand rules, so it answers how the UI is built rather than what it looks like. Use one when the kit is settled but the layout still defaults to generic cards on a grid. Returns judgment summaries with no export payload; pick a slug and call get_interface_style for the implementable version. Read-only and free, and Pro records appear in the list without exposing their contents.
| Name | Type | Req | Description |
|---|---|---|---|
| family | array | – | One or more interface render-grammar families. |
| q | string | – | Search names, aliases, visual signals, fit, and agent tags. |
| sort | string | – | Curated order, alphabetical order, or Free records first. |
| tier | array | – | Show Free records, Pro records, or both. |
| use | string | – | The product/use-case lane the interface must support. |
No output schema declared.
No examples provided.
list_kit_history List a kit's history ledger ~295
Everything that has happened to one of your saved kits, newest first: its creation, every save, and every time it was applied to a brand. Wider than list_kit_versions, which only sees the events that minted a version — an apply-to-brand event appears here and nowhere else, so this is the tool that answers whether a kit was ever actually used rather than merely edited. Each row carries an event id; pass it to get_kit_history_event for the full kit as it stood at that moment. Metadata only, so no tokens come back here. Only kits saved under an API key have a ledger: a curated catalog kit is shipped rather than edited, and asking for one answers 404 rather than an empty list, because you do not own it. Paged by an OPAQUE cursor, not by a number — hand meta.nextCursor back unchanged rather than constructing one, and a cursor this endpoint did not issue is rejected rather than silently restarting from the top. Free to call, needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Next page. meta.nextCursor from the previous response, passed back byte for byte. Opaque: it is not a number, a date or an id you can build. |
| limit | integer | – | Rows per page, newest first. Default 20, max 50. |
| slug | string | yes | Permanent kit id or slug of a kit you own. |
No output schema declared.
No examples provided.
list_kit_versions List a kit's versions ~202
The kit's VERSION timeline, newest first: which version, when, by whom, and the author's note. Use it to ask whether a repo's applied kit has moved. Saved kits and managed catalog kits accumulate versions; static catalog fallbacks remain at version 0 until they are promoted into the managed catalog. This is not the wider usage ledger: applying an owned kit to a brand appears in list_kit_history, not here. Metadata only; get_kit_version returns a snapshot and diff_kit_versions returns changed fields. For an unentitled Pro kit, rows remain visible but author labels are withheld. Paginated through meta.nextBefore. Needs kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| before | integer | – | Return versions BELOW this number. Pass meta.nextBefore from the previous page. |
| limit | integer | – | Rows per page, newest first. Default 50. |
| slug | string | yes | Permanent kit id or slug, the same as any other read. |
No output schema declared.
No examples provided.
list_mockup_jobs List brand mockup jobs ~56
List one brand project's mockup jobs newest first, including status, progress, errors, and completed result URLs. Read-only. Requires kits:read.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned brand project id from list_brand_projects. |
No output schema declared.
No examples provided.
list_name_candidates Read a naming kanban board ~160
Read one project's candidate kanban. Returns each persisted name with its status, rank, notes, attached research evidence, originating recipe, generation provenance, and an updatedAt timestamp you pass back to move_name_candidates or rank_name_candidates to guard against stale writes. Filter by status to review a single column, such as just the shortlisted or finalist names. Read-only, paginated, and free. Requires the naming:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Page size, 1-100. |
| offset | integer | – | Start index for paging, default 0. |
| projectId | string | yes | Owned naming project id from list_naming_projects. |
| statuses | array | – | Return only these kanban columns. Omit for the whole board. |
No output schema declared.
No examples provided.
list_name_generations Read naming generation provenance ~149
Read the generation ledger for one project: every generate_names run with its request fingerprint, recipes and settings, model, prompt version, how many names it produced, how many credits it reserved and actually consumed, final status, and timestamps. Use it to answer where a given set of names came from, or to check whether a run that appeared to fail actually charged anything before retrying. Read-only, paginated, and free. Requires the naming:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Page size, 1-100. |
| offset | integer | – | Start index for paging, default 0. |
| projectId | string | yes | Owned naming project id from list_naming_projects. |
No output schema declared.
No examples provided.
list_naming_projects List naming projects ~119
List the persistent naming boards owned by the connected key, with each project's id, name, brief, researched TLDs, chosen name, and candidate counts. Start here to recover the projectId for an existing brief, since every other naming tool needs one, and only call create_naming_project when nothing here fits. Read-only, paginated, and free. Requires the naming:read scope.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Page size, 1-100. |
| offset | integer | – | Start index for paging, default 0. |
No output schema declared.
No examples provided.
list_naming_recipes Discover naming recipes ~91
List every public naming strategy Identity Forge can generate from, with each recipe's id, intent, generation instruction, and settings. Call it before generate_names so you pick 1-8 recipe ids that genuinely fit the brief instead of guessing at strategy names. Recipe ids are stable, so you can skip this once you already know the ones you want. Read-only, free, and needs no arguments.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_page_recipes List page recipes ~244
Browse page recipes, which decide how a page argues its case: what it leads with, in what order it earns belief, and what the reader should walk away knowing. Use one when you know what a page must achieve but not how to sequence it, which is the gap that produces hero-features-pricing pages by default. Returns judgment summaries with no export payload; pick a slug and call get_page_recipe for the implementable version. Each record carries a model field: most are legacy-sequence, which prescribes a section order, while communication-idea records state the argument and leave the sequencing to you. Read the model before following a record, since the two ask different things of you. This covers structure and argument, not visuals; the design kit still owns those. Read-only and free.
| Name | Type | Req | Description |
|---|---|---|---|
| goal | string | – | The communication job the page must perform. |
| q | string | – | Search names, codes, audience, communication ideas, examples, legacy sections, and agent tags. |
| sort | string | – | Curated order, alphabetical order, or Free records first. |
| tier | array | – | Show Free records, Pro records, or both. |
No output schema declared.
No examples provided.
list_themes List design themes ~464
Browse the published catalog as compact summaries: slug, name, summary, tags, audience, a font and palette glimpse, tier, and computed discovery facets covering use-case fitness from 0 to 100, moods, and industries. This is the main entry point for finding a design kit. `use` narrows every lane to kits whose authored audience or bestFor names that product use, then ranks the eligible kits by measured fit. Visual tags help search but never establish product fit. `q` runs a synonym-aware ranked search that understands phrases like 'calm fintech dashboard'. Results are paginated and report the total plus the next offset, so page rather than assuming the first response is the whole catalog. Summaries carry no tokens, no DESIGN.md, and no font files; pull one kit with get_design_md or get_tokens, or apply_theme to write it into the project. Prefer search_themes when the brief is too subtle for one lane and you want to weigh the entire catalog yourself. Read-only and free, and it lists Pro kits without exposing their contents.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Page size (1-50, default 12). |
| offset | integer | – | Start index for paging (default 0). |
| q | string | – | Ranked discovery search that understands moods, industries, and use cases via synonyms (e.g. 'calm fintech dashboard'). |
| sort | string | – | Order: featured (default, curated) | popular (most saved+installed) | recent | name | fit (computed use-case fitness; needs use=). |
| use | string | – | Choose the product use case. Every lane first requires authored intent in the kit's audience or bestFor, then ranks eligible kits by measured fit. Visual tags do not establish product fit. The score… |
No output schema declared.
No examples provided.
match_palette Match themes to brand colors ~181
Rank published kits by how close their palette sits to colors the user already owns, using perceptual color distance rather than string matching. Use it when a brand has existing colors that the design system has to live with, such as an established logo. This ranks on color alone and ignores mood, audience, and use case, so treat the result as a shortlist and check the rest of the fit with get_design_md before committing. When the user has no fixed colors, list_themes or search_themes will serve them better. Read-only and free.
| Name | Type | Req | Description |
|---|---|---|---|
| colors | array | yes | One or more brand colors as CSS strings, hex, oklch, or rgb, e.g. ['#0A84FF', '#1C1C1E']. |
| limit | integer | – | How many to return, 1-10, default 4. |
No output schema declared.
No examples provided.
move_name_candidates Move or annotate naming candidates ~182
Progress up to 100 candidates through the kanban in one atomic write, and optionally replace their notes or merge top-level evidence keys at the same time. Existing evidence from other sources is preserved unless the same key is supplied. Columns run generated, reviewing, shortlisted, finalist, selected, and rejected. This is the tool for recording a decision and why you made it; rank_name_candidates only reorders and leaves status alone. A project can hold exactly one selected candidate, and selecting one also sets the project's chosen brand name, so treat that move as the final call. Pass expectedUpdatedAt from list_name_candidates to reject a write when the row changed underneath you. Requires the naming:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| operations | array | yes | 1-100 operations, applied atomically. |
| projectId | string | yes | Owned naming project id from list_naming_projects. |
No output schema declared.
No examples provided.
rank_name_candidates Rank naming candidates ~151
Assign explicit user-facing priority ranks to up to 100 candidates on one naming board in a single atomic write, so every ranking applies or none does. Rank 1 is the highest priority and ties are allowed. This changes ONLY the rank field: kanban status, notes, and evidence are left untouched, so use move_name_candidates when you want to progress a candidate or record a decision. Use it to express a deliberate shortlist order for the user, not to record research. Requires the naming:write scope; it spends no AI credits.
| Name | Type | Req | Description |
|---|---|---|---|
| projectId | string | yes | Owned naming project id from list_naming_projects. |
| rankings | array | yes | 1-100 ranking operations, applied atomically. |
No output schema declared.
No examples provided.
recommend_kits Recommend kits for a project ~249
Kit candidates for a specific product, grounded in the context stored on its project rather than in a description you re-send. Each candidate comes back with the kit's own case for itself — what it is for, its motifs, its do's and don'ts, its moods and industries, and its computed fitness for the surfaces this product actually has — so you can rank them yourself. With a Pro account and a kits:write key you also get a model-authored ranking with a reason per candidate written against this product; meta.depth says which you got, `ranked` or `candidates`, and meta.order says plainly that the free ordering is computed lane fitness and not a recommendation. Two things that differ from the rest of discovery: this costs 3 quota units where list_themes and search_themes cost 1, and it requires an API key where every other discovery route works anonymously. Call set_project_context first: a project with no stored context returns 400 rather than guessing. Creates nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many candidates to return. |
| projectId | string | yes | Owned brand project id whose stored context grounds the proposal. Write it with set_project_context first. |
No output schema declared.
No examples provided.
remix_theme Remix a design kit ~224
Copy an existing kit into a new private kit with `overrides` applied. The source can be your own kit, a catalog kit, or another user's public kit. This is the fast path when you want three or four variations on one direction: call it repeatedly against the same source with different overrides. The original is never modified. Reach for create_theme instead when you are authoring a kit rather than varying one. A Pro-tier source needs an entitled key, and the copy is private until you publish it from the web Studio. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Name for the copy. Defaults to the source name with a variation suffix. |
| overrides | object | yes | Mix-and-match overrides applied on top of the base kit. Structure-level composition is not available via the API. |
| slug | string | yes | Permanent id or slug of the kit to copy: your own, a catalog kit, or a public user kit. Prefer the id: it never moves, while a slug can be renamed and a retired slug keeps resolving through an alias. |
No output schema declared.
No examples provided.
remove_brand_layer Take a layer off a brand ~232
Remove one composed record from a brand project. The brand keeps its design kit and every other axis; only this reference goes. Name the record rather than just the axis, so a stale view of the brand cannot clear a layer it never saw — pass the id you read from get_brand_layers rather than one you remember. Safe to repeat: an id that is not composed answers `changed: false`, changes nothing and mints no version. When the intent is to swap rather than to clear, call add_brand_layer with `replace: true` instead; removing first leaves the brand briefly without that axis and takes two versions to say one thing. This takes effect on the user's brand immediately and requires `confirm: true`; without it nothing changes. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| axis | string | yes | Which axis the record sits on. |
| confirm | boolean | yes | Must be exactly true. Required because removal is permanent. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
| recordId | string | yes | Permanent id of the composed record, as reported by get_brand_layers. |
No output schema declared.
No examples provided.
remove_brand_variation Remove a brand variation ~189
Permanently DELETE one brand proposal from a project. The client stops seeing that direction on their next share view, and the comments they left on it go with it. This cannot be undone, there is no archive, and `confirm: true` is required, so read list_client_comments first if the feedback on that direction still matters. The surviving variations keep the positions they already had, which leaves a gap in the sequence rather than closing it, so follow with reorder_brand_variations when the order the client meets them in matters. Use update_brand_variation instead when the direction should be revised rather than retired. Requires the kits:write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be exactly true. Required because deletion is permanent. |
| projectId | string | yes | Owned brand project id from list_brand_projects. |
| variationId | string | yes | Id of the variation in that project to delete. |
No output schema declared.
No examples provided.
What is the Identity Forge MCP server?
Identity Forge is an MCP server listed in the public MCP registry as io.identityforge/mcp. Design kits, brand naming, and domain research for coding agents. This page covers its npm package (identityforge).
Is the Identity Forge MCP server safe to use?
Identity Forge scores 92 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Identity Forge MCP server expose?
Identity Forge exposes 63 tools: list_themes, list_image_directions, get_image_direction, list_interface_styles, get_interface_style, and 58 more. Their descriptions and schemas cost roughly 13,669 tokens of context every time the server is loaded.
Is the Identity Forge MCP server still maintained?
Identity Forge is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Identity Forge MCP server under?
Identity Forge declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.