What the request_proposal MCP tool does
- Use it when: the user says they want to proceed, for example "Send me a proposal for this team."
- Never use it: speculatively, to "save" a search, or without the user seeing the summary.
Input
| Field | Type | Required | Notes |
|---|---|---|---|
quote_id | string | One of quote_id or roles | From estimate_squad_cost, valid 30 days |
roles | object[] | One of quote_id or roles | Same shape as estimate_squad_cost |
contact | object | Yes | name, work_email, company, country |
notes | string | No | Up to 2,000 characters: goals, stack, constraints |
preferred_language | enum | No | en or ar |
user_confirmation | object | Yes | confirmed: true, plus summary_shown: the exact text the user approved |
Output
proposal_id(e.g. prop_K29XQ)
draft_pending_verification (anonymous) or draft_in_client_os (OAuth)magic_link_sent_to: masked email, e.g. n***@company.comlink_expires_in_hours: 24next_steps[]: e.g. Open the link to verify your email. · Review the squad and add details. · A Remote Pro Ai specialist confirms pricing before anything is binding.
Example
After pricing a squad, the assistant shows the user: "I'll create a draft proposal for 2 Senior and 1 Lead cloud engineers (quote q_7HD29K) and email a link to nadia@company.com. OK?" The user replies "Yes". The assistant calls request_proposal with quote_id q_7HD29K, the contact details, notes about a Kubernetes migration, and user_confirmation set to confirmed true with that exact summary. The response returns proposal_id prop_K29XQ, status draft_pending_verification, the masked email and a link that expires in 24 hours.
Request
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "request_proposal",
"arguments": {
"quote_id": "q_7HD29K",
"contact": {
"name": "Nadia",
"work_email": "nadia@company.com",
"company": "Company",
"country": "SA"
},
"notes": "Kubernetes migration",
"preferred_language": "en",
"user_confirmation": {
"confirmed": true,
"summary_shown": "I'll create a draft proposal for 2 Senior and 1 Lead cloud engineers (quote q_7HD29K) and email a link to nadia@company.com. OK?"
}
}
}
}Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "Draft proposal created. A link was sent to n***@company.com."
}
],
"structuredContent": {
"proposal_id": "prop_K29XQ",
"status": "draft_pending_verification",
"magic_link_sent_to": "n***@company.com",
"link_expires_in_hours": 24,
"next_steps": [
"Open the link to verify your email.",
"Review the squad and add details.",
"A Remote Pro Ai specialist confirms pricing before anything is binding."
]
}
}
}Errors
consent_required: Show the user a summary of what will be created and where the link will be sent, then call again with user_confirmation.invalid_argument: contact.work_email must be a valid email address.quote_expired: This quote_id expired. Create a new estimate before requesting a proposal.rate_limited: Proposal limit reached for this email address. Try again in retry_after minutes.
Consent and human approval
- Annotations: not read-only, not idempotent. Hosts should ask the user before running it.
- Anonymous calls email a magic link; the draft is visible only after the user verifies their email.
- With OAuth (proposals:write), the draft files straight into the organisation's Client OS for the user to review.
- Every draft is reviewed by a Remote Pro Ai specialist before any quotation is issued. The assistant never books, signs or pays.
- Limit: 5 proposals per hour per email address.