@agifyai/leadify-mcp 8.5.5 → 8.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -19
- package/dist/server.js +2 -0
- package/dist/tools/campaigns.js +3 -8
- package/dist/tools/context_entities.d.ts +668 -0
- package/dist/tools/context_entities.js +528 -0
- package/dist/tools/context_workspace.js +104 -49
- package/dist/tools/personas.js +142 -100
- package/dist/tools/pipeline.d.ts +4 -1
- package/dist/tools/pipeline.js +26 -35
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/tools/dataroom.d.ts +0 -2
- package/dist/tools/dataroom.js +0 -889
package/README.md
CHANGED
|
@@ -123,7 +123,8 @@ src/
|
|
|
123
123
|
├── leads.ts
|
|
124
124
|
├── events.ts
|
|
125
125
|
├── campaigns.ts
|
|
126
|
-
├──
|
|
126
|
+
├── context_workspace.ts
|
|
127
|
+
├── context_entities.ts
|
|
127
128
|
├── personas.ts
|
|
128
129
|
└── ... # un fichier = un domaine fonctionnel
|
|
129
130
|
```
|
|
@@ -245,7 +246,7 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
245
246
|
| `get_campaign_logs` | Récupérer les logs de campagne avec filtres et pagination. |
|
|
246
247
|
| `delete_campaign_log` | Supprimer une entrée de log de campagne. |
|
|
247
248
|
| `update_campaign_stats` | Mettre à jour les statistiques d'email d'une campagne pour un groupe de leads. |
|
|
248
|
-
| `create_campaign` | Créer une campagne DRAFT mono-canal rattachée à un
|
|
249
|
+
| `create_campaign` | Créer une campagne DRAFT mono-canal rattachée à un Lead Group qui possède déjà sa paire Persona–Offre. Aucun `persona_id` ou contexte indépendant n’est accepté au niveau Campagne. `channel` (`LINKEDIN` ou `EMAIL`) est obligatoire ; `start_at` inclusif, `end_at` exclusif et `timezone` IANA configurent la fenêtre métier. À `end_at`, Leadify met la campagne en pause réversible (`WINDOW_END`) sans la clôturer. |
|
|
249
250
|
| `update_campaign_configuration` | Modifier la fenêtre de toute campagne encore `OPEN`; le canal reste modifiable uniquement en DRAFT. Prolonger `end_at` dans le futur ou le supprimer relance automatiquement une pause `WINDOW_END` après validation du fournisseur, mais jamais une pause manuelle. La fenêtre demandée reste enregistrée si cette validation échoue. |
|
|
250
251
|
| `list_campaigns` | Lister compactement les campagnes d'une organisation explicitement sélectionnée, avec état effectif, fenêtre, motif de pause et clôture. |
|
|
251
252
|
| `get_campaign` | Récupérer les détails d'une campagne, son état effectif, sa clôture et son éventuel rapport final figé, ainsi que ses KPIs temps réel. |
|
|
@@ -262,8 +263,18 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
262
263
|
| `unipile_read_messages` | Lire les messages LinkedIn Unipile bornés d'un profil explicitement sélectionné. |
|
|
263
264
|
| `leadify_read_activity_feed` | Lire l'audit borné d'un lead ; le feed ne constitue jamais une preuve de réponse. |
|
|
264
265
|
| `get_commercial_truth` | Réconcilier CRM, email, LinkedIn, Unipile et activité avec un statut, une fraîcheur et une action recommandée ; aucune écriture ni envoi. |
|
|
265
|
-
| `compile_context_pack` | Compiler en lecture seule un Context Pack canonique depuis une cible explicite (`organization`, `lead_group`, `campaign`, `account`, `person`) ou un couple lead + campagne pour `WRITE_OUTREACH`. Retourne publications courantes, sources, freshness, contradictions et provenance
|
|
266
|
-
| `get_context_workspace` | Lire le Context Workspace
|
|
266
|
+
| `compile_context_pack` | Compiler en lecture seule un Context Pack canonique depuis une cible explicite (`organization`, `lead_group`, `campaign`, `account`, `person`) ou un couple lead + campagne pour `WRITE_OUTREACH`. Retourne publications courantes, sources, freshness, contradictions et provenance, sans choisir de cible implicite. |
|
|
267
|
+
| `get_context_workspace` | Lire le seul Context Workspace encore exposé et versionné : le `company_brain` d'une organisation explicitement sélectionnée. Retourne le brouillon et la dernière version publiée ; l'historique GTM reste stocké mais n'est plus exposé. |
|
|
268
|
+
| `list_verticals` / `get_vertical` | Lister ou lire les Verticales JSON simples d’une organisation explicitement sélectionnée, avec leurs Personas et Offres liées. |
|
|
269
|
+
| `create_vertical` | Créer une Verticale tenant-scoped en `DRAFT`, sans activation ni sélection implicite. Son schéma JSON fermé porte les règles sectorielles et `commercialExperience` ; les métadonnées de preuve/source/provenance et les champs propres à l’Offre sont refusés. |
|
|
270
|
+
| `update_vertical` | Modifier le nom et/ou des clés JSON d’une Verticale après relecture. `expected_updated_at` est obligatoire ; une révision périmée est refusée avec `409` et impose une nouvelle lecture. Une Verticale `ACTIVE` repasse en `DRAFT`. |
|
|
271
|
+
| `change_vertical_status` | Passer une Verticale entre `DRAFT`, `ACTIVE` et `ARCHIVED` avec contrôle optimiste, readiness et protection des références. |
|
|
272
|
+
| `list_offers` / `get_offer` | Lister ou lire les Offres JSON simples tenant-scoped, leurs Verticales et leurs Lead Groups. |
|
|
273
|
+
| `create_offer` | Créer une Offre tenant-scoped en `DRAFT`, sans relation ni activation implicite. Son schéma JSON fermé est l'unique propriétaire des allégations, résultats démontrés et cas clients ; les Verticales référencent les identifiants de ces cas. |
|
|
274
|
+
| `update_offer` | Modifier le nom et/ou des clés JSON d’une Offre avec `expected_updated_at` obligatoire et refus `409` de toute écriture périmée. Une Offre `ACTIVE` repasse en `DRAFT`. |
|
|
275
|
+
| `change_offer_status` | Passer une Offre entre `DRAFT`, `ACTIVE` et `ARCHIVED` avec contrôle optimiste, readiness et protection des références. |
|
|
276
|
+
| `link_vertical_offer` / `unlink_vertical_offer` | Créer ou retirer la relation SQL tenant-scoped. Les `updatedAt` lus pour les deux objets sont obligatoires ; aucune relation cross-tenant ou dépendance Lead Group n’est contournée. |
|
|
277
|
+
| `preview_resolved_context` | Résoudre sans effet Company Brain + Verticale + Offre liée + Persona, ainsi que sender/CTA du Lead Group lorsqu'ils existent. Retourne le digest courant avec `dryRun:true`, `persisted:false`, `noSend:true`, `runtimeApplied:false` et `externalActivation:0`. |
|
|
267
278
|
| `list_canonical_relationships` | Lire les liens canoniques typés d'une organisation, dans les deux directions. |
|
|
268
279
|
| `create_canonical_relationship` | Créer un lien canonique tenant-scoped et idempotent entre deux identités fortes. |
|
|
269
280
|
| `update_canonical_relationship` | Modifier, restaurer ou tombstoner un lien via le ledger transactionnel partagé. |
|
|
@@ -271,20 +282,12 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
271
282
|
| `preview_canonical_relationship_migration` | Prévisualiser une migration de champs historiques, divergences et quarantaines comprises, sans mutation. |
|
|
272
283
|
| `apply_canonical_relationship_migration` | Appliquer exactement un plan prévisualisé et borné grâce à son digest. |
|
|
273
284
|
| `rollback_canonical_relationship_migration` | Tombstoner les liens créés par un plan de migration précis. |
|
|
274
|
-
| `update_company_brain_sections` | Modifier uniquement les sections
|
|
275
|
-
| `
|
|
276
|
-
| `
|
|
277
|
-
| `
|
|
278
|
-
| `
|
|
279
|
-
| `
|
|
280
|
-
| `update_company_info_constraint` | Add / replace / remove une seule contrainte dans snapshot.constraints[]. label + type enum + note≤150. Cap 10. |
|
|
281
|
-
| `update_company_info_product` | Add / replace / remove un seul produit dans products[]. category enum strict + regulatory sub-block. Cap 5. |
|
|
282
|
-
| `update_company_info_economics` | Patch du bloc economics (pricingModel, ticketRange, salesCycleMonths, triggers, defaultBaseline). |
|
|
283
|
-
| `update_company_info_product_icp` | Add / replace / remove un seul ICP dans productICPs[]. Lookup par productId (must match a products[].name). Cap 5. |
|
|
284
|
-
| `update_company_info_proof_wording` | Patch du bloc proofWording (keyMetrics, miniStories, forbiddenWords). |
|
|
285
|
-
| `upsert_persona` | Créer ou mettre à jour atomiquement un Persona, avec `schema_packs` obligatoire à la création. |
|
|
286
|
-
| `update_persona_schema_packs` | Remplacer uniquement les CRM Schema Packs d’un Persona et relire les preuves de readiness des groupes liés. |
|
|
287
|
-
| `get_persona` | Récupérer un persona par son ID. |
|
|
285
|
+
| `update_company_brain_sections` | Modifier uniquement les sections globales encore actives (`identity`, `positioning`, `allowedVocabulary`, `prohibitedVocabulary`, `legalConstraints`). Les anciennes sections Offre/Verticale sont filtrées et refusées. |
|
|
286
|
+
| `publish_context_workspace` | Publier une révision prête du Company Brain après confirmation explicite (`confirm_publish: true`). Admin de l'organisation requis ; les raisons de non-readiness sont renvoyées par le serveur. |
|
|
287
|
+
| `upsert_persona` | Créer ou mettre à jour un Persona strictement lié à une organisation et à une Verticale ; `schema_packs` est obligatoire à la création et `expected_updated_at` à chaque mise à jour. Les Personas globales ou orphelines ne sont jamais créées. |
|
|
288
|
+
| `change_persona_status` | Passer un Persona entre `DRAFT`, `ACTIVE` et `ARCHIVED` avec le même verrou `updated_at`, readiness et protection des références. |
|
|
289
|
+
| `update_persona_schema_packs` | Remplacer uniquement les CRM Schema Packs d’un Persona tenant-scoped avec `expected_updated_at`, puis relire la readiness des groupes liés. |
|
|
290
|
+
| `get_persona` | Récupérer un Persona par son ID et son organisation explicite. Les anciennes Personas globales/orphelines sont exclues. |
|
|
288
291
|
| `get_lead_group_persona` | Récupérer le persona assigné à un groupe de leads. |
|
|
289
292
|
| `list_data_sources` | Lister toutes les sources de données configurées (par pays puis nom). |
|
|
290
293
|
| `create_data_source` | Créer une nouvelle source de données (admin uniquement). |
|
|
@@ -298,7 +301,7 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
298
301
|
| `update_outreach_case_study` | Ajouter / remplacer / supprimer un case study par index, sans re-envoyer la liste. |
|
|
299
302
|
| `update_outreach_urls` | Patch booking_url et/ou website_url uniquement. |
|
|
300
303
|
| `set_outreach_connection_request` | Toggle du flag connectionRequestEnabled (LinkedIn invite vs cold DM). |
|
|
301
|
-
| `trigger_outreach` | Générer un message
|
|
304
|
+
| `trigger_outreach` | Générer un message via le runtime Write Outreach (dry-run par défaut). Le rédacteur libre peut fournir un `context_selection` complet Verticale–Offre–Persona ; aucun objet ou défaut n’est inféré. Avant une écriture, le runtime relit le digest et refuse toute persistance si le contexte a changé. |
|
|
302
305
|
| `append_fine_tuning` | Appendre du contenu à une section du Fine Tuning (nonNegotiableRules, pitfalls, structure, examples). Toujours en mode append — garantie contractuelle. |
|
|
303
306
|
| `set_fine_tuning_output_config` | Remplacer uniquement la configuration métier de sorties d’un Fine Tuning (`linkedinConnection`, `linkedinMessage`, `email`, activations et quantités). Préserve Markdown, langues et fallback ; ne génère, ne planifie, n’active ni n’envoie aucun outreach. |
|
|
304
307
|
| `pipeline_next_lead` | Sélectionner le prochain lead à traiter (score descendant, sans message). Exclusion des IDs déjà vus, limit 1-5. |
|
package/dist/server.js
CHANGED
|
@@ -17,6 +17,7 @@ import { registerLeadViewTools } from "./tools/views.js";
|
|
|
17
17
|
import { registerRelationshipTools } from "./tools/relationships.js";
|
|
18
18
|
import { registerCommercialTruthTools } from "./tools/commercial_truth.js";
|
|
19
19
|
import { registerEventTools } from "./tools/events.js";
|
|
20
|
+
import { registerContextEntityTools } from "./tools/context_entities.js";
|
|
20
21
|
import { MCP_SERVER_NAME, MCP_VERSION } from "./version.js";
|
|
21
22
|
export function createServer() {
|
|
22
23
|
const server = new McpServer({
|
|
@@ -37,6 +38,7 @@ export function createServer() {
|
|
|
37
38
|
registerSignalTools(server);
|
|
38
39
|
registerActivityTools(server);
|
|
39
40
|
registerContextWorkspaceTools(server);
|
|
41
|
+
registerContextEntityTools(server);
|
|
40
42
|
registerDataSourceTools(server);
|
|
41
43
|
registerPersonaTools(server);
|
|
42
44
|
registerPipelineTools(server);
|
package/dist/tools/campaigns.js
CHANGED
|
@@ -99,7 +99,8 @@ export function registerCampaignTools(server, readClient, writeClient, mutationC
|
|
|
99
99
|
server.tool("create_campaign", "Create a mono-channel DRAFT campaign with an explicit channel, optional ISO-8601 start/end " +
|
|
100
100
|
"window, and IANA timezone. startAt is inclusive and endAt is exclusive. Reaching endAt " +
|
|
101
101
|
"reversibly pauses the campaign with reason WINDOW_END while closure remains OPEN; it never " +
|
|
102
|
-
"creates the permanent closure report."
|
|
102
|
+
"creates the permanent closure report. The selected Lead Group already owns the Persona and " +
|
|
103
|
+
"Offer; Campaign never accepts an independent context selection.", {
|
|
103
104
|
name: z.string().describe("Campaign name."),
|
|
104
105
|
lead_group_id: z.string().describe("ID of the lead group to associate."),
|
|
105
106
|
channel: z.enum(["LINKEDIN", "EMAIL"]).describe("Required effective delivery channel. Create separate campaigns for LinkedIn and email."),
|
|
@@ -107,11 +108,7 @@ export function registerCampaignTools(server, readClient, writeClient, mutationC
|
|
|
107
108
|
end_at: z.string().datetime().optional().describe("Optional exclusive campaign end timestamp in ISO-8601 UTC; must be after start_at. Reaching it pauses, but does not close, the campaign."),
|
|
108
109
|
timezone: z.string().min(1).optional().describe("IANA timezone used for the campaign business window, for example Europe/Paris."),
|
|
109
110
|
description: z.string().optional().describe("Optional description."),
|
|
110
|
-
|
|
111
|
-
.string()
|
|
112
|
-
.optional()
|
|
113
|
-
.describe("ID of the persona to assign (optional)."),
|
|
114
|
-
}, async ({ name, lead_group_id, channel, start_at, end_at, timezone, description, persona_id }) => {
|
|
111
|
+
}, async ({ name, lead_group_id, channel, start_at, end_at, timezone, description }) => {
|
|
115
112
|
try {
|
|
116
113
|
const body = {
|
|
117
114
|
name,
|
|
@@ -126,8 +123,6 @@ export function registerCampaignTools(server, readClient, writeClient, mutationC
|
|
|
126
123
|
body.timezone = timezone;
|
|
127
124
|
if (description !== undefined)
|
|
128
125
|
body.description = description;
|
|
129
|
-
if (persona_id !== undefined)
|
|
130
|
-
body.personaId = persona_id;
|
|
131
126
|
const data = await (writeClient ?? getClient()).post("/api/campaign", body);
|
|
132
127
|
return toolResult(data);
|
|
133
128
|
}
|