Every tool the 1099Policy MCP server offers, with what it takes, what it returns, and the REST endpoint behind it. For connecting and approving an assistant, see MCP server; for what to do when something does not work, see troubleshooting.
How answers are built
The tools are written so that an assistant cannot easily mislead you about insurance. These behaviours are worth knowing:
- A page is not the account. Every list returns
complete. When it is false the assistant is holding one page and must fetch more before answering a count or an absence; a contractor missing from one page is not a contractor without coverage. - Whole-account questions have their own tool. Who has no coverage? is answered by
findCoverageGaps, which sweeps every contractor, policy, and quote and matches them itself, rather than by comparing two lists by hand. It counts 1099Policy policies: a contractor insured through their own approved certificate is listed as having no policy — ask about that person and the assistant reads the certificate. - Coverage is traced policy → quote → contractor. A policy does not name its contractor directly; the quote it was bound from does. Assignments are a different relationship and are not used to decide who is covered.
- Expired is not active. A policy past its expiration date is never reported as active, whatever a flag on the record says.
- Dates are given to you readable. Every date field comes with a
*Readabletwin (expirationDateReadable: "2027-07-10"), so nothing has to convert a timestamp in its head. - A quote is a rate.
getQuotereturns net rates applied to the wage, not a premium; the assistant will say the rate and that the premium depends on the wage. - A write is done when the API says so.
bindAssignmentreturnsbound,cancelAssignmentreturnscancelled; when either is false the record was created but coverage was not bound or not ended, and thenotesays why. - Binding attaches, it does not buy. A contractor with an active policy is bound with
bindAssignment; a contractor with none is sent an application withcreateApplySession, enrols, and only then can be bound. - Ambiguity is a question, not a guess. Two contractors with the same name, a missing date, a category code the account has not configured — the assistant tells you what is missing rather than inventing it.
Tool reference
Thirty tools, one per action. Read tools run without confirmation. Write tools are served only to connections approved for Make changes (or to an API key with write permission) and are annotated so the client confirms before running them.
Each tool is a thin wrapper over one or two REST endpoints, listed under Backed by; paths are relative to https://api.1099policy.com/api/v1. The API reference is the source of truth for each endpoint's full parameters, response shape, and errors. The inputs below are the tool's own schema — the same text the assistant reads.
Coverage
checkCoverage — Check contractor coverage
Verify whether a contractor (or the account) has active insurance coverage, and of which types.
- Access: Read
- Backed by:
GET /contractors/{id}/policieswhen a contractor is given, otherwiseGET /policies; coverage types are read from each policy's quote. - Inputs:
contractor— Contractor public id (cn_…). Omit to check the whole account.coverageType— Only report policies that include this coverage type. One of:workers-comp,general,professional,media,cyber.activeOnly— When true (default), drop inactive/expired policies from the result. Defaulttrue.limit— Maximum number of policies to return (1-100). Default25.
- Returns:
hasActiveCoverage,count, andpolicies[]— each with its coverage types and effective/expiration dates (with*Readabletwins). Scoped to one contractor whencontractoris given, otherwise the account.
findCoverageGaps — Find contractors without active coverage
Answer "who has no active coverage", "how many of my contractors are covered", or "are there any coverage gaps" for the whole account.
- Access: Read
- Backed by:
GET /policies,GET /quotes,GET /contractors— every page of each. - Inputs:
includeCovered— Also list the covered contractors, not just the counts. Defaultfalse.maxRecords— Safety bound per collection swept. Default1000.
- Returns:
totalContractors,coveredCount,uncoveredCount, theuncovered[]list (id, name, email),covered[]when asked for, andcomplete— false only if the safety bound was hit. Counts 1099Policy policies; a contractor insured through their own approved certificate appears inuncovered(see How answers are built).
listActivePolicies — List active policies
List the account's active insurance policies with the contractor each one covers, its coverage types, and effective/expiration dates.
- Access: Read
- Backed by:
GET /policies; coverage types are read from each policy's quote. - Inputs:
includeInactive— When true, also include inactive/expired policies. Defaultfalse.limit— Max policies to return (1-100). Default25.
- Returns:
count,complete, andpolicies[]with the contractor each covers, coverage types, and dates.
Certificates
getAssignmentCertificate — Get an assignment's 1099Policy-issued COI
Return the signed PDF download link(s) for the certificate of insurance (COI) that 1099Policy issued when this assignment's coverage was bound.
- Access: Read
- Backed by:
GET /assignments/{id}→GET /policies/{id}. There is no issue endpoint: the certificate is produced by binding and this tool reads back the links. - Inputs:
assignment(required) — Assignment public id (an_…) whose COI you want.
- Returns:
ready,coiPdfUrl(the signed download link) andcoiUrlsper coverage type, or anotewhen the certificate is not yet issued.
getCertificate — Get an uploaded certificate and its review
Fetch one contractor-uploaded certificate of insurance by id, with its review status and results.
- Access: Read
- Backed by:
GET /files/certificates/{id}?expand[]=review_results - Inputs:
certificate(required) — Certificate public id (ci_…) from listCertificates.
- Returns:
status,settled,pdfUrl, andreviewResults[]— each requirement with pass/fail and the reason. Anotesays when review has not finished.
listCertificates — List submitted certificates (with review)
List contractor-provided COIs with their review results — which insurance requirements passed or failed, and why.
- Access: Read
- Backed by:
GET /files/certificates(expandingreview_results) - Inputs:
contractor— Only certificates for this contractor (cn_…).limit— Max certificates to return (1-100). Default25.
- Returns:
count,complete, andcertificates[]with status and review results.
submitCertificate — Submit a certificate for review (writes)
Submit a contractor's own certificate of insurance (COI) for asynchronous evaluation against your insurance requirements.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /files/certificates - Inputs:
certificate(required) — File id of the uploaded certificate PDF. Uploading the PDF itself is not an MCP tool: the file id comes from the upload flow in the dashboard or the REST API, and is passed here.contractor(required) — Contractor public id (cn_…) the certificate belongs to.
- Returns:
id,status, and anote: review runs asynchronously — read the outcome withlistCertificatesorgetCertificate.
Contractors
listContractors — List or find contractors
List contractors on the account, or find one by id, email, or name.
- Access: Read
- Backed by:
GET /contractors - Inputs:
query— Match a single contractor by public id (cn_…), email, or name (case-insensitive substring).limit— Max contractors to return when listing (1-100). Default25.
- Returns:
count,complete, andcontractors[](id, name, email, company, state).
createContractor — Create a contractor (writes)
Add a contractor to the account with their contact and address details.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /contractors - Inputs:
firstName(required) — Contractor's first name.lastName(required) — Contractor's last name.email(required) — Contractor's email address.address(required) — Contractor's residence address:line1,line2(optional),locality(city),region(state, e.g.CA),postalcode, andcountry(ISO code, defaultUS).companyName— Business name, if the contractor operates as an entity.middleName— Contractor's middle name.phone— Contractor's phone number.withholdPremium— Whether to withhold the insurance premium from the payout.
- Returns: The new contractor's
id,email, andname.
createLoginLink — Create a contractor login link (writes)
Generate a one-time login link so a contractor can access their own portal. The link is returned to you; nothing is sent to the contractor.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /contractors/{id}/login_link - Inputs:
contractor(required) — Contractor public id (cn_…) to mint a login link for.redirectUrl— URL to send the contractor to after they sign in.
- Returns: The one-time
urlfor that contractor.
Jobs
listJobs — List or find jobs
List the account's jobs, or find one by id or name, with its category code and coverage details.
- Access: Read
- Backed by:
GET /jobs - Inputs:
query— Match a single job by public id (jb_…) or name (case-insensitive substring).limit— Max jobs to return when listing (1-100). Default25.
- Returns:
count,complete, andjobs[](id, name, entity, category code, wage, wage type, state).
createJob — Create a job (writes)
Create a job with a work category, entity, wage, and coverage details.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /jobs - Inputs:
name(required) — Job name / title.description(required) — Description of the work.entity(required) — Entity public id (en_…) the job runs under.categoryCode(required) — Work classification code (see listCategoryCodes).wage(required) — Wage amount in the smallest currency unit (integer).wageType(required) — How the wage is expressed, e.g.flat,hourly,daily— match the account's accepted wage types.yearsExperience— Contractor years of experience the job assumes.withholdPremium— Who pays the premium.
- Returns: The new job's
id,name,entity, andcategoryCode.
listCategoryCodes — List work category codes
Look up 1099Policy's approved work classification (category) codes when creating or matching a job.
- Access: Read
- Backed by:
GET /category_codes - Inputs:
query— Filter by code or name (case-insensitive substring), e.g.photographyor a partial code.limit— Max category codes to return (1-100). Default50.
- Returns:
countandcategoryCodes[](code, name). Empty when the account has none configured yet — a job cannot be created until one is added in the dashboard.
Quotes
getQuote — Quote coverage (no binding)
Price insurance coverage for a contractor on a job and check eligibility, without binding anything.
- Access: Read (creates a quote record; binds nothing)
- Backed by:
POST /quotes - Inputs:
job(required) — Job public id (jb_…) the work falls under.contractor(required) — Contractor public id (cn_…) to cover.coverageType(required) — One or more coverage types to price. Each one of:workers-comp,general,professional,media,cyber.effectiveDate— Coverage start as a Unix timestamp (seconds).endDate— Coverage end as a Unix timestamp (seconds).
- Returns:
quoteId,eligible,coverageTypes, and the rates:netRate,wcNetRate,glNetRate, plus arateNote. Rates are applied to the wage; there is no premium figure in a quote.
listQuotes — List quotes
List previously generated quotes with their pricing, eligibility, coverage types, and effective window.
- Access: Read
- Backed by:
GET /quotes - Inputs:
limit— Max quotes to return (1-100). Default25.
- Returns:
count,complete, andquotes[]with rates, eligibility, coverage types, and window.
Assignments
listAssignments — List assignments
List assignments — each ties a contractor to a job over a coverage window, optionally with a bound policy.
- Access: Read
- Backed by:
GET /assignments - Inputs:
limit— Max assignments to return (1-100). Default25.
- Returns:
count,complete, andassignments[]— contractor, job, coverage window, and the bound policy where there is one.
bindAssignment — Bind an assignment (writes coverage)
Place a contractor on a job and bind their insurance coverage.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /assignments - Inputs:
contractor(required) — Contractor public id (cn_…) to place.job(required) — Job public id (jb_…) the contractor is placed on.coverageType— Coverage types to bind. Each one of:workers-comp,general,professional,media,cyber.effectiveDate(required) — Coverage start as a Unix timestamp (seconds).endDate(required) — Coverage end as a Unix timestamp (seconds).bind— When true (default), bind coverage now. Defaulttrue.
- Returns:
bound— true only when the API bound coverage — plus the assignment and policy ids and anote. Whenboundis false the note says why: the contractor is already covered, has no policy of ours to attach, or the placement did not fully process.
extendAssignment — Extend an assignment (writes coverage window)
Extend an active assignment's coverage end date.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /assignments/extend - Inputs:
job(required) — Job public id (jb_…) whose assignment should be extended.endDate(required) — New coverage end date as a Unix timestamp (seconds).sendEmail— Whether to email the contractor about the extension.
- Returns:
extended, the assignment id, the newendDate, andstatus.
cancelAssignment — Cancel an assignment (writes, ends coverage)
Cancel an assignment and end its insurance coverage.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /assignments/cancel - Inputs:
job(required) — Job public id (jb_…) whose assignment should be cancelled.reason— Human-readable reason for the cancellation.
- Returns:
cancelled— true only when the API reports it — withcancelledAt, or anotewhen coverage may still be active.
Enrollment
listApplySessions — List application sessions (who has not enrolled yet)
List contractors' insurance applications and how far each has got — who was sent a link, who is still outstanding, who has completed and been issued a policy, and how many days each has been waiting.
- Access: Read
- Backed by:
GET /apply/sessions - Inputs:
status— Which applications to return. One of:outstanding,completed,expired,all. Defaultoutstanding.contractor— Contractor public id (cn_…) to narrow to one person.limit— Max sessions to return (1-100). Default50.
- Returns:
statusfilter echoed back,count,complete, andsessions[]— contractor,step,daysSinceSent,url,expired,enrolled, and the policy once one exists.
getApplySession — Get an application session's status
Check where a contractor is in the application flow — the current step (e.g. sent, opened, completed) and whether the session has expired.
- Access: Read
- Backed by:
GET /apply/sessions/{id} - Inputs:
session(required) — Application session public id (as_…) to inspect.
- Returns:
step,url,expired,enrolled, thequoteand (once issued) thepolicy, andcreated/createdReadable.
createApplySession — Start an application session (writes)
Start an application (opt-in) session and return the link a contractor uses to complete enrollment.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /apply/sessions - Inputs:
quote(required) — Quote public id (qt_…) the application is based on.contractor— Contractor public id (cn_…) the session is for.successUrl— URL to redirect the contractor to after they complete.cancelUrl— URL to redirect the contractor to if they cancel.isGeneralOptIn— Whether this is a general opt-in (not tied to one job).generalOptInWorkState— Work state for a general opt-in, e.g.CA.
- Returns:
id, the applicationurlto send the contractor, the currentstep, andexpired.
Billing
listInvoices — List invoices
List premium invoices — each states what a contractor owes for a pay cycle, computed from their gross pay, with the pay-cycle window and purchase order number.
- Access: Read
- Backed by:
GET /invoices - Inputs:
limit— Max invoices to return (1-100). Default25.
- Returns:
count,complete, andinvoices[]— premium due, gross pay, pay-cycle window, and purchase order number, per contractor. These are the contractors' premium invoices, not the account holder's own bill.
Account and team
listEntities — List or find entities
List the business entities on the account (for organizations that run more than one), or find one by id or name.
- Access: Read
- Backed by:
GET /entities - Inputs:
query— Match a single entity by public id or name (case-insensitive substring).limit— Max entities to return when listing (1-100). Default25.
- Returns:
count,complete, andentities[]withrequiredCoverage,coverageLimit, andstate.
listTeamMembers — List team members
List the team members on the account — the dashboard users attached to the active organization, with their role, plus anyone invited who has not accepted yet.
- Access: Read
- Backed by:
GET /team-members - Inputs:
query— Match a single member by email or name (case-insensitive substring).includeInvited— Include people invited but not yet accepted (statusinvited). Defaulttrue.limit— Max members to return (1-100). Default100.
- Returns:
count,active,invited, andteamMembers[](email, name, role, status).
inviteTeamMember — Invite a team member
Send an invitation to join the active organization as a member or owner.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /team-members - Inputs:
email(required) — The email address to invite.role— Role on the organization. One of:member,owner. Defaultmember.
- Returns:
invited,email,role,status, and anote: the invitation email is sent; they become a member when they accept.
removeTeamMember — Remove a team member
Remove a person from the active organization by email.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
DELETE /team-members - Inputs:
email(required) — The email address to remove.
- Returns:
removed,email, and anotesaying whether a member was removed or a pending invitation withdrawn. An organization key cannot remove an owner.
getAuditTrail — Get account audit trail
Return recent events from the account's audit trail (policies bound, assignments created, invoices posted, …), newest first.
- Access: Read
- Backed by:
GET /events - Inputs:
type— Case-insensitive filter on the event type, e.g.policy,assignment,invoice.limit— Max events to return, newest first (1-100). Default25.
- Returns:
countandevents[]— type,created/createdReadable, and the event's data.
listAccounts — List connected organizations
List the 1099Policy organizations this connection can act on and show which one is currently active.
- Access: Read
- Backed by: none — reads the connection's own state.
- Inputs: none
- Returns:
count, theactiveorganization, andaccounts[](label, live or sandbox, active).
useAccount — Switch to another connected organization
Switch which connected 1099Policy organization the other tools act on.
- Access: Read
- Backed by: none — changes the connection's own state.
- Inputs:
account(required) — Which organization to switch to, as its position in listAccounts (1 for the first). Call listAccounts first — positions are only meaningful against that list.
- Returns:
switched, the now-activeorganization, and the list. If the client refreshes its access token the connection returns to the organization it was connected with — confirm withlistAccountsin a long session.
Talking to it
Ask in plain language. The assistant turns the request into a tool call and reports what the tool returned — never more than it returned.
Which organizations am I connected to?
Lists them and says which one is active.
Switch to Northwind, then show me who has no coverage.
Switches the active organization and answers there.
Does the videographer we booked in PA have active WC and GL for Saturday's shoot?
Finds the contractor, checks their active policies for workers' comp and general liability, and answers yes or no — with the policy and its dates.
Who on the account has no active coverage right now?
Sweeps every contractor, policy and quote — every page, not the first — and returns the ones with nothing active, with the count.
Alvarez uploaded his own COI. Did it meet our GL requirements?
Returns the certificate's review: which requirements passed, which failed, and by how much. A contractor whose own certificate was approved is reported as insured, even though no 1099Policy policy is attached.
Which freelancers still haven't finished their insurance application, and how long have they been sitting on it?
Lists the outstanding applications with the step each stopped at and the days since the link was sent.
What would it cost to cover Rivera, the freelance set designer, on the Denver install through end of quarter?
Prices the coverage and checks eligibility without binding anything. It reports rates, not a dollar figure — the premium depends on the wage.
Pull the certificate of insurance for Rivera's Denver install.
Returns the signed PDF download links for the COI issued when her coverage was bound.
What premium was invoiced for June?
Lists June's premium invoices — what each contractor owed for the pay cycle. These are the contractors' invoices, not the agency's own bill.
With a connection you approved for Make changes:
Rivera accepted. Bind her coverage for the Denver install, March 3 through 14.
Confirms the details with you, binds the assignment, and reports what came back — bound, or the reason it was not. Someone who has never enrolled has nothing to attach, so instead of attempting a bind that cannot succeed it offers to send them an application link.
The mural ran long. Extend Chen's coverage through the 15th.
Extends the assignment's coverage window.
Send Priya an application link for the copywriting engagement.
Starts an application session and returns the link she completes.
Add dana@studio.example to the team as a member, on every organization I manage.
Invites her to each one, switching organizations as it goes.
Questions
Email integration@1099policy.com.
