Skip to content

Job Public Relations

job_public_relations — G6 Public Relations job agent.

Cluster: Job Agents | Type: component | MCP Tools: 26

Overview

Domain-specialist job agent for public relations and communications professionals. Drafts press releases, manages communications campaigns, monitors media coverage and sentiment, coordinates events and spokesperson logistics, prepares media briefings, and analyses sentiment across channels — all within G6's safety-bounded, audit-trailed JobAgentBlock framework.

Production monitoring caveat

By default, this component is tuned for fast, reliable MCP onboarding and offline-safe operation. Media/search/debate integrations use local rules, persistence, and mock-safe fallbacks unless live integrations are explicitly enabled with G6_JOB_PUBLIC_RELATIONS_LIVE_INTEGRATIONS=1. Treat the default mode as a PR drafting, planning, sentiment, and workflow-support tool, not as validated production media monitoring. Before making production monitoring claims, validate the live connectors, source coverage, rate limits, alerting behavior, and data freshness against the user's actual PR workflow.

When to use:

  • Drafting press releases and media statements in response to announcements or crises
  • Monitoring earned-media coverage and sentiment across news and social channels
  • Coordinating media event logistics and preparing spokesperson Q&A briefing packs
  • Analysing share-of-voice and sentiment trends versus competitors

Example:

from mvp.job_public_relations import JobPublicRelationsBlock, JobPublicRelationsInput

block = JobPublicRelationsBlock()
result = block.infer(JobPublicRelationsInput(
    task="Draft a press release announcing the company's $50M Series B funding round and prepare spokesperson talking points",
    context={"company": "NovaTech AI", "amount_aud": 50_000_000, "lead_investor": "AustraliaVC"},
))
# result.ok → True; result.value → JobPublicRelationsOutput with result, artifacts

Works well with: job_framework, job_marketing, job_creative_media

Public API

JobPublicRelationsBlock(JobAgentBlock)

G6 Public Relations job agent — delegates to PR MCP block.

Field Type Default
name str 'job_public_relations'
sector SectorClassification field(default_factory=lambda: _SECTOR)
toolkit ToolkitSpec \| None field(default_factory=lambda: JOB_TOOLKITS.get('public_relations'))
mcp_module str 'mvp.job_public_relations.public_relations_mcp.server'
capabilities ClassVar[set[type]] {Extensible, HumanLearnable, Collaborative, ProblemSolvable, KnowledgeGrounded, Memorable, AgentCommunicable}

JobPublicRelationsInput(JobInput)

Input for the Public Relations job agent.

JobPublicRelationsOutput(JobOutput)

MediaDatabaseAdapter(ABC)

Abstract media database source.

Methods:

get_contact(contact_id: str) -> dict | None

Get a media contact by ID.

search_contacts(query: str, limit: int = 20) -> list[dict]

Search contacts by name, outlet, or beat.

get_outlet_info(outlet_name: str) -> dict | None

Get information about a media outlet.

list_contacts_by_beat(beat: str) -> list[dict]

List contacts covering a specific beat/topic.

InMemoryMediaAdapter(MediaDatabaseAdapter)

In-memory media adapter with sample data for testing.

Constructor:

Parameter Type Default
contacts list[dict] \| None None
outlets dict[str, dict] \| None None

Methods:

get_contact(contact_id: str) -> dict | None

search_contacts(query: str, limit: int = 20) -> list[dict]

get_outlet_info(outlet_name: str) -> dict | None

list_contacts_by_beat(beat: str) -> list[dict]

JobPublicRelationsMCPBlock(AIBlock[MCPJobPublicRelationsInput, MCPJobPublicRelationsOutput, dict])

26-op MCP block for the Public Relations job agent.

Field Type Default
name str 'job_public_relations_mcp'
state dict field(default_factory=dict)
db_path str ':memory:'
resource_bounds ResourceBounds field(default_factory=ResourceBounds)
usage ResourceUsage field(default_factory=ResourceUsage)

Methods:

infer(data: MCPJobPublicRelationsInput) -> Result[MCPJobPublicRelationsOutput]

MCPJobPublicRelationsInput(BaseModel)

Input to JobPublicRelationsMCPBlock — 26-op dispatch.

Field Type Default
op Literal['draft_release', 'manage_campaign', 'monitor_coverage', 'coordinate_event', 'prepare_briefing', 'analyze_sentiment', 'evaluate_reach', 'assess_impact', 'benchmark_coverage', 'audit_messaging', 'create_proposal', 'review_deliverable', 'delegate_task', 'report_status', 'request_feedback', 'store_artifact', 'retrieve_artifact', 'list_artifacts', 'search_artifacts', 'archive', 'plan_sprint', 'track_progress', 'reflect_on_outcome', 'get_capabilities', 'info', 'list_patterns'] required
task str ''
context dict[str, Any] Field(default_factory=dict)
parameters dict[str, Any] Field(default_factory=dict)
artifact_id str ''
query str ''
run_mode str 'beta'
reviewer_signature str ''

MCPJobPublicRelationsOutput(BaseModel)

