@agifyai/leadify-mcp 8.5.5 → 8.6.2
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 +29 -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/events.js +10 -8
- package/dist/tools/leads.js +1 -3
- 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
|
```
|
|
@@ -209,6 +210,13 @@ des sélecteurs courants sans effacer son historique. Les champs legacy
|
|
|
209
210
|
restent disponibles pour compatibilité/export, mais ne sont jamais synchronisés
|
|
210
211
|
depuis ce modèle.
|
|
211
212
|
|
|
213
|
+
Il n’existe plus de score de confiance événementiel : le statut et ses preuves
|
|
214
|
+
portent seuls la validation utile. `Event.description` explique l’audience et
|
|
215
|
+
l’utilité de l’événement ; `activity_summary` explique ce que l’entreprise y
|
|
216
|
+
fait, présente ou cible. `proof_excerpt` reste l’extrait exact destiné aux
|
|
217
|
+
agents et à l’audit. `record_event_participations` sert aussi bien à créer une
|
|
218
|
+
participation qu’à ajouter une nouvelle preuve ou à corriger le snapshot.
|
|
219
|
+
|
|
212
220
|
Pour `add_leads` et `update_lead`, `location` utilise l’objet canonique
|
|
213
221
|
`{ city, region?, postalCode?, countryCode, street? }`. `city` et le code pays
|
|
214
222
|
ISO-2 `countryCode` sont obligatoires. La projection `geo` est calculée par
|
|
@@ -245,7 +253,7 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
245
253
|
| `get_campaign_logs` | Récupérer les logs de campagne avec filtres et pagination. |
|
|
246
254
|
| `delete_campaign_log` | Supprimer une entrée de log de campagne. |
|
|
247
255
|
| `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
|
|
256
|
+
| `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
257
|
| `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
258
|
| `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
259
|
| `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 +270,18 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
262
270
|
| `unipile_read_messages` | Lire les messages LinkedIn Unipile bornés d'un profil explicitement sélectionné. |
|
|
263
271
|
| `leadify_read_activity_feed` | Lire l'audit borné d'un lead ; le feed ne constitue jamais une preuve de réponse. |
|
|
264
272
|
| `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
|
|
273
|
+
| `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. |
|
|
274
|
+
| `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é. |
|
|
275
|
+
| `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. |
|
|
276
|
+
| `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. |
|
|
277
|
+
| `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`. |
|
|
278
|
+
| `change_vertical_status` | Passer une Verticale entre `DRAFT`, `ACTIVE` et `ARCHIVED` avec contrôle optimiste, readiness et protection des références. |
|
|
279
|
+
| `list_offers` / `get_offer` | Lister ou lire les Offres JSON simples tenant-scoped, leurs Verticales et leurs Lead Groups. |
|
|
280
|
+
| `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. |
|
|
281
|
+
| `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`. |
|
|
282
|
+
| `change_offer_status` | Passer une Offre entre `DRAFT`, `ACTIVE` et `ARCHIVED` avec contrôle optimiste, readiness et protection des références. |
|
|
283
|
+
| `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. |
|
|
284
|
+
| `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
285
|
| `list_canonical_relationships` | Lire les liens canoniques typés d'une organisation, dans les deux directions. |
|
|
268
286
|
| `create_canonical_relationship` | Créer un lien canonique tenant-scoped et idempotent entre deux identités fortes. |
|
|
269
287
|
| `update_canonical_relationship` | Modifier, restaurer ou tombstoner un lien via le ledger transactionnel partagé. |
|
|
@@ -271,20 +289,12 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
271
289
|
| `preview_canonical_relationship_migration` | Prévisualiser une migration de champs historiques, divergences et quarantaines comprises, sans mutation. |
|
|
272
290
|
| `apply_canonical_relationship_migration` | Appliquer exactement un plan prévisualisé et borné grâce à son digest. |
|
|
273
291
|
| `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. |
|
|
292
|
+
| `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. |
|
|
293
|
+
| `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. |
|
|
294
|
+
| `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. |
|
|
295
|
+
| `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. |
|
|
296
|
+
| `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. |
|
|
297
|
+
| `get_persona` | Récupérer un Persona par son ID et son organisation explicite. Les anciennes Personas globales/orphelines sont exclues. |
|
|
288
298
|
| `get_lead_group_persona` | Récupérer le persona assigné à un groupe de leads. |
|
|
289
299
|
| `list_data_sources` | Lister toutes les sources de données configurées (par pays puis nom). |
|
|
290
300
|
| `create_data_source` | Créer une nouvelle source de données (admin uniquement). |
|
|
@@ -298,7 +308,7 @@ Leadify et ne doit jamais être envoyée par un agent MCP.
|
|
|
298
308
|
| `update_outreach_case_study` | Ajouter / remplacer / supprimer un case study par index, sans re-envoyer la liste. |
|
|
299
309
|
| `update_outreach_urls` | Patch booking_url et/ou website_url uniquement. |
|
|
300
310
|
| `set_outreach_connection_request` | Toggle du flag connectionRequestEnabled (LinkedIn invite vs cold DM). |
|
|
301
|
-
| `trigger_outreach` | Générer un message
|
|
311
|
+
| `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
312
|
| `append_fine_tuning` | Appendre du contenu à une section du Fine Tuning (nonNegotiableRules, pitfalls, structure, examples). Toujours en mode append — garantie contractuelle. |
|
|
303
313
|
| `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
314
|
| `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
|
}
|