Skip to main content
The broker MCP server gives an agent the same quoting and enrollment calls as the REST API, with the same answers. Tool arguments and results use snake_case field names; camelCase arguments are still accepted. It uses the Streamable HTTP transport in stateless mode: each request is one JSON-RPC 2.0 message sent with POST, and each response is JSON. There is no server-initiated stream, so GET returns 405.

Connect an agent

Add the server to an MCP client that supports HTTP servers with headers:
Use a test key (psk_test_...) while you build and a live key (psk_live_...) once Prescience has turned live mode on for your account; see Broker account setup. The Connect your agent tab of the partner portal shows the same URL and configuration. You can also call the server directly:

Tools

A key sees and can call only the tools its partner type and scope allow. tools/list returns that set; calling another tool returns the JSON-RPC error -32601 “This tool isn’t enabled for your partner type or API key.”

fit_check

Input, all optional: Output: { "fit": "strong" | "possible" | "poor", "reasons": [...] }. The criteria are on Fit guidelines.

quote_group

Input is the body of POST /quotes: company (name, domain, zip; optional external_id, rating_zip), census, and optionally plan_year_start_date, plan_design, current_coverage (the client’s current plan, compared beside the quote), view, fields and exclude. The tool finds or creates the group, replaces its census and quotes. Prescience prices the group’s market itself; market_plans is no longer used. The group is your group in the same mode with this company.external_id, else this company.domain, never an enrolled one; otherwise a new group is created. Asking again for the same group, census and pricing run returns the quote already made; a changed census or a new pricing run makes a new quote. Output when the quote is ready is the quote as Reading a quote describes it: quote_id, status, group_id, expires_at, census and, for Diamond and Value, plan_name, monthly_premium_cents, pmpm_cents, rates_by_household, deductible_cents, oop_max_cents and max_extra_cents. Descriptions, benefits and logos come with view full or from get_plan_details. While pricing the output is { status: "pricing", group_id, retry_after_seconds, message }. Wait retry_after_seconds, then call quote_group again with the same input, or call get_quote with the group_id.

Trim what comes back

view is numbers (the default) or full (adds what each plan is). Both quote tools take it, and fields and exclude work on top: fields returns only those fields, for example ["plans.pmpm_cents"]; exclude leaves some out, for example ["plans.logos"]. quote_id, group_id and status always come back. The two example responses are in Choose how much comes back. Nothing about other carriers’ plans is returned by the quote tools.

get_quote

Input: { "group_id"?, "quote_id"?, "view"?, "fields"?, "exclude"? }; send group_id or quote_id. With quote_id (from list_quotes; the group is found from it) it returns that quote, the same as GET /groups/{groupId}/quotes/{quoteId}. Without it, it returns the latest quote in the shape above. If rates have landed and no quote exists for the current census, it creates one; while rates are being fetched it returns the pricing status.

list_groups and get_group

list_groups takes { "limit"?, "cursor"? } and returns { "groups": [...], "count", "next_cursor" }, newest first; pass next_cursor as cursor for the next page (null on the last). get_group takes { "group_id": "..." } and returns one group. Both give the group as GET /groups and GET /groups/{groupId} do, with the same fields: id, mode, status, company_name, legal_entity_name, domain, external_id, address, contact, current_coverage, plan_design, move_forward, enrollment, census_member_count, company_state, created_at, updated_at, and for a broker market_plans (always 0; no longer used), rating_zip, pricing, enrolled, benefits_admin and latest_quote (quote_id, status, created_at, quote_pepm_cents, quote_annual_cents, plans_available). See Reading a group.

create_group and update_group

create_group takes the company’s details and creates a group with no census and no quote, the same as POST /groups: company_name, domain and contact (name, email) are required; external_id, legal_entity_name, address (zip is the headquarters ZIP), current_coverage and plan_design are optional. plan_design is what a carrier needs before it quotes: waiting_period, rehire_policy and employer_contribution (employee_pct, dependent_pct). update_group takes group_id and any of the same fields, the same as PATCH /groups/{groupId}: send only what changes, and a plan_design field sent as null is cleared. Moving the headquarters ZIP queues new pricing; the domain cannot change once the group is enrolled. Both return the group.

