Job Sales¶
job_sales — G6 Sales job agent.
Cluster: Job Agents | Type: component | MCP Tools: 26
Overview¶
Domain-specialist job agent for sales professionals and account executives. Qualifies inbound leads, drafts tailored proposals, forecasts pipeline by stage, negotiates deal terms, tracks closed deals, and analyses funnel conversion metrics — providing a structured sales-process workflow within G6's safety-bounded, audit-trailed JobAgentBlock framework.
Launch readiness caveat
job_sales is functionally useful for local MCP pilots and design-partner workflows, and its handlers tolerate common non-developer input formats such as currency strings, percentages, and partially malformed CRM exports. The remaining caveat is test-feedback speed rather than a known runtime defect: the focused sales test suite currently takes about 2.5 minutes on the reference Windows workstation. Treat this as a CI/developer-experience warning before tightening warning-as-error or per-component gating, not as a blocker for first-user sales workflows.
When to use:
- Qualifying a new lead against ICP criteria and generating a personalised outreach brief
- Drafting a structured commercial proposal with pricing, scope, and terms
- Forecasting quarterly pipeline revenue by probability-weighted stage
- Analysing funnel conversion rates to identify the largest drop-off point
Example:
from mvp.job_sales import JobSalesBlock, JobSalesInput
block = JobSalesBlock()
result = block.infer(JobSalesInput(
task="Qualify the inbound lead from GlobalRetail Ltd and draft a discovery-call brief with recommended qualification questions",
context={"lead_company": "GlobalRetail Ltd", "annual_revenue_aud": 120_000_000, "pain_points": ["inventory visibility", "supplier onboarding"]},
))
# result.ok → True; result.value → JobSalesOutput with result, artifacts
Works well with: job_framework, job_marketing, job_business
Public API¶
JobSalesBlock(JobAgentBlock)¶
G6 Sales job agent — delegates to Sales MCP block.
| Field | Type | Default |
|---|---|---|
name | str | 'job_sales' |
sector | SectorClassification | field(default_factory=lambda: _SECTOR) |
toolkit | ToolkitSpec \| None | field(default_factory=lambda: JOB_TOOLKITS.get('sales')) |
mcp_module | str | 'mvp.job_sales.sales_mcp.server' |
capabilities | ClassVar[set[type]] | {Extensible, HumanLearnable, Collaborative, ProblemSolvable, KnowledgeGrounded, Memorable, AgentCommunicable} |
Methods:
infer(data)¶
JobSalesInput(JobInput)¶
Input for the Sales job agent.
JobSalesOutput(JobOutput)¶
JobSalesMCPBlock(AIBlock[MCPJobSalesInput, MCPJobSalesOutput, dict])¶
26-op MCP block for the Sales job agent.
| Field | Type | Default |
|---|---|---|
name | str | 'job_sales_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: MCPJobSalesInput) -> Result[MCPJobSalesOutput]¶
MCPJobSalesInput(BaseModel)¶
Input to JobSalesMCPBlock — 26-op dispatch.
| Field | Type | Default |
|---|---|---|
op | Literal['qualify_lead', 'draft_proposal', 'forecast_pipeline', 'negotiate_terms', 'close_deal', 'analyze_funnel', 'evaluate_territory', 'assess_opportunity', 'benchmark_quota', 'audit_crm', '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 | '' |
MCPJobSalesOutput(BaseModel)¶
Output from JobSalesMCPBlock.
| 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 |
completion_state | Literal['verified', 'qualified-draft', 'blocked-escalated'] | 'qualified-draft' |
warning_card | dict[str, Any] \| None | None |
request_id | str | '' |
run_id | str | '' |
SalesStore(JobStore)¶
SQLite store for the Sales job agent.
Constructor:
| Parameter | Type | Default |
|---|---|---|
db_path | str | ':memory:' |
Methods:
create_lead(name: str, company: str = '', source: str = '', score: float = 0, status: str = 'new', contact: dict | None = None, data: dict | None = None) -> str¶
get_lead(lead_id: str) -> dict | None¶
list_leads(status: str = '', limit: int = 100) -> list[dict]¶
update_lead(lead_id: str, **fields: Any) -> bool¶
create_opportunity(lead_id: str = '', title: str = '', value: float = 0, stage: str = 'prospecting', probability: float = 0, close_date: str = '', products: list | None = None, data: dict | None = None) -> str¶
get_opportunity(opp_id: str) -> dict | None¶
list_opportunities(stage: str = '', lead_id: str = '', limit: int = 100) -> list[dict]¶
update_opportunity(opp_id: str, **fields: Any) -> bool¶
log_activity(opp_id: str = '', activity_type: str = '', subject: str = '', outcome: str = '', next_steps: str = '', activity_date: str = '', data: dict | None = None) -> str¶
get_activities(opp_id: str = '', activity_type: str = '', limit: int = 100) -> list[dict]¶
create_quotation(opp_id: str = '', items: list | None = None, subtotal: float = 0, discount: float = 0, tax: float = 0, total: float = 0, valid_until: str = '', status: str = 'draft') -> str¶
get_quotation(quote_id: str) -> dict | None¶
list_quotations(opp_id: str = '', status: str = '', limit: int = 50) -> list[dict]¶
save_pipeline_snapshot(period: str, stages: dict | None = None, total_value: float = 0, weighted_value: float = 0, win_rate: float = 0, data: dict | None = None) -> str¶
get_pipeline_snapshots(period: str = '', limit: int = 50) -> list[dict]¶
Functions¶
assemble_review_text(output: Any) -> str¶
Collect the reviewable free text from a JobSalesOutput (duck-typed).
assess_sales_output(output: Any, qa_block: Any | None = None, generate: Any | None = None) -> GroundedRunResult¶
Run grounded four-valued QA over a sales output.
MCP Tools¶
| Operation | Source |
|---|---|
qualify_lead | sales_mcp |
draft_proposal | sales_mcp |
forecast_pipeline | sales_mcp |
negotiate_terms | sales_mcp |
close_deal | sales_mcp |
analyze_funnel | sales_mcp |
evaluate_territory | sales_mcp |
assess_opportunity | sales_mcp |
benchmark_quota | sales_mcp |
audit_crm | sales_mcp |
create_proposal | sales_mcp |
review_deliverable | sales_mcp |
delegate_task | sales_mcp |
report_status | sales_mcp |
request_feedback | sales_mcp |
store_artifact | sales_mcp |
retrieve_artifact | sales_mcp |
list_artifacts | sales_mcp |
search_artifacts | sales_mcp |
archive | sales_mcp |
plan_sprint | sales_mcp |
track_progress | sales_mcp |
reflect_on_outcome | sales_mcp |
get_capabilities | sales_mcp |
info | sales_mcp |
list_patterns | sales_mcp |