Metadata-Version: 2.5
Name: rayonne-mcp
Version: 0.13.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<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 (`rk_…`) : Rayonne → **Réglages → « Clés d'API (extension, API,
Claude) »** (plan **Business**, entitlement `api_access`). Pour créer,
configurer et initialiser des espaces (`/rayonne-from-code`), coche
**« Piloter toute l'organisation »**. Il faut être propriétaire de
l'organisation, et `rayonne_workspace_access` doit répondre
`org_admin: true`. Une clé existante ne se promeut pas : crées-en une autre.

## Installer la clé — pour l'utilisateur, jamais dans un dépôt

La clé ne se colle jamais dans une conversation et ne passe jamais en
argument. Copie-la dans Rayonne, puis :

```sh
pbpaste | uvx rayonne-mcp login     # macOS ; Linux : wl-paste | … ou xclip -o -selection clipboard | …
uvx rayonne-mcp login               # dans un terminal : saisie masquée
```

Dans Claude Code : `! pbpaste | uvx rayonne-mcp login`, puis `/reload-plugins`
(commande `/rayonne-setup`). La clé est vérifiée auprès du serveur, puis
enregistrée dans `~/.config/rayonne/credentials.json` (0600, dossier 0700 ;
`$XDG_CONFIG_HOME` ou `$RAYONNE_CREDENTIALS_FILE` si définis). Elle vaut pour
tous les dépôts de l'utilisateur. `uvx rayonne-mcp logout` la retire ; une
instance auto-hébergée ajoute `--api-url`.

Clé utilisée par le serveur, la première trouvée :
1. `RAYONNE_API_KEY` explicite (Claude Desktop, Codex, CI) ;
2. le fichier de `rayonne-mcp login`, enregistré pour cette URL d'API ;
3. la clé saisie à l'installation du plugin Claude Code
   (`RAYONNE_PLUGIN_API_KEY`).

`rayonne_workspace_access` dit laquelle est chargée (`key_source`) et, sans
administration, l'action exacte à faire (`next_step`).

## Codex

L’adaptateur [`rayonne-codex`](rayonne-codex/README.md) reprend les outils du
serveur PyPI qu’il épingle — la version publiée — et les parcours du plugin
Claude, avec configuration sécurisée macOS (trousseau). Sans profil Codex,
il lit la clé de `rayonne-mcp login`.
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

168 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_delete_brief` | Delete one version of the brief (a failed analysis first). IRREVERSIBLE. |
| `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; `clear` empties its source, date or author. |
| `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. |
| `rayonne_content_warmup` | Le rodage de l'autopilote par venue : validations humaines sur les cinq requises ; jamais fini sur LinkedIn et Hashnode. |
| `rayonne_media_candidates` | Les captures de la galerie classées pour un post — les suggestions du sélecteur de médias. |
| `rayonne_post_videos` | Les vidéos rendues qu'un post peut porter, et ce que sa venue refuserait. |
| `rayonne_get_carousel` / `rayonne_compose_carousel` / `rayonne_set_carousel_publish` | Le document PDF d'un post LinkedIn : le lire, le composer, l'envoyer ou non à la place des images (un post validé repart en relecture). |

### M4 Soumission

| Outil | Rend |
|---|---|
| `rayonne_list_platforms` | The platform catalogue with each venue's EXECUTION MODE. |
| `rayonne_launch_checklist` | Where the workspace stands on each launch-checklist venue (done, in progress). |
| `rayonne_extension_status` | Whether the browser extension is connected (and can fill a form). |
| `rayonne_api_costs` | The month's metered API cost per paid venue (X), billed on the founder's own developer app. |
| `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_fill_trial` | Test the extension's form-filling agent on one Mode B platform: fills in the user's browser, never clicks Next or Send. |
| `rayonne_get_agent_run` | One run of the extension's agent: steps, fields filled, refusals, handoffs, outcome; no typed value. |
| `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). |
| `rayonne_set_starter_platforms` | Les plateformes de départ de l'onboarding, en comptes « en attente » : un intérêt, jamais une connexion. |
| `rayonne_set_account_autopilot` | L'autopilote publie-t-il sur ce compte LinkedIn (profil, page) ? La validation de chaque post reste dans l'application. |
| `rayonne_linkedin_pages` / `rayonne_select_linkedin_page` | Les pages entreprise que LinkedIn a listées après le consentement, et le choix de l'une d'elles. |
| `rayonne_confirm_bio_link` | Coche « Mon lien est dans ma bio TikTok » (ou, avec `platform_slug="youtube"`, « Mon lien est sur ma chaîne YouTube », le seul lien cliquable des Shorts) quand l'utilisateur dit l'avoir fait. Le lien (`bio_link` de `rayonne_list_accounts`) est la page du compte TikTok, qui mène à chacun de ses produits, ou la page YouTube de l'espace, qui mène à son produit. |

### 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. |
| `rayonne_hallucination_audit` | La vérification hebdomadaire des faits : les textes publiés signalés et chaque affirmation sans source. |
| `rayonne_measurement` | Le webhook des événements produit : adresse, signature, événements — jamais le secret. |
| `rayonne_rotate_event_secret` | (Re)génère le secret du webhook, rendu une seule fois ; clé `org_admin`. |

### GEO