move_forward

Input: { "group_id": "...", "requested_by"?, "note"? }. Tells Prescience the client wants to move forward, the same as POST /groups/{groupId}/move-forward; Prescience sets up enrollment. It returns move_forward (status: "requested", requested_at, requested_by). Asking again changes nothing and returns the first request. Before the group has a quote for its current census it returns quote_not_ready; wait for the quote, then ask again.

get_census

Input: { "group_id": "..." }. Returns members (each with its member_id) and count, the same as GET /groups/{groupId}/census. Change it with edit_census.

list_quotes

Input: { "group_id": "...", "limit"?, "cursor"?, "view"?, "fields"?, "exclude"? }. Returns quotes (a group’s quotes, newest first, each as get_quote returns it, so the numbers by default), count and next_cursor (pass it as cursor for the next page; null on the last). The same as GET /groups/{groupId}/quotes.

edit_census

Input: { "group_id": "...", "members"?: [...], "remove"?: [...] }. members are added, or update the member with the same external_id (else email), in the census member shape; remove names members by member_id, external_id or email (more than one must all name the same member). Output: received, accepted, member_count, removed, not_found (positions in remove that matched nobody), errors (by index; valid rows are applied) and warnings. Quotes you already have are kept but no longer match the census: call get_quote or quote_group to price the new one. A group that is enrolled can’t be edited this way. This is the same as PUT /groups/{groupId}/census/members.

get_plan_details

Input: { "plan_id"?: "diamond" | "value" }. With plan_id it returns that plan, the same as GET /plans/{planId}; without it, { "plans": [...] } with both. Each plan has its name, description, benefits (coinsurance, HSA eligibility, features), member_terms, the employer contribution range, logos, a selling_guide link and disclaimers. They are the same for every group: call it once and cache the result. See Plan details.

submit_elections

Input: { "group_id": "...", "elections": [...] }. Each election has member_id or external_id, election (enrolled or waived), tier (employee_only, employee_spouse, employee_children or family), dependents, effective_date and waiver_reason, as in Partner-run enrollment. Output is that endpoint’s response, in snake_case.

Results and errors

Every tool result carries the data as MCP structuredContent and as a JSON text block, for clients that read only content. Every number comes from the stored quote record. A tool that fails returns a result with isError: true and { "error", "message", "details"? }, using the same codes as the REST API: invalid_request (with details naming each field), not_found, conflict, rate_limited (with retry_after_seconds) and market_unavailable. Protocol failures are JSON-RPC errors: -32700 (the body is not JSON, HTTP 400), -32600 (not a JSON-RPC message), -32601 (unknown method or tool) and -32602 (missing parameters). Batches are not supported and return HTTP 400. A request without a valid key returns 401, and a key that may not use the server returns 403 forbidden. MCP calls count toward the same per-key rate limits as the REST API; see Rate limits. Test mode is the key’s mode: test keys create test groups, send no email and move no money.

README resource

The agent instructions (when to quote, what to send, how to present the versions) are the MCP resource prescience://broker/readme, read with resources/read, and Markdown at GET /api/partner/v1/mcp/readme, which needs no key. The partner portal shows the same text under Fit guidelines. The server’s initialize instructions and the quote_group description also give the README URL, so an agent can find it without the resource.

Share quote materials

Broker quote tools return the same materials as REST: each row contains kind, title, page_url and pdf_url. Include these links when presenting a quote so the employer or employee can open the packet, health guide, network, overview and playbook. Use returned URLs without reconstructing their tokens. A pricing response can supply links that become available once pricing finishes. See Share quote materials for plan selection, forwarding and stale-input behavior.