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: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 MCPstructuredContent 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 resourceprescience://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 samematerials 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.