{"capabilities":{"pushNotifications":false,"streaming":false},"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"description":"Cross-tenant, read-only view of the BDR tenants: registry, ops MCP, dashboard.","name":"BDR Central Agent","preferredTransport":"JSONRPC","protocolVersion":"0.3.0","skills":[{"description":"DataPart {central_mode: 'list_tenants'} \u2192 the tenants this central agent knows (demo, kimchi, reportingmonetization) with their A2A URLs.","id":"list_tenants","name":"List BDR tenants","tags":["registry","tenants"]},{"description":"DataPart {central_mode: 'message-verify', text: '<context lines + instruction + full message>', tenant?: '<slug>'} \u2192 artifact 'message_verify': {code: 1, decision: 'Approved'} or {code: 2, decision: 'Not Approved', reason, violations: [{rule, quote, fix}]}. Checks: no surveillance implications, no competitor mentions, no sensitive security information requests, no signature, no unsupported technical claims, no false familiarity, no internal wording, plus the named tenant's own rules. Both results also carry rejection_probability (0-100, chance a human approver rejects the message) and rejection_reasoning (why, labelled 'Good: ...' and/or 'Bad: ...').","id":"message-verify","name":"Verify an outbound message","tags":["qa","compliance"]},{"description":"DataPart {central_mode: 'list_lists', tenant} \u2192 artifact 'lists': {tenant, lists: [{key, name, ingested, source_total}]}, the list tabs the dashboard shows. Use a key as `list` in sequence-qa.","id":"list_lists","name":"List a tenant's contact lists","tags":["registry","lists"]},{"description":"DataPart {central_mode: 'sequence-qa', tenant, list, channel: 'email'|'linkedin', touches?: [1..5], sample_size?: 1..5, contact_emails?, skill?} (at most 15 drafts) \u2192 artifact 'sequence_qa': {config, contacts (with contact QA), messages (drafted by the tenant's live eBDR pipeline, never sent, each with its quality gate and message-verify result), summary, recommendations, improved_examples (2 rewrites, re-checked)}. Can take several minutes.","id":"sequence-qa","name":"QA a sequence with simulated eBDR","tags":["qa","simulation","copy"]},{"description":"DataPart {central_mode: 'tenant-control-get', tenant} \u2192 artifact 'tenant_controls': {tenant, cards: {stopped, reason, updated_by, updated_at, env_disabled}, force_stop: {stopped, reason, updated_by, updated_at}, effective: {cards_enabled, proactive_enabled}}.","id":"tenant-control-get","name":"Get a tenant's Stop/Start switches","tags":["operations","tenants"]},{"description":"Bearer-protected. DataPart {central_mode: 'tenant-control-set', tenant, control: 'cards'|'force_stop', action: 'stop'|'start', by?, reason?} \u2192 artifact 'tenant_controls' (the new status). 'cards' stops new HITL approval cards. 'force_stop' idles the tenant: no duties, new drafts, new signals or reports; clicks on cards already in Slack still work and an approved email is still sent. Applies without a redeploy.","id":"tenant-control-set","name":"Stop or start a tenant's cards or all proactive work","tags":["operations","tenants"]},{"description":"Bearer-protected. DataPart {central_mode: 'qa-rule-add', tenant, instruction: '<what to reject, e.g. Don't permit any messages where the salutation is Good Day>', created_by?} \u2192 artifact 'qa_rule': {tenant, id, instruction, created_by, created_at, already_existed}. Stored in the tenant's own database; from then on message-verify rejects that tenant's messages that break it with the reason 'Rule <id> is violated'.","id":"qa-rule-add","name":"Add a restrictive QA rule for a tenant","tags":["qa","rules"]},{"description":"DataPart {central_mode: 'qa-rule-list', tenant} \u2192 artifact 'qa_rules': {tenant, built_in: [{id, name}], custom: [{id, instruction, created_by, created_at}]}. built_in includes the tenant's policy rules when it has a tenants/<slug>/message-verify.md.","id":"qa-rule-list","name":"List a tenant's active QA rules","tags":["qa","rules"]},{"description":"Bearer-protected. DataPart {central_mode: 'qa-rule-delete', tenant, id, deleted_by?} \u2192 artifact 'qa_rule_deleted': {tenant, id, deleted}. A deleted rule stops applying at once; built-in rules cannot be deleted.","id":"qa-rule-delete","name":"Delete a tenant's QA rule","tags":["qa","rules"]},{"description":"Same contract as ARIA, in three calls. DataPart {central_mode: 'writer-trigger', topic, prompt?, content_type?, writer_persona?, target_persona?, trigger_action_id?, tenant?} \u2192 artifact 'writer_trigger': {ok, trigger_action_id, content_id, status: 'accepted'}. Poll {central_mode: 'writer-status', trigger_action_id} \u2192 {status, pipeline_state, content_id} until 'completed' or 'failed'. Fetch {central_mode: 'writer-content', content_id} \u2192 {content_id, current_state, topic, latest_version: {title, body}}, the email as a JSON envelope in body. tenant picks whose etchmem memory is considered (default CENTRAL_DEFAULT_TENANT).","id":"writer","name":"Write an outbound message","tags":["writer","content"]},{"description":"DataPart {central_mode: 'weekly-report', week?} \u2192 artifact 'weekly_report': every business line's saved weekly numbers, overall totals and the previous week. {notify: true} (bearer) posts the 'report is ready' Slack link. Page: /dashboard/reports.","id":"weekly-report","name":"Combined weekly EBDR report","tags":["reports","weekly"]}],"url":"https://central.liftdigitalgroup.vossmoos.com","version":"0.1.0"}