| 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_add_geo_prompt` / `rayonne_remove_geo_prompt` / `rayonne_restore_geo_prompts` | Ajouter une question du fondateur, en retirer une, rétablir celles par défaut. |
| `rayonne_geo_sources` | Les sites que les moteurs citent, chacun avec son action de mention gagnée. |
| `rayonne_add_geo_source_task` | « Ajouter à mes tâches » : un site cité devient une tâche du fondateur — Rayonne n'y publie jamais. |
| `rayonne_geo_robots` | Le dernier audit robots / indexation du site produit. |
| `rayonne_run_geo_robots` | Relance l'audit robots / indexation maintenant. |

### « À 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. |
| `rayonne_today` | Le hub « Aujourd'hui » : la mise en route (6 étapes, statut et code), l'état effectif de l'autopilote, la semaine du plan et ce qui est parti. À appeler en premier. |
| `rayonne_confirm_setup_step` | Note une étape que seule la personne peut dire faite : `brief_checked`, `facts_read`, `publish_manually` — une fois, la première date reste. |

### 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_suggest_video_cover` | Suggest the product banner of a finished video's first frame (name, what it is, one point), figures checked against the product facts. Calls a model; saves nothing. |
| `rayonne_set_video_cover` | Put that banner on a finished video and re-render it from the edit (COMPOSE). Free: nothing billed. |
| `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_cancel_reopen_storyboard` | Cancel a reopen: the delivered video comes back as it was, publishable again. Edits dropped, nothing billed. |
| `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_preview_cartoon_avatar` | Draw a cartoon avatar without saving it — the creator's live preview (an SVG data URI). |
| `rayonne_cartoon_traits_of_avatar` | The « cartoon version » of an avatar: the cartoon traits that draw it closest. |
| `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. |
| `rayonne_delete_avatar` | Delete an avatar and its files — the door when a real photo's subject withdraws consent. 409 while a video in progress uses it. |

### 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 switch, and content / submission counts by status — prefer `rayonne_today` for what to do next. |
| `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_workspace_access` | What THIS key may do here: home workspace, organisation reach, administration scope (`org_admin`). |
| `rayonne_usage` | The organisation's plan, limits and this month's usage — read before generating, instead of learning the quota from a 402. Read-only. |
| `rayonne_org_overview` | The organisation's consolidated view, within the key's reach. |
| `rayonne_export_workspace` | Every business object of the workspace as JSON, written into a LOCAL file (GDPR portability); `org_admin` key. |
| `rayonne_set_ai_illustrations` | Turn AI illustrations on or off for the workspace. |

## Changelog

### 0.10.0 (non publiée)

Trente-quatre outils ajoutés depuis la 0.9.0 publiée (129), 163 au total
(`tests/published_tools.json` garde la liste publiée) : l'essai et la
lecture d'un run de l'agent de remplissage (`rayonne_fill_trial`,
`rayonne_get_agent_run`) ; la première image d'une vidéo livrée
(`rayonne_suggest_video_cover`, `rayonne_set_video_cover`) et l'annulation
d'une reprise (`rayonne_cancel_reopen_storyboard`) ; le lien de bio
(`rayonne_confirm_bio_link`) ; la parité de la revue du 2026-10-31 — rodage
(`rayonne_content_warmup`), médias suggérés (`rayonne_media_candidates`),
vidéos d'un post (`rayonne_post_videos`), document LinkedIn
(`rayonne_get_carousel`, `rayonne_compose_carousel`,
`rayonne_set_carousel_publish`), autopilote par compte
(`rayonne_set_account_autopilot`), page LinkedIn (`rayonne_linkedin_pages`,
`rayonne_select_linkedin_page`), checklist de lancement, coût d'API et
extension (`rayonne_launch_checklist`, `rayonne_api_costs`,
`rayonne_extension_status`), GEO en écriture (`rayonne_add_geo_prompt`,
`rayonne_remove_geo_prompt`, `rayonne_restore_geo_prompts`,
`rayonne_add_geo_source_task`, `rayonne_run_geo_robots`), vérification
hebdomadaire (`rayonne_hallucination_audit`), mesure produit
(`rayonne_measurement`, `rayonne_rotate_event_secret`), aperçu cartoon
(`rayonne_preview_cartoon_avatar`, `rayonne_cartoon_traits_of_avatar`),
portée de la clé et plateformes de départ (`rayonne_workspace_access`,
`rayonne_set_starter_platforms`), supprimer une version du brief
(`rayonne_delete_brief`), plan et usage, vue de l'organisation et export
(`rayonne_usage`, `rayonne_org_overview`, `rayonne_export_workspace`).

Démarrage : instructions ramenées sous 3 800 caractères, règles dures en
tête, la carte des modules dans la ressource `rayonne://guide` ;
`serverInfo` porte la version de rayonne-mcp ; `mcp` sans l'extra `cli` ;
`python -m rayonne_mcp` ; les routes qui attendent un modèle ont 150 s et
un délai dépassé rend `timeout`. Les refus TikTok / LinkedIn portent
`publish_url`.

### 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` (annulable : `rayonne_cancel_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) ;
   Le plugin Claude Code suit le même chemin, juste après : il épingle
   lui aussi le serveur publié dans `claude_code_plugin/pyproject.toml`
   (`rayonne-mcp==<version>`, sa propre version = celle de
   `.claude-plugin/plugin.json`) et démarre par `uv run --locked` sur
   `claude_code_plugin/uv.lock` : `cd claude_code_plugin && uv lock`, puis
   le compte d'outils de son README (`tests/test_release_version.py`) et
   `tests/published_tools.json` (la liste publiée) ;
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.