Output from JobPublicRelationsMCPBlock.

Field Type Default
op str required
result str ''
artifacts list[dict[str, Any]] Field(default_factory=list)
records list[dict[str, Any]] Field(default_factory=list)
message str ''
count int 0
found bool False
metadata dict[str, Any] Field(default_factory=dict)
degraded bool False
degradation_reason str \| None None

PublicRelationsStore(JobStore)

SQLite store for the Public Relations job agent.

Constructor:

Parameter Type Default
db_path str ':memory:'

Methods:

save_media_contact(contact_id: str = '', name: str = '', outlet: str = '', role: str = '', beat: str = '', tier: int = 3, relationship_level: str = 'cold', contact_info: dict | None = None) -> str

Insert or replace a media contact. Returns the contact_id.

get_media_contact(contact_id: str) -> dict | None

Fetch a media contact by ID.

list_media_contacts(beat: str = '', tier: int = 0, outlet: str = '') -> list[dict]

List media contacts with optional filters.

delete_media_contact(contact_id: str) -> bool

Delete a media contact. Returns True if a row was removed.

update_media_contact_relationship(contact_id: str, relationship_level: str) -> bool

Update a contact's relationship level (cold/warm/hot/advocate).

save_press_release(release_id: str = '', headline: str = '', body: str = '', target_audience: str = '', distribution_channels: list[str] | None = None, embargo_date: str = '', status: str = 'draft', metrics: dict | None = None) -> str

Insert or replace a press release. Returns the release_id.

get_press_release(release_id: str) -> dict | None

Fetch a press release by ID.

list_press_releases(status: str = '') -> list[dict]

List press releases, optionally filtered by status.

update_press_release_status(release_id: str, status: str) -> bool

Update the status of a press release (draft/approved/distributed/archived).

delete_press_release(release_id: str) -> bool

Delete a press release. Returns True if a row was removed.

save_campaign(campaign_id: str = '', name: str = '', objective: str = '', key_messages: list[str] | None = None, channels: list[str] | None = None, stakeholders: list[str] | None = None, metrics: dict | None = None, status: str = 'planned') -> str

Insert or replace a campaign. Returns the campaign_id.

get_campaign(campaign_id: str) -> dict | None

Fetch a campaign by ID.

list_campaigns(status: str = '') -> list[dict]

List campaigns, optionally filtered by status.

update_campaign_status(campaign_id: str, status: str) -> bool

Update campaign status (planned/active/paused/completed/cancelled).

delete_campaign(campaign_id: str) -> bool

Delete a campaign. Returns True if a row was removed.

save_crisis_incident(incident_id: str = '', title: str = '', severity: int = 1, category: str = '', timeline: list[dict] | None = None, response_actions: list[dict] | None = None, status: str = 'open') -> str

Insert or replace a crisis incident. Returns the incident_id.

get_crisis_incident(incident_id: str) -> dict | None

Fetch a crisis incident by ID.

list_crisis_incidents(status: str = '', min_severity: int = 0) -> list[dict]

List crisis incidents with optional status and severity filters.

update_crisis_status(incident_id: str, status: str) -> bool

Update crisis incident status (open/monitoring/contained/resolved).

add_crisis_timeline_entry(incident_id: str, entry: dict) -> bool

Append a timeline entry to an existing crisis incident.

Insert or replace a media coverage record. Returns the coverage_id.

get_media_coverage(coverage_id: str) -> dict | None

Fetch a media coverage record by ID.

list_media_coverage(sentiment: str = '', coverage_type: str = '', outlet: str = '') -> list[dict]

List media coverage with optional filters.

get_coverage_summary() -> dict

Aggregate coverage statistics grouped by sentiment.

delete_media_coverage(coverage_id: str) -> bool

Delete a media coverage record. Returns True if a row was removed.

Functions

assemble_review_text(output: Any) -> str

Collect the reviewable free text from a JobPublicRelationsOutput (duck-typed).

assess_public_relations_output(output: Any, qa_block: Any | None = None, generate: Any | None = None) -> GroundedRunResult

Run grounded four-valued QA over a public-relations output.

MCP Tools

Operation Source
draft_release public_relations_mcp
manage_campaign public_relations_mcp
monitor_coverage public_relations_mcp
coordinate_event public_relations_mcp
prepare_briefing public_relations_mcp
analyze_sentiment public_relations_mcp
evaluate_reach public_relations_mcp
assess_impact public_relations_mcp
benchmark_coverage public_relations_mcp
audit_messaging public_relations_mcp
create_proposal public_relations_mcp
review_deliverable public_relations_mcp
delegate_task public_relations_mcp
report_status public_relations_mcp
request_feedback public_relations_mcp
store_artifact public_relations_mcp
retrieve_artifact public_relations_mcp
list_artifacts public_relations_mcp
search_artifacts public_relations_mcp
archive public_relations_mcp
plan_sprint public_relations_mcp
track_progress public_relations_mcp
reflect_on_outcome public_relations_mcp
get_capabilities public_relations_mcp
info public_relations_mcp
list_patterns public_relations_mcp