Metadata-Version: 2.5
Name: rayonne-mcp
Version: 0.9.0
Summary: Rayonne MCP server — pilote un ou tous les espaces d'une organisation Rayonne (audit marketing, analyse produit, contenus, vidéos, métriques AARRR) depuis tout agent compatible MCP.
Author-email: Sponge Theory <contact@sponge-theory.ai>
License: SPONGE THEORY PROPRIETARY LICENSE
Keywords: claude,marketing,mcp,rayonne,sponge-theory
Requires-Python: >=3.10
Requires-Dist: httpx<1,>=0.27
Requires-Dist: mcp[cli]<2,>=1.2.0
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Description-Content-Type: text/markdown

# Rayonne MCP

Serveur MCP (stdio) exposant le workspace Rayonne — contenus, soumissions,
métriques AARRR — à tout agent compatible MCP (Claude Code, Claude Desktop…),
via l'**API publique v1 en lecture et écriture** (`docs/API.md` du repo).

## Prérequis

Une clé API workspace (`rk_…`) : Rayonne → **Réglages → Clés API**
(plan **Business**, entitlement `api_access`).

## Codex

L’adaptateur [`rayonne-codex`](rayonne-codex/README.md) reprend les outils du
serveur PyPI qu’il épingle — `rayonne-mcp==0.8.0`, la version publiée (118 outils), jusqu’à la
publication de 0.9.0 (étape 2 ci-dessous) — et neuf parcours
du plugin Claude, avec configuration sécurisée macOS.
Construction : `python3 mcp/build/build_codex_plugin.py` depuis la racine du dépôt.

## Claude Code

```sh
claude mcp add rayonne \
  --env RAYONNE_API_KEY=rk_xxxxxxxx \
  --env RAYONNE_API_URL=https://rayonne.sponge-theory.dev \
  -- uv run --project /chemin/vers/rayonne/mcp rayonne-mcp
```

## Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "rayonne": {
      "command": "uv",
      "args": ["run", "--project", "/chemin/vers/rayonne/mcp", "rayonne-mcp"],
      "env": {
        "RAYONNE_API_KEY": "rk_xxxxxxxx",
        "RAYONNE_API_URL": "https://rayonne.sponge-theory.dev"
      }
    }
  }
}
```

Le serveur démarre **sans** clé (non fatal) : chaque outil renvoie alors un
message d'installation clair au lieu d'un crash.

## Outils

129 outils, un par verbe de l'API publique, regroupés par module (voir
`CLAUDE.md` du repo pour la carte fonctionnelle M1-M9). Ce que l'agent ne
peut pas encore faire, et ce qu'il ne fera jamais (consentement OAuth,
paiement, visage réel) : `docs/AGENT_PARITY.md` du repo.

**Déposer un fichier (0.6.0)** : `rayonne_upload_product_asset` et
`rayonne_upload_submission_asset` prennent un **chemin de fichier local** —
le serveur MCP tourne sur la machine de l'utilisateur et lit les octets
lui-même. Un chemin fautif est refusé avant tout appel réseau.

**Aucun dépôt d'avatar, par construction** : enregistrer un VISAGE engage le
consentement d'une personne réelle, au nom de l'utilisateur connecté ; une
clé `rk_` n'a pas d'utilisateur. Il n'y a donc ni outil ni route publique de
dépôt d'avatar — `rayonne_generate_avatar` compose un portrait de synthèse,
et déposer une vraie photo reste un acte humain, dans l'interface.

**Listes** : un outil qui rend une liste (`rayonne_list_tasks`,
`rayonne_list_experiments`…) la rend en **un bloc de contenu par élément** —
c'est ainsi que le SDK MCP (FastMCP 1.x) sérialise un retour non typé. Une
liste d'un seul élément a donc, au niveau du protocole, la forme d'un objet,
et une liste vide n'a aucun bloc. Noté par le parcours E2E « surfaces »,
laissé tel quel : envelopper les listes changerait la sortie de chaque outil.

**Cibler un autre espace (0.5.0)** : tout outil ci-dessous, sauf
`rayonne_list_workspaces` et `rayonne_create_workspace`, prend un
`workspace_id` optionnel — passe l'id d'un espace rendu par
`rayonne_list_workspaces` pour agir là-bas plutôt que dans l'espace
d'origine de la clé. Omis, rien ne change par rapport à avant 0.5.0.

### M1 Brief

| Outil | Rend |
|---|---|
| `rayonne_analyze_product` | Analyse la page produit et en tire un brief frais (crawl + extraction). |
| `rayonne_list_briefs` | Product briefs, newest first: what the crawler extracted from the product page (value prop, ICP, features, proof points, pricing). |
| `rayonne_get_brief` | One brief in full, including everything the extractor understood. |
| `rayonne_patch_brief` | Hand-correct what the extractor misread. |
| `rayonne_list_facts` | The product-facts ledger every generated text is grounded on, with source, date, origin, status and whether each fact is usable. |
| `rayonne_create_fact` | Add a fact the founder declares (metric, verbatim testimonial with its author, consented customer, integration, press, pricing, feature, link). |
| `rayonne_update_fact` | Correct a fact, its consent or status; accept or dismiss what a re-crawl proposes. |
| `rayonne_archive_fact` | Archive a fact: no generated text uses it any more. |

### M2 Stratégie

| Outil | Rend |
|---|---|
| `rayonne_list_strategies` | All marketing strategies, newest version first. |
| `rayonne_current_strategy` | The ACTIVE strategy: Bullseye channel scoring plus the 90-day plan the autopilot materialises into scheduled content. |
| `rayonne_create_strategy` | Score the 20 Bullseye acquisition channels from the founder's reality (stage × segment priors, guardrails) and draft a 90-day plan. |
| `rayonne_activate_strategy` | Make a strategy ACTIVE. |
| `rayonne_delete_strategy` | Delete a strategy. |
| `rayonne_founder_context` | The founder's reality the strategy starts from — stage, segment (guessed from the brief, to confirm), hours per week, audience, paid budget. Written with `rayonne_update_workspace(founder_context=...)`. |
| `rayonne_add_plan_action` / `rayonne_edit_plan_action` / `rayonne_remove_plan_action` | Edit the 90-day plan; an action keeps its key, nothing scheduled is ever duplicated. |
| `rayonne_generate_plan_action` | « Générer cette action » — write one Rayonne-owned action now, on every plan, within the monthly quota. |
| `rayonne_list_experiments` / `rayonne_add_experiment` / `rayonne_update_experiment` / `rayonne_delete_experiment` | At most three pre-registered experiments per plan — editable before they start, locked after. |
| `rayonne_record_experiment_result` | Note the result of a `manual` experiment at its end date (a channel no attribution path reaches) — the founder's own count, never a guess. |
| `rayonne_decide_experiment` | Keep, kill or extend an experiment at its end date, against Rayonne's recommendation and its evidence. |

### M3 Contenu

| Outil | Rend |
|---|---|
| `rayonne_list_content` | Latest content pieces (max 100). |
| `rayonne_get_content` | One content item WITH its generated text. |
| `rayonne_generate_content` | Generate one piece for a venue. |
| `rayonne_edit_content` | Edit a piece before it ships. |
| `rayonne_approve_content` | Approve a piece for publication — the human-in-the-loop gate. |
| `rayonne_reject_content` | Reject a piece. |
| `rayonne_reset_content` | Remet en relecture un contenu validé, rejeté ou en échec, sans son approbation. **Ne réécrit rien** : le texte reste le même. |
| `rayonne_regenerate_content` | Réécrit un contenu depuis le brief et les faits ACTUELS — même venue, même type, même argument ; quota consommé, retour en relecture. |
| `rayonne_schedule_content` | Move a piece's publication time. |
| `rayonne_repurpose_content` | Atomise one piece into others (1 → N), keeping its substance and claims but adopting each target venue's shape and length. |
| `rayonne_localize_content` | Translate a piece into another locale, as a REVIEW-status sibling — a human verifies the translation before it ships. |
| `rayonne_delete_content` | Delete a content item. |

### M3 Kit de vente et médias

| Outil | Rend |
|---|---|
| `rayonne_content_media` | The resolved media selection for a post: public URL, dimensions, duration, and why a resource was dropped when it has disappeared. |
| `rayonne_set_content_media` | Set the media selection BY HAND and LOCK the piece. |
| `rayonne_recompute_content_media` | Replay the media selection from the venue's playbook, leaving the text untouched. |
| `rayonne_brand_card` | Compose a brand card (a generated image carrying a punchline) and put it first in the media list. |
| `rayonne_regenerate_text` | Rewrite the post on a DIFFERENT argument from its selling kit. |
| `rayonne_preview_content` | What the post would look like published on a venue: text, any thread split, link placement, and media — without publishing anything. |
| `rayonne_selling_coverage` | Ce que les textes des 30 derniers jours ont dit de la matière vendeuse du brief — couvert, ratio pondéré, jamais dit. |

### M4 Soumission

| Outil | Rend |
|---|---|
| `rayonne_list_platforms` | The platform catalogue with each venue's EXECUTION MODE. |
| `rayonne_list_submissions` | Latest submissions (max 100): platform slug, mode (api/browser_local/ semi_auto), status, and external_url once published. |
| `rayonne_get_submission` | One submission: status, platform, evidence, external URL. |
| `rayonne_submission_kit` | The Mode C kit: a pre-filled deep link, the text blocks to paste and a checklist. |
| `rayonne_create_submission` | Schedule an APPROVED piece for submission to a platform. |
| `rayonne_confirm_submission` | Mode C — record that a manual submission was published. |
| `rayonne_retry_submission` | Retry a failed submission, or a parked one where nothing went out (`retryable`). |
| `rayonne_cancel_submission` | Cancel a pending or scheduled submission. |
| `rayonne_schedule_submission` | Move a submission's dispatch time. |
| `rayonne_delete_submission` | Delete a submission. |
| `rayonne_upload_submission_asset` | Attach a screenshot of your own to a Mode C kit (a path on THIS machine; `kind` is the slot: cover, gallery, logo). |
| `rayonne_generate_submission_assets` | Run the kit's visual pipeline: a screenshot of the product page plus AI variants for each slot. |
| `rayonne_list_submission_assets` | The kit's visuals: signed URLs per slot, plus whether a generation is still running. |
| `rayonne_delete_submission_asset` | Remove one visual from the kit, by file name. IRREVERSIBLE. |

### Comptes connectés

Lire et couper, jamais connecter : le consentement OAuth et le jeton collé
restent des gestes de l'utilisateur, dans l'application.

| Outil | Rend |
|---|---|
| `rayonne_list_accounts` | Les connexions de l'espace, une par plateforme : statut (`connected`, `expired`…), compte, expiration. Aucun jeton. |
| `rayonne_disconnect_account` | Déconnecte une plateforme (YouTube : purge ses données autorisées). |

### M5 Analytics

| Outil | Rend |
|---|---|
| `rayonne_metrics_aarrr` | The AARRR snapshot over a sliding window of 1-90 days — one figure per metric (never a stage sum); GEO and the north star as levels. |
| `rayonne_metrics_channels` | Which channel brings customers: clicks, signups (n), activated users, revenue and engagement per platform and per Bullseye channel, with the unattributed share and no winner below the minimum sample. |
| `rayonne_list_tracking_links` | UTM tracking links and their click counts. |
| `rayonne_create_tracking_link` | Create a trackable UTM link. |
| `rayonne_list_reviews` | Weekly marketing reviews — titles, periods, statuses, `composing`. |
| `rayonne_get_review` | Une revue entière : `content_md` (ce qu'il faut changer) et `kpis_jsonb`. |
| `rayonne_run_review` | Compose a review now instead of waiting for the weekly beat — or, with `review_id`, regenerate that review's week. |

### GEO (lecture)

| Outil | Rend |
|---|---|
| `rayonne_geo_overview` | Taux de mention et de citation par moteur IA et par question, avec n et intervalle à 95 % (nuls sous `min_n`). |
| `rayonne_geo_prompts` | Les questions suivies et l'état de leur envoi à audigeo. |
| `rayonne_geo_sources` | Les sites que les moteurs citent, chacun avec son action de mention gagnée. |
| `rayonne_geo_robots` | Le dernier audit robots / indexation du site produit. |

### « À faire » — les gestes du fondateur

Rayonne organise l'engagement humain, il ne le fait jamais : ces outils
rappellent et enregistrent, ils ne répondent à personne.

| Outil | Rend |
|---|---|
| `rayonne_list_tasks` | The founder's to-do list — reply windows after each post (link, guidance, closing time), the weekly community participation, the monthly review request — filtered by one or more `status` and `kind`, paged with `offset`. |
| `rayonne_update_task` | Record the founder's gesture: `done`, `skipped`, or `todo` to reopen (409 `task_closed` once a window has closed). |
| `rayonne_notifications` | Le badge « attention requise » : contenus en relecture, kits à confirmer, stratégies proposées, fenêtres de réponse, compteurs. |

### Lancement (WS7)

Le plan organise, les kits préparent, le fondateur publie : aucun outil ne
publie sur Reddit, Hacker News, Product Hunt ou Indie Hackers, ni n'écrit un
Show HN.

| Outil | Rend |
|---|---|
| `rayonne_launch_plan` | The active launch runbook (null when none): each dated step, its words, its gates and its task status. |
| `rayonne_create_launch_plan` | Create the runbook from a launch day; under 14 days answers 422 `launch_too_soon` unless the user confirms. |
| `rayonne_reschedule_launch` | Move the launch day: every step moves with it, Show HN never on Product Hunt's day. |
| `rayonne_move_launch_step` | Move one step (422 `show_hn_same_day`, 422 `date_in_past`). |
| `rayonne_delete_launch_plan` | Archive the active runbook; its open steps are skipped. |
| `rayonne_launch_gates` | What the launch gates know — `pass`, `fail` or `unknown` (unknown is not a pass). |
| `rayonne_answer_launch_gate` | Record the founder's answer to a gate; by a key, `maker_present` and `community_history:*` stay unknown. |
| `rayonne_recheck_launch_gates` | Read the product page once more (a waitlist fails the public-usage gates). |
| `rayonne_list_comparisons` / `rayonne_get_comparison` | The comparison matrices — each cell a value, its source URL and its date. |
| `rayonne_create_comparison` | Start a matrix; the founder's column is pre-filled from the ledger, to confirm. |
| `rayonne_update_comparison` | Replace a matrix; clears the confirmation. |
| `rayonne_confirm_comparison` | The founder confirms every value on its date. |
| `rayonne_check_comparison` | What blocks a page, without generating. |
| `rayonne_generate_comparison` | Write a « X vs Y » or « alternative à Y » article from the matrix ONLY; always waits for the founder. |
| `rayonne_delete_comparison` | Delete a matrix (a page already written keeps its frozen copy). |

### M9 Vidéo et storyboard

| Outil | Rend |
|---|---|
| `rayonne_create_video` | Génère une vidéo courte à partir du brief courant. |
| `rayonne_list_videos` | Video projects: status, current pipeline stage, degradations, and the rendered URL once finished. |
| `rayonne_get_video` | One video project in full: storyboard, per-stage state, assets, selling-coverage score and render URL. |
| `rayonne_list_video_venues` | Where a video can be published and in which format. |
| `rayonne_regenerate_video` | Resume the pipeline from one stage instead of rebuilding everything. |
| `rayonne_derive_video` | Derive another aspect ratio from a finished video (9x16, 16x9, 1x1) without regenerating its content. |
| `rayonne_publish_video` | Schedule a finished video for publication. |
| `rayonne_delete_video` | Delete a video project and its assets. |
| `rayonne_preview_storyboard` | What an edit WOULD be worth, without saving anything. |
| `rayonne_update_storyboard` | Save an edited storyboard. |
| `rayonne_approve_storyboard` | Resume production after review. |
| `rayonne_storyboard_options` | What a scene may contain: roles, shots per source, limits, and the ONLY pages a capture scene may film (the brief's allow-list). |
| `rayonne_reopen_storyboard` | Reopen the review of a FINISHED video. Regenerates nothing. |
| `rayonne_assist_storyboard` | Ask the model for ONE change to a scene (rewrite/shorten/variants/add_scene_for) and get a proposal plus its review. Calls a model. |
| `rayonne_chat_storyboard` | Discuss the whole script in plain words; a proposed storyboard comes back with its diff when the request implies a change. Calls a model. |
| `rayonne_storyboard_thumbnail` | The REAL thumbnail of a page a capture scene would film (viewport, scroll offset), within the brief's allow-list. |
| `rayonne_update_video` | Choose who speaks in the video — or nobody. The only project field editable during review. |
| `rayonne_music_presets` | The music catalogue outside any project: the styles and levels the workshop actually offers. |

### Avatars vidéo

**Aucun dépôt de visage** (voir plus haut).

| Outil | Rend |
|---|---|
| `rayonne_list_avatars` | The workspace's avatar gallery: name, traits, whether it is enabled, and a preview URL. |
| `rayonne_cartoon_avatar_options` | The closed vocabulary of a cartoon avatar (gender, skin tone, hair, facial hair, outfit). |
| `rayonne_create_cartoon_avatar` | Add a cartoon avatar — a drawn character that sings clip videos. Free: drawn by code. |
| `rayonne_generate_avatar` | Compose a synthetic portrait from traits and add it to the gallery. Calls an image model. |
| `rayonne_update_avatar` | Rename an avatar, or take it out of circulation with `enabled=False`. |
| `rayonne_cutout_avatar` | Redo the avatar's cut-out (transparent background) IN PLACE. Best-effort. |

### Galerie produit

| Outil | Rend |
|---|---|
| `rayonne_list_product_assets` | The product-screen gallery: real screens of the product (behind the login, or a native app) that a video may show, each with a caption. |
| `rayonne_upload_product_asset` | Deposit a real screen or clip of the product into the gallery (a path on THIS machine). |
| `rayonne_update_product_asset` | Correct a screen's caption — never to empty it. |
| `rayonne_suggest_asset_caption` | Ask a vision model what a screen shows; saved only if the screen has no caption yet. Calls a model. |
| `rayonne_delete_product_asset` | Remove a screen or clip from the gallery. IRREVERSIBLE. |

### Audit

| Outil | Rend |
|---|---|
| `rayonne_list_audits` | Les audits marketing passés de la page produit (verdict, note, axes). |
| `rayonne_marketing_audit` | Audite le MESSAGE de la page produit et rend un verdict actionnable. |

### Espaces de l'organisation

| Outil | Rend |
|---|---|
| `rayonne_list_workspaces` | The workspaces this key can act on, home first. |
| `rayonne_create_workspace` | Create a workspace in this key's organisation. |
| `rayonne_delete_workspace` | Delete a workspace and everything in it. IRREVERSIBLE. |
| `rayonne_onboard_workspace` | Termine l’initialisation, conserve brief et stratégie ; clé admin requise. |
| `rayonne_update_workspace` | Change a workspace's settings. |

### Workspace

| Outil | Rend |
|---|---|
| `rayonne_overview` | Workspace summary: name, product URL, autopilot state, and content / submission counts by status. |
| `rayonne_workspace` | The targeted workspace's current settings for this key: name, product URL, locale, pause, autopilot, real autopublishing, AI illustrations, video music default. |
| `rayonne_set_ai_illustrations` | Turn AI illustrations on or off for the workspace. |

## Changelog

### 0.9.0

Audit du 2026-10-14 : dix outils ajoutés, 128 au total. Nécessite le
backend qui porte les routes publiques correspondantes (`/accounts`,
`/notifications`, `/reviews/{id}`, `/geo*`, `/content/selling-coverage`,
`/content/{id}/regenerate`).

- **`rayonne_reset_content` ne réécrit rien** — il remet en relecture.
  Les instructions disaient « re-runs a piece from the corrected source » :
  un agent corrigeait le brief, « relançait », et ré-approuvait le même
  texte. La réécriture est `rayonne_regenerate_content` (même venue, même
  type, même argument, quota consommé, retour en relecture).
- **Comptes connectés** — `rayonne_list_accounts`,
  `rayonne_disconnect_account` : un agent sait enfin si une venue `api`
  peut publier. Connecter reste un geste humain.
- **Attention requise** — `rayonne_notifications`.
- **Revue hebdo lisible** — `rayonne_get_review` ; `rayonne_run_review`
  prend `review_id`.
- **GEO en lecture** — `rayonne_geo_overview`, `rayonne_geo_prompts`,
  `rayonne_geo_sources`, `rayonne_geo_robots`.
- **Couverture vendeuse** — `rayonne_selling_coverage`.
- **Corrigés** — `rayonne_generate_submission_assets` répondait 422 à
  chaque appel (le serveur lisait `modes` comme corps) ; il prend `modes`.
  `rayonne_list_tasks` prend plusieurs statuts et `offset`. Les segments
  libres d'un chemin (clés d'action et de garde, slug, nom de fichier) sont
  échappés.
- **Gardes dites à l'agent** — TikTok refusé à une clé (422
  `tiktok_requires_app`), vidéo du plan validée par une personne, médias
  d'un contenu validé qui le renvoient en relecture, repurpose refusé sur un
  type que la venue ne prend pas.
- **Une version, un code** — la 0.8.0 de PyPI et celle du bundle Desktop
  différaient : la source passe en 0.9.0, `build_mcpb.sh` reconstruit
  toujours la roue qu'il embarque, et `tests/test_release_version.py`
  épingle les sources d'une version publiée.

### 0.8.0

L'audit produit (v1.33 → v1.41) arrive dans Claude : 36 outils ajoutés
depuis 0.7.0, 118 au total, un par verbe de l'API publique. Nécessite le
backend v1.41 ou plus récent.

- **Faits du produit (WS1a)** — `rayonne_list_facts`, `rayonne_create_fact`,
  `rayonne_update_fact`, `rayonne_archive_fact` : le registre de preuves sur
  lequel chaque texte s'ancre.
- **Stratégie (WS4)** — `rayonne_founder_context` ; le plan modifiable :
  `rayonne_add_plan_action`, `rayonne_edit_plan_action`,
  `rayonne_remove_plan_action`, `rayonne_generate_plan_action` ; les
  expériences pré-enregistrées : `rayonne_list_experiments`,
  `rayonne_add_experiment`, `rayonne_update_experiment`,
  `rayonne_delete_experiment`, `rayonne_record_experiment_result`,
  `rayonne_decide_experiment`.
- **« À faire » (WS3)** — `rayonne_list_tasks`, `rayonne_update_task` : les
  gestes du fondateur (fenêtres de réponse, participation hebdomadaire,
  demande d'avis, étapes de lancement), rappelés, jamais faits à sa place.
- **Mesure (WS5)** — `rayonne_metrics_channels` : quel canal amène des
  clients, avec n et sans gagnant sous l'échantillon minimal.
- **Lancement (WS7)** — `rayonne_launch_plan`, `rayonne_create_launch_plan`,
  `rayonne_reschedule_launch`, `rayonne_move_launch_step`,
  `rayonne_delete_launch_plan`, `rayonne_launch_gates`,
  `rayonne_answer_launch_gate`, `rayonne_recheck_launch_gates` ; les pages
  de comparaison sourcées : `rayonne_list_comparisons`,
  `rayonne_get_comparison`, `rayonne_create_comparison`,
  `rayonne_update_comparison`, `rayonne_confirm_comparison`,
  `rayonne_check_comparison`, `rayonne_generate_comparison`,
  `rayonne_delete_comparison`.
- **Avatars cartoon** — `rayonne_cartoon_avatar_options`,
  `rayonne_create_cartoon_avatar` (le personnage qui chante un clip).
- **Outils changés** — `rayonne_update_workspace` prend `founder_context`,
  `activation_event`, `north_star_metric`, `venue_cadence`,
  `paid_partnership`, `bluesky_account` et `engagement_emails` ;
  `rayonne_edit_content` prend `paid_partnership` et dit la forme d'un fil ;
  `rayonne_approve_content` est refusé (409) sur LinkedIn, une page LinkedIn,
  Hashnode (`founder_approval_required`) et une page de comparaison
  (`comparison_human_review_required`) : une personne valide dans
  l'application ; `rayonne_retry_submission` nomme ses refus 409 ;
  `rayonne_create_submission`, `rayonne_retry_submission`,
  `rayonne_schedule_submission` et `rayonne_publish_video` exigent un
  contenu validé (409 `content_not_approved`) — une page de comparaison,
  validée par une personne dans l'application ; un contenu validé que
  `rayonne_edit_content` retouche repart en relecture ;
  `rayonne_publish_video` saute LinkedIn ; `rayonne_list_platforms` porte les
  règles écrites de chaque venue (`tos`) et sa cadence ;
  `rayonne_metrics_aarrr` rend une valeur par métrique et le GEO en taux.
- **Refus entiers** — un refus de l'API rend `{"error": "request_failed",
  "status", "detail", "message"}` : `detail` est le refus structuré du
  serveur (son `code`, `hint_fr` / `hint_en`, les `problems` d'un
  comparatif), là où `message` coupait à 300 caractères.

### 0.7.0

`rayonne_onboard_workspace` termine l’initialisation d’un espace via une clé
administratrice, sans régénération ni activation. `rayonne_patch_brief`
conserve les champs absents, fusionne les objets imbriqués, remplace les
tableaux et enregistre les valeurs nulles. Nécessite le backend corrigé.


### 0.6.0

Le dépôt, l'atelier vidéo et les pièces jointes d'un kit sortent du
navigateur. Dix-huit outils s'ajoutent : la galerie produit devient
inscriptible (`rayonne_upload_product_asset` — un CHEMIN de fichier local,
lu par le serveur sur la machine de l'utilisateur —,
`rayonne_update_product_asset`, `rayonne_suggest_asset_caption`,
`rayonne_delete_product_asset`) ; l'atelier vidéo s'ouvre en entier (avatars
`rayonne_list_avatars` / `rayonne_generate_avatar` /
`rayonne_update_avatar` / `rayonne_cutout_avatar`, relecture rouvrable
`rayonne_reopen_storyboard`, aide IA `rayonne_assist_storyboard` et
`rayonne_chat_storyboard`, vignette réelle `rayonne_storyboard_thumbnail`,
choix de l'avatar `rayonne_update_video`, catalogue `rayonne_music_presets`)
; et un kit Mode C accepte enfin des visuels déposés à la main
(`rayonne_upload_submission_asset`, `rayonne_generate_submission_assets`,
`rayonne_list_submission_assets`, `rayonne_delete_submission_asset`). 81
outils au total.

**Une absence est délibérée** : il n'y a pas d'outil de dépôt d'avatar, et
pas de route publique derrière. Déposer un visage engage le consentement
d'une personne réelle au nom de l'utilisateur connecté ; une clé `rk_` n'a
pas d'utilisateur, donc un agent ne peut pas l'attester à sa place. Le
portrait de synthèse (`rayonne_generate_avatar`) est la voie ouverte ici ;
une vraie photo se dépose dans l'interface, par un humain.

### 0.5.0

Une clé peut désormais piloter TOUTE l'organisation, pas seulement son
espace d'origine : `rayonne_list_workspaces` énumère ce qu'elle peut
atteindre (l'origine marquée `is_home`), `rayonne_create_workspace` et
`rayonne_delete_workspace` ouvrent et ferment des espaces (clé avec le cran
d'administration), et `rayonne_update_workspace` règle l'espace visé sur
l'objet complet des réglages. Les 59 outils existants gagnent un
`workspace_id` optionnel pour agir sur un autre espace que celui de la clé —
omis, comportement inchangé. **Rupture** : le format rendu par
`rayonne_workspace` (et par `rayonne_update_workspace`) n'est plus le format
étroit d'avant — `autopilot_enabled` devient `autopilot`, et `locale`,
`paused`, `autopublish_live`, `video_music` apparaissent. 63 outils au
total.

### 0.4.0

Kit de vente et médias d'un post pilotables depuis Claude : inspecter la
sélection média résolue, la fixer à la main ou la recalculer depuis le
playbook, composer une carte de marque, changer d'argument de vente, et
prévisualiser texte + médias par venue avant publication. Huit outils
ajoutés (`rayonne_content_media`, `rayonne_set_content_media`,
`rayonne_recompute_content_media`, `rayonne_brand_card`,
`rayonne_regenerate_text`, `rayonne_preview_content`, `rayonne_workspace`,
`rayonne_set_ai_illustrations`) — 59 outils au total.

## Tests

```sh
cd mcp && uv run --extra dev pytest -q
```

## Publication marketplace

À faire via le flux commun Sponge Theory (même patron qu'`audigeo-mcp` :
stdio + PyPI, vendored dans `ezeeFlop/claude-plugins`) — voir l'agent
`mcp-plugin-publisher`. Pour une version (`tests/test_release_version.py`
garde les déclarations d'accord), dans cet ordre :

1. `./build/publish_pypi.sh` — construit la roue et le sdist
   (`build_wheel.sh`) et publie `rayonne-mcp==<version>` sur PyPI ;
2. l'adaptateur Codex, qui lance `uv run --locked`, garde la version
   publiée jusque-là ; il passe à la nouvelle juste après l'envoi PyPI :
   `rayonne-codex/pyproject.toml` (`rayonne-mcp==<version>`, sa propre
   version), `.codex-plugin/plugin.json`, le compte d'outils de
   `scripts/check_connection.py`, de son README et du skill
   `rayonne-setup`, puis `cd rayonne-codex && uv lock` (le verrou ne se
   régénère qu'une fois le paquet sur PyPI) et
   `tests/test_release_version.py` (`PUBLISHED`, `PUBLISHED_TOOLS`, et
   `PUBLISHED_SOURCES_SHA256` — l'empreinte que le test affiche : dès lors,
   toute retouche de `src/` exige un nouveau numéro) ;
3. `./build/build_plugin.sh`, `./build/build_mcpb.sh` et
   `python3 build/build_codex_plugin.py` — les trois paquets dans `dist/`.
   L'image API copie `mcp/dist/` (`docker/Dockerfile.api`) et sert le
   `.mcpb` et le plugin depuis Réglages (`/api/v1/integrations/…`) :
   reconstruire l'image ensuite ;
4. reporter `claude_code_plugin/` et `rayonne-codex/` dans la marketplace
   `ezeeFlop/claude-plugins` (Codex sous `plugins/rayonne-codex`), et
   pousser.
