Site structure for client redesigns. Page tree with URL, keyword, status and redirect plan export.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer token from your Arbo account (Account > MCP), on a paid plan
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create multiple pages at once from a tree structure. Ideal for generating a full sitemap with zoning, entry points, CTAs and tags.
Flat list of nodes with temp_id references for parent-child relationships (500 max)
The project ID
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create multiple pages at once from a tree structure. Ideal for generating a full sitemap with zoning, entry points, CTAs and tags.
| Argument | Type | Description |
|---|---|---|
| nodes* | array | Flat list of nodes with temp_id references for parent-child relationships (500 max) |
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"nodes"
],
"properties": {
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"temp_id",
"parent_temp_id",
"label"
],
"properties": {
"cta": {
"type": "array",
"items": {
"type": "string"
},
"description": "Call-to-action labels"
},
"seo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Page URL or path (e.g. '/services/audit-seo')"
},
"intent": {
"enum": [
"informational",
"navigational",
"commercial",
"transactional"
],
"type": "string"
},
"status": {
"enum": [
"keep",
"create",
"redirect",
"delete"
],
"type": "string",
"description": "keep = existing page kept, create = new page, redirect = 301 to redirect_to, delete = removed (410)"
},
"volume": {
"type": "number",
"description": "Monthly search volume of the main keyword"
},
"keyword": {
"type": "string",
"description": "Main target keyword"
},
"redirectTo": {
"type": "string",
"description": "Destination URL when status is 'redirect'"
}
},
"description": "SEO data of the page: URL, target keyword, volume, intent, migration status"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags"
},
"type": {
"type": "string"
},
"label": {
"type": "string"
},
"notes": {
"type": "string"
},
"temp_id": {
"type": "string",
"description": "Temporary ID for referencing as parent (e.g. 'home', 'about')"
},
"priority": {
"enum": [
"primary",
"secondary",
"utility"
],
"type": "string"
},
"rationale": {
"type": "string"
},
"description": {
"type": "string"
},
"entry_points": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"label"
],
"properties": {
"type": {
"enum": [
"google",
"direct",
"nav",
"social",
"email",
"ads",
"qrcode"
],
"type": "string"
},
"label": {
"type": "string"
}
}
},
"description": "Traffic sources"
},
"zoning_blocks": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"label",
"skin",
"height"
],
"properties": {
"id": {
"type": "string"
},
"skin": {
"type": "string",
"description": "nav, hero, breadcrumb, titre, contenu, sidebar, cards, grille, filtres, cta, double-cta, form, submit, arguments, social-proof, image, question, reponses, progression, nav-quiz, search-bar, resultats, pagination, footer, dots"
},
"label": {
"type": "string"
},
"height": {
"type": "number"
}
}
},
"description": "Wireframe zoning blocks"
},
"parent_temp_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Temp ID of the parent node. Null = root."
},
"zoning_expanded": {
"type": "boolean"
}
}
},
"maxItems": 500,
"description": "Flat list of nodes with temp_id references for parent-child relationships (500 max)"
},
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Add a page to a project's sitemap. Use parent_id to create hierarchy. Supports rich data: zoning blocks (wireframe layout), entry points (traffic sources), CTAs, and tags.
| Argument | Type | Description |
|---|---|---|
| cta | array | Call-to-action button labels (e.g. ['Acheter', 'En savoir plus']) |
| seo | object | SEO data of the page: URL, target keyword, volume, intent, migration status |
| tags | array | Tags for categorization (e.g. ['SEO', 'conversion']) |
| type | string | Page type: home, listing, detail, form, landing, quiz, search, hub, error, legal |
| label* | string | Page name (e.g. 'Accueil', 'Contact') |
| notes | string | Additional notes |
| priority | string | Page importance |
| parent_id | any | Parent node ID. Null = root page. |
| rationale | string | Why this page exists (UX insight) |
| project_id* |
Create a new project. Returns the project ID. Add nodes with create_node after.
| Argument | Type | Description |
|---|---|---|
| name* | string | Project name |
| accent | string | Accent color hex (e.g. #2563EB) |
| client | string | Client name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Project name"
},
"accent": {
"type": "string",
"description": "Accent color hex (e.g. #2563EB)"
},
"client": {
"type": "string",
"description": "Client name"
}
}
}Remove a page from the sitemap (soft delete, can be restored via version history)
| Argument | Type | Description |
|---|---|---|
| cascade | boolean | If true, also deletes all children. Default: false (children are reparented to grandparent) |
| node_id* | string | The node ID to delete |
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"node_id"
],
"properties": {
"cascade": {
"type": "boolean",
"description": "If true, also deletes all children. Default: false (children are reparented to grandparent)"
},
"node_id": {
"type": "string",
"description": "The node ID to delete"
},
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Generate a lo-fi wireframe HTML for a page using AI. The wireframe is saved to the node's zoningHtml field. Requires zoning blocks to be defined on the node. Costs 1 AI credit (or uses BYOK key). Returns the generated HTML.
| Argument | Type | Description |
|---|---|---|
| node_id* | string | The node ID to generate wireframe for |
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"node_id"
],
"properties": {
"node_id": {
"type": "string",
"description": "The node ID to generate wireframe for"
},
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Change list from the open review comments: deduplicated and classed (text, visual, structure), out-of-scope requests with a reply and an amendment line, and contradictions with decided points. Costs AI credits (quality model, 3 credits), paid by the token's account or the project owner. Requires write access.
| Argument | Type | Description |
|---|---|---|
| step | string | Review step: wireframe or mockup |
| node_id | string | Only this page |
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"step": {
"enum": [
"wireframe",
"mockup"
],
"type": "string",
"description": "Review step: wireframe or mockup"
},
"node_id": {
"type": "string",
"description": "Only this page"
},
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Get a project with its full sitemap tree
| Argument | Type | Description |
|---|---|---|
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Review of a project: per page, the status and version of each step (wireframe, mockup), and the latest Figma link per breakpoint
| Argument | Type | Description |
|---|---|---|
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}List all projects accessible with this token
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Comments left in the review (wireframe or mockup), pinned on a version and a breakpoint. Set open_only true to get only the unresolved ones.
| Argument | Type | Description |
|---|---|---|
| step | string | Review step: wireframe or mockup |
| node_id | string | Only the comments of this page |
| open_only | boolean | Only unresolved comments |
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"step": {
"enum": [
"wireframe",
"mockup"
],
"type": "string",
"description": "Review step: wireframe or mockup"
},
"node_id": {
"type": "string",
"description": "Only the comments of this page"
},
"open_only": {
"type": "boolean",
"description": "Only unresolved comments"
},
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Mark a review comment resolved or open again. Same rights as the other write tools (write:nodes, owner or editor).
| Argument | Type | Description |
|---|---|---|
| resolved* | boolean | true to resolve, false to reopen |
| comment_id* | string | The comment ID (from list_review_comments) |
| project_id* | string | The project ID |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"comment_id",
"resolved"
],
"properties": {
"resolved": {
"type": "boolean",
"description": "true to resolve, false to reopen"
},
"comment_id": {
"type": "string",
"description": "The comment ID (from list_review_comments)"
},
"project_id": {
"type": "string",
"description": "The project ID"
}
}
}Update a page's properties. For the description field: use real newlines (not literal \n). Supports rich multiline content: SEO notes, copy, sections, CTAs, FAQ, maillage, etc. No length limit. You can also set zoning_html (full wireframe HTML) and annotations (contextual notes per wireframe section).
| Argument | Type | Description |
|---|---|---|
| seo | object | SEO data. Fields sent are merged into the existing SEO block. |
| type | string | New page type |
| label | string | New page name |
| notes | string | |
| node_id* | string | The node ID to update |
| priority | string | |
| parent_id | any | Move to new parent |
| rationale | string | |
| project_id* | string | The project ID |
| annotations | array | Contextual annotations for wireframe sections. These appear as a sidebar alongside the wireframe preview. |
| string |
| The project ID |
| description | string | Page description. Use real newlines for formatting. Supports long multiline content (SEO, copy, sections, CTAs, FAQ). No length limit. |
| entry_points | array | Traffic entry points for this page |
| zoning_blocks | array | Wireframe zoning blocks (page layout structure) |
| zoning_expanded | boolean | If true, zoning is shown expanded by default on the canvas |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"label"
],
"properties": {
"cta": {
"type": "array",
"items": {
"type": "string"
},
"description": "Call-to-action button labels (e.g. ['Acheter', 'En savoir plus'])"
},
"seo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Page URL or path (e.g. '/services/audit-seo')"
},
"intent": {
"enum": [
"informational",
"navigational",
"commercial",
"transactional"
],
"type": "string"
},
"status": {
"enum": [
"keep",
"create",
"redirect",
"delete"
],
"type": "string",
"description": "keep = existing page kept, create = new page, redirect = 301 to redirect_to, delete = removed (410)"
},
"volume": {
"type": "number",
"description": "Monthly search volume of the main keyword"
},
"keyword": {
"type": "string",
"description": "Main target keyword"
},
"redirectTo": {
"type": "string",
"description": "Destination URL when status is 'redirect'"
}
},
"description": "SEO data of the page: URL, target keyword, volume, intent, migration status"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags for categorization (e.g. ['SEO', 'conversion'])"
},
"type": {
"type": "string",
"description": "Page type: home, listing, detail, form, landing, quiz, search, hub, error, legal"
},
"label": {
"type": "string",
"description": "Page name (e.g. 'Accueil', 'Contact')"
},
"notes": {
"type": "string",
"description": "Additional notes"
},
"priority": {
"enum": [
"primary",
"secondary",
"utility"
],
"type": "string",
"description": "Page importance"
},
"parent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Parent node ID. Null = root page."
},
"rationale": {
"type": "string",
"description": "Why this page exists (UX insight)"
},
"project_id": {
"type": "string",
"description": "The project ID"
},
"description": {
"type": "string",
"description": "Page description. Use real newlines for formatting. Supports long multiline content (SEO, copy, sections, CTAs, FAQ). No length limit."
},
"entry_points": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"label"
],
"properties": {
"type": {
"enum": [
"google",
"direct",
"nav",
"social",
"email",
"ads",
"qrcode"
],
"type": "string"
},
"label": {
"type": "string"
}
}
},
"description": "Traffic entry points for this page"
},
"zoning_blocks": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"label",
"skin",
"height"
],
"properties": {
"id": {
"type": "string",
"description": "Unique block ID (e.g. 'z1')"
},
"skin": {
"type": "string",
"description": "Block skin: nav, hero, breadcrumb, titre, contenu, sidebar, cards, grille, filtres, cta, double-cta, form, submit, arguments, social-proof, image, question, reponses, progression, nav-quiz, search-bar, resultats, pagination, footer, dots"
},
"label": {
"type": "string",
"description": "Block label (e.g. 'Hero', 'Navigation')"
},
"height": {
"type": "number",
"description": "Visual height in px (e.g. 18 for nav, 64 for hero, 60 for contenu)"
}
}
},
"description": "Wireframe zoning blocks (page layout structure)"
},
"zoning_expanded": {
"type": "boolean",
"description": "If true, zoning is shown expanded by default on the canvas"
}
}
}| description | string | Page description. Use real newlines for formatting. Supports long multiline content (SEO, copy, sections, CTAs, FAQ). No length limit. |
| zoning_html | string | Full wireframe HTML (lo-fi, inline CSS, standalone). Replaces the current wireframe for this page. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"node_id"
],
"properties": {
"seo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Page URL or path (e.g. '/services/audit-seo')"
},
"intent": {
"enum": [
"informational",
"navigational",
"commercial",
"transactional"
],
"type": "string"
},
"status": {
"enum": [
"keep",
"create",
"redirect",
"delete"
],
"type": "string",
"description": "keep = existing page kept, create = new page, redirect = 301 to redirect_to, delete = removed (410)"
},
"volume": {
"type": "number",
"description": "Monthly search volume of the main keyword"
},
"keyword": {
"type": "string",
"description": "Main target keyword"
},
"redirectTo": {
"type": "string",
"description": "Destination URL when status is 'redirect'"
}
},
"description": "SEO data. Fields sent are merged into the existing SEO block."
},
"type": {
"type": "string",
"description": "New page type"
},
"label": {
"type": "string",
"description": "New page name"
},
"notes": {
"type": "string"
},
"node_id": {
"type": "string",
"description": "The node ID to update"
},
"priority": {
"enum": [
"primary",
"secondary",
"utility"
],
"type": "string"
},
"parent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Move to new parent"
},
"rationale": {
"type": "string"
},
"project_id": {
"type": "string",
"description": "The project ID"
},
"annotations": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"section",
"tag",
"title",
"body"
],
"properties": {
"id": {
"type": "string",
"description": "Unique annotation ID (e.g. 'ann_1')"
},
"tag": {
"enum": [
"UX",
"COPY",
"SEO",
"DEV",
"DESIGN",
"A11Y",
"PERF",
"TODO"
],
"type": "string",
"description": "Annotation category"
},
"body": {
"type": "string",
"description": "Detailed annotation content"
},
"title": {
"type": "string",
"description": "Short annotation title"
},
"section": {
"type": "string",
"description": "Section name in the wireframe this annotation refers to (e.g. 'Hero', 'Navigation')"
}
}
},
"description": "Contextual annotations for wireframe sections. These appear as a sidebar alongside the wireframe preview."
},
"description": {
"type": "string",
"description": "Page description. Use real newlines for formatting. Supports long multiline content (SEO, copy, sections, CTAs, FAQ). No length limit."
},
"zoning_html": {
"type": "string",
"description": "Full wireframe HTML (lo-fi, inline CSS, standalone). Replaces the current wireframe for this page."
}
}
}