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.
save_media_coverage(coverage_id: str = '', outlet: str = '', headline: str = '', sentiment: str = 'neutral', reach: int = 0, ave: float = 0.0, link: str = '', coverage_type: str = 'earned', published_date: str = '', data: dict | None = None) -> str¶
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 |