Search docs...

MCP tool reference

MCP tool reference

Every tool the 1099Policy MCP server offers: inputs, returns, and the REST endpoint behind each.

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. A list's counts cover every match, but its rows are one page. When a result carries nextOffset, more rows remain, and the assistant fetches them 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. checkCoverage answers for one named contractor. The sweep 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.
  • Active follows 1099Policy, not the calendar. A policy is active until it is cancelled. The expiration date on a policy is shown for reference and is never used to decide whether coverage is current.
  • Dates are given to you readable. Every date field comes with a *Readable twin (expirationDateReadable: "2027-07-10"), so nothing has to convert a timestamp in its head.
  • An estimate is a price in dollars. estimatePremium returns the estimated premium for the job, taxes and fees included, with the wage it is based on; the assistant says it as "$X in premium based on $Y in wages" and does not quote rates. The figure is non-binding, subject to eligibility and to 1099Policy's confirmation. When the premium cannot be worked out yet, the assistant says so instead of guessing. For an hourly job the wage is one hour's pay, so the premium shown prices that hour; the premium follows the hours billed each pay period.
  • A write is done when the API says so. bindAssignment returns bound, cancelAssignment returns cancelled; when either is false the record was created but coverage was not bound or not ended, and the note says 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 link with createInsuranceApplicationLink, enrols, and only then can be bound.
  • Contact details come back only when asked for. Contractor phone numbers are never returned, and contractor email addresses only when you ask for them.
  • 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-six tools, one per action: 25 that read, and 11 offered only on connections approved for Make changes. 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.

Five of them are not offered in ChatGPT, under OpenAI's rules. bindAssignment, extendAssignment and createInsuranceApplicationLink each lead to a charge (a premium invoiced, or a contractor sent to buy coverage), and OpenAI allows purchases in ChatGPT only for physical goods. analyzeContract makes an automated legal determination about a worker's status, and listClassificationStates only serves analyzeContract. Claude, Cursor and every other client get all thirty-six.

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 descriptions and inputs below are the tool's own text, the same text the assistant reads.

The server also tells every client, at connect time, how to use the tools without misleading you — the rules in How answers are built — and publishes seven ready-made prompts (coverage gaps, applications to chase, a contractor against an entity's requirements, a premium estimate, a certificate review, a certificate the user attached, a contract the user attached) that clients supporting MCP prompts list alongside the tools.

Coverage

checkCoverage — Check a contractor's coverage

Check whether one contractor holds active insurance coverage, and of which coverage types. For questions such as whether a named contractor has active workers' compensation or general liability. Takes the contractor's id; returns their policies with coverage types and dates.

  • Access: Read
  • Backed by: GET /contractors/{id}/policies; coverage types are read from each policy's quote.
  • Inputs:
    • contractor (required) — Contractor public id (cn_…) whose coverage to check.
    • coverageType — Optional filter: only report policies that include this coverage type. One of: workers-comp, general, professional, media, cyber.
    • activeOnly — When true (default), drop inactive (cancelled) policies from the result. Default true.
    • limit — Maximum number of policies to return (1-100). Default 25.
  • Returns: hasActiveCoverage, count, and policies[] — each with its coverage types and effective/expiration dates (with *Readable twins).

findCoverageGaps — Find contractors without active coverage

Count the account's contractors with and without an active policy and list, by id and name, the ones without one. For questions about coverage across the whole account, such as who has no active coverage or how many contractors are covered. Reads every page of contractors, policies and quotes; the result says when a size bound cut the read short.

  • 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. Default false.
    • maxRecords — Safety bound per collection swept. The result reports whether it was hit. Default 1000.
  • Returns: totalContractors, coveredCount, uncoveredCount, the uncovered[] list (id, name), covered[] when asked for, and complete — false only if the safety bound was hit. Counts 1099Policy policies; a contractor insured through their own approved certificate appears in uncovered (see How answers are built).

showCoverageChart — Show coverage as a chart

Show the account's coverage as a chart in the conversation: the share of contractors holding an active policy, how many have none, and the names of up to ten of those. For a request to see coverage as a chart or picture. The same figures also come back as text.

  • Access: Read
  • Backed by: GET /policies, GET /quotes, GET /contractors — every page of each.
  • Inputs:
    • maxRecords — Safety bound per collection swept. The chart reports whether it was hit. Default 1000.
  • Returns: the chart in the conversation, and the same figures as text: the share of contractors with an active policy, how many have none, up to ten of their names, and whether the safety bound was hit.

listActivePolicies — List active policies

List the account's active insurance policies, each with the id of the contractor it covers, its coverage types and its effective and expiration dates. includeInactive adds cancelled policies.

  • Access: Read
  • Backed by: GET /policies; coverage types are read from each policy's quote.
  • Inputs:
    • includeInactive — When true, also include inactive (cancelled) policies. Default false.
    • limit — Max policy rows in the response (1-100). Counts cover every match. Default 25.
    • offset — Matching policies to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count (every match), nextOffset when more remain, and policies[] with the contractor each covers, coverage types, and dates.

Certificates

getIssuedCertificate — Get the certificate issued for an assignment

Get the download links for the certificate of insurance that 1099Policy issued when an assignment's coverage was bound. Returns no links and a pending note while the certificate is still being produced.

  • 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) and coiUrls per coverage type, or a note when the certificate is not yet issued.

getUploadedCertificate — Get an uploaded certificate

Get one certificate of insurance that a contractor provided, by its id, with its review: the status, how many requirement rules passed, and each failed rule with the reason. The review runs asynchronously; the status says whether it has finished.

  • Access: Read
  • Backed by: GET /files/certificates/{id}?expand[]=review_results
  • Inputs:
    • certificate (required) — Certificate public id (ci_…) from listUploadedCertificates.
  • Returns: status, settled, source, pdfUrl (null when the certificate was filed from a chat), summary (how many rules passed and failed) and failed[] — each failed rule with its reason. A note says when the review has not finished, and when no file is on record.

listUploadedCertificates — List uploaded certificates

List certificates of insurance that contractors provided, with each one's review status and how many requirement rules passed and failed. Can be filtered by contractor and by review status, such as flagged or approved.

  • Access: Read
  • Backed by: GET /files/certificates (expanding review_results)
  • Inputs:
    • contractor — Optional. Only certificates for this contractor (cn_…).
    • status — Optional. Only certificates whose review is in this state: flagged (failed one or more rules), approved, denied, pending, processing, in_review or error. One of: pending, processing, in_review, flagged, approved, denied, error.
    • limit — Max certificate rows in the response (1-100). Counts cover every match. Default 25.
    • offset — Matching certificates to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count (every match), nextOffset when more remain, and certificates[] with status, source, pdfUrl and the passed and failed rule counts (summary).

reviewCertificate — Check a certificate against requirements

Check a certificate of insurance the user shared (PDF or image) against the account's insurance requirement, without saving anything. Takes the fields as printed on the certificate. Returns each rule with pass or fail and the reason, and missing: questions about what the certificate does not show; calling again with the answers completes the check.

  • Access: Read
  • Backed by: POST /files/certificates/evaluate (stores nothing)
  • Inputs:
    • certificate (required) — The fields read off the certificate. Copy what is printed; leave out what is not there.
    • contractor — Optional. The contractor (cn_…) the certificate belongs to; when given, the insured name on the certificate is checked against the contractor's name.
    • requirement — Optional. The insurance requirement (ir_… from listInsuranceRequirements) to review against. When omitted, the account's default requirement is used.
    • entity — Optional. Review against the requirement tied to this entity (en_…).
  • Returns: verdict (approved or flagged as things stand), complete, summary, results[] with each rule's pass or fail and the reason, missing[] — the questions to ask for what the certificate does not show — and the requirement applied. Nothing is stored.

submitCertificate — Save a certificate to a contractor's record (writes)

Save a contractor's certificate of insurance to their record from the fields read off it, and review it against the account's insurance requirement. Stores the fields, not the file. A certificate that fails a rule is saved as flagged. For when the user asks to put a certificate on record.

  • Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
  • Backed by: POST /files/certificates
  • Inputs:
    • contractor (required) — Contractor public id (cn_…) the certificate belongs to.
    • certificate (required) — The fields read off the certificate. Copy what is printed; leave out what is not there.
    • fileName — Optional. The name of the file the user shared, e.g. acme_coi.pdf.
    • userProvided — Optional. Field paths whose values the user supplied in conversation and that are not shown on the certificate, e.g. coverages.workers_compensation.policy_expiration_date.
    • requirement — Optional. The insurance requirement (ir_… from listInsuranceRequirements) to review against. When omitted, the account's default requirement is used.
    • entity — Optional. Review against the requirement tied to this entity (en_…).
  • Returns: id, status (pending until the review finishes), source assistant, and a note: the review runs in the background — read the outcome with getUploadedCertificate. No file is stored; the certificate's fields are, with who supplied each.

openCertificateUpload — Upload a certificate PDF (writes)

Show a drop zone in the conversation where the user can drop a contractor's certificate of insurance as a PDF. A dropped file is uploaded to 1099Policy, stored on that contractor's record and reviewed against the account's insurance requirement, and the card shows the review. For when the user wants a certificate file put on a contractor's record. Takes the contractor's id. Opening the drop zone changes nothing; the upload happens only when the user drops a file.

  • Access: Offered only on connections approved for Make changes, because a dropped file is filed on the contractor's record. Opening the drop zone changes nothing.
  • Backed by: POST /files/certificates (the PDF), then GET /files/certificates/{id} for the review
  • Inputs:
    • contractor (required) — Contractor public id (cn_…) the certificate belongs to.
    • contractorName — The contractor's name, shown on the drop zone.
  • Returns: the drop zone in the conversation; once the file is uploaded, the review: approved or flagged, how many rules passed, and each failed rule. In clients that cannot show the drop zone, reviewCertificate checks the fields read off the certificate instead.

listInsuranceRequirements — List insurance requirements

List the account's insurance requirements: the coverage types and limits a contractor's certificate must show, the boxes that must be marked, and which requirement is the default. reviewCertificate and submitCertificate use the default unless you pass requirement or entity.

  • Access: Read
  • Backed by: GET /insurance_requirements
  • Inputs: none.
  • Returns: count, default, and requirements[], each with its rules[] (path, condition, value).

Contractors

listContractors — List or find contractors

List the contractors on the account, or find them by id, email, person's name or business name. Returns each contractor's id, name, business name and work state; email only when includeEmail is set. The id is what the other contractor tools take.

  • Access: Read
  • Backed by: GET /contractors
  • Inputs:
    • query — Optional. Find contractors by public id (cn_…), email, the person's name, or their business name (case-insensitive; with several words, every word must appear).
    • limit — Max contractor rows in the response (1-100). Counts cover every match. Default 25.
    • offset — Matching contractors to skip before the rows start; a previous result's nextOffset. Default 0.
    • includeEmail — Include each contractor's email address. For a request about contacting a contractor or about their email itself; names and ids identify them otherwise. Default false.
  • Returns: count (every match), nextOffset when more remain, and contractors[] (id, name, company, state, and email when includeEmail is set).

createContractor — Create a contractor (writes)

Add a contractor to the account with their name, email and residence address. Creates a real contractor record and returns its id.

  • 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, and country (ISO code, default US).
    • companyName — Business name, if the contractor operates as an entity.
    • middleName — Contractor's middle name.
    • phone (required) — Contractor's phone number.
    • withholdPremium — Whether the platform withholds this contractor's premium from their wages (true) or the contractor pays it by card (false).
  • Returns: The new contractor's id, email, and name.

Create a one-time sign-in link to a contractor's own 1099Policy portal, for the user to send to that contractor. Returns the link and when it expires.

  • 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 — Optional URL to send the contractor to after they sign in.
  • Returns: The one-time url for that contractor and when it expires (expiresAt, expiresAtReadable). Nothing is sent to the contractor.

Jobs

listJobs — List or find jobs

List the account's jobs, or find one by id or name, with each job's category code, wage in dollars, wage type and work state. Returns the job ids the other job tools take.

  • Access: Read
  • Backed by: GET /jobs
  • Inputs:
    • query — Optional. Match a single job by public id (jb_…) or name (case-insensitive substring).
    • limit — Max job rows in the response (1-100). Counts cover every match. Default 25.
    • offset — Matching jobs to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count (every match), nextOffset when more remain, and jobs[] (id, name, category code, wage in dollars, wage type, work state).

createJob — Create a job (writes)

Create a job with a work category, entity, wage and premium settings. Creates a real job record and returns its id.

  • 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 in cents (150000 = $1,500.00), expressed per wageType; from 100 ($1) to 100000000 ($1,000,000).
    • wageType (required) — How the wage is expressed: flatfee, hourly, unit or blended. One of: flatfee, hourly, unit, blended.
    • yearsExperience — Contractor years of experience the job assumes.
    • withholdPremium — Who pays the premium: the contractor, either way. True: they have allowed the platform to withhold the premium from their wages and pay it on their behalf. False: they pay it directly by card, and need a payment method on file before coverage can be placed on this job. The hiring company pays it in neither case. Defaults to false.
  • Returns: The new job's id, name, entity, and categoryCode.

listCategoryCodes — List work category codes

Look up 1099Policy's approved work classification (category) codes when creating or matching a job. Optionally filter by code or name.

  • Access: Read
  • Backed by: GET /category_codes
  • Inputs:
    • query — Optional. Filter by code or name (case-insensitive substring), e.g. photography or a partial code.
    • limit — Max category codes to return (1-100). Default 50.
  • Returns: count and categoryCodes[] (code, name). Empty when the account has none configured yet — a job cannot be created until one is added in the dashboard.

Premium estimates

estimatePremium — Estimate a premium

Estimate the insurance premium for a contractor on a job, per coverage type, and check eligibility. Returns the estimated premium in dollars and the wage it is based on. The figure is a non-binding estimate, subject to eligibility and to 1099Policy's confirmation; it places no coverage and starts no billing. Saves the estimate so it can be listed later.

  • Access: Read. Saves the estimate so it can be listed later; places no coverage and starts no billing.
  • 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). Optional.
    • endDate — Coverage end as a Unix timestamp (seconds). Optional.
  • Returns: quoteId, eligible, coverageTypes, premiumOwed (the estimated premium in dollars for the wage shown, taxes and fees included; for an hourly job that is one hour's pay with the fixed fees, not the cost of the whole job; null when it cannot be worked out yet), the wage and wageType it is based on, and a premiumNote. Rates are not returned.

listPremiumEstimates — List premium estimates

List premium estimates made earlier, with each one's eligibility, coverage types and effective window.

  • Access: Read
  • Backed by: GET /quotes
  • Inputs:
    • limit — Max quote rows in the response (1-100). Counts cover every quote. Default 25.
    • offset — Matching quotes to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count (every estimate), nextOffset when more remain, and quotes[] with 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. Each row says whether it was cancelled and whether it is active today (not cancelled, today inside the window), with the job's work state. Optionally only active or only inactive ones.

  • Access: Read
  • Backed by: GET /assignments
  • Inputs:
    • active — Optional. true: only assignments in force today (not cancelled, today inside the coverage window); false: only the rest.
    • limit — Max assignment rows in the response (1-100). Counts cover every match. Default 25.
    • offset — Matching assignments to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count (every match), nextOffset when more remain, and assignments[] — contractor, job, the job's work state, coverage window, whether it was cancelled, whether it is active today, and the bound policy where there is one.

bindAssignment — Bind an assignment (writes coverage)

Place a contractor on a job under the coverage they already hold. This writes: with bind=true the assignment takes effect on a real policy and may issue COIs, and the premium for the job is invoiced through the account's existing billing exactly as it is from the dashboard. It is not a purchase: nothing is paid for here and no card or bank details are involved, and it cannot give coverage to someone who holds none — that person needs createInsuranceApplicationLink. estimatePremium previews the price without placing anyone.

  • Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
  • Not offered in ChatGPT.
  • 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. Omit to use the job's configured coverage. Each one of: workers-comp, general, professional, media, cyber.
    • effectiveDate (required) — Coverage start as a Unix timestamp (seconds). Required — the API rejects an assignment without an effective date.
    • endDate (required) — Coverage end as a Unix timestamp (seconds).
    • bind — When true (default), bind coverage now. Set false to create the assignment without binding a policy. Default true.
  • Returns: bound — true only when the API bound coverage — plus the assignment and policy ids and a note. When bound is 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. This writes: it moves a live coverage window forward and may adjust billing — no re-quote or new application.

  • Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
  • Not offered in ChatGPT.
  • 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 new endDate, and status.

cancelAssignment — Cancel an assignment (writes, ends coverage)

Cancel a contractor's assignment on a job and end its insurance coverage. Ends real coverage; running it again does not restore it.

  • 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 — Optional human-readable reason for the cancellation.
  • Returns: cancelled — true only when the API reports it — with cancelledAt, or a note when coverage may still be active.

Insurance applications

getInsuranceApplication — Get an insurance application's status

Get where one contractor's insurance application stands: the step reached (such as sent, opened or completed) and whether it 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, the quote and (once issued) the policy, and created/createdReadable.

listInsuranceApplications — List insurance applications

List contractors' insurance applications with how far each has got: the step reached, whether it expired, whether a policy was issued, and how many days since it was sent. Filters to outstanding (the default), completed or expired applications. For questions about which contractors have not finished enrolling.

  • Access: Read
  • Backed by: GET /apply/sessions
  • Inputs:
    • status — Which applications to return. 'outstanding' (default) is the chase list: sent, not expired, no policy issued yet. 'completed' has a policy. 'expired' ran out of time without one. One of: outstanding, completed, expired, all.
    • contractor — Optional contractor public id (cn_…) to narrow to one person.
    • limit — Max sessions to return (1-100). Default 50.
  • Returns: status filter echoed back, count, complete, and sessions[] — contractor, step, daysSinceSent, expired, enrolled, and the policy once one exists. No application links; getInsuranceApplication returns the link for one application.

Start an application (opt-in) session and return the link a contractor uses to complete enrollment. This writes a session record and produces a link you send to a real contractor. Nothing is enrolled or paid for here: the contractor opens the link and completes the application on 1099Policy's own pages, where any payment happens between them and 1099Policy.

  • Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
  • Not offered in ChatGPT.
  • Backed by: POST /apply/sessions
  • Inputs:
    • quote (required) — Quote public id (qt_…) the application is based on.
    • contractor — Optional 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 application url to send the contractor, the current step, and expired.

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. Not the agency's or platform's own bill: what the account holder itself was invoiced is not in this list. Amounts are in dollars ("$1,250.00"); totals of gross pay and premium due cover every matching invoice. Optionally filtered by the date a pay cycle starts.

  • Access: Read
  • Backed by: GET /invoices
  • Inputs:
    • paycycleStartFrom — Optional. Only invoices whose pay cycle starts on or after this date (YYYY-MM-DD, UTC).
    • paycycleStartTo — Optional. Only invoices whose pay cycle starts on or before this date (YYYY-MM-DD, UTC).
    • limit — Max invoice rows in the response (1-100). Totals and counts cover every match. Default 25.
    • offset — Matching invoices to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count and totals of gross pay and premium due (every match), nextOffset when more remain, and invoices[] — premium due, gross pay, pay-cycle window, and purchase order number, per contractor, in dollars.

Organization 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. Jobs reference an entity id.

  • Access: Read
  • Backed by: GET /entities
  • Inputs:
    • query — Optional. Match a single entity by public id or name (case-insensitive substring).
    • limit — Max entity rows in the response (1-100). Counts cover every match. Default 25.
    • offset — Matching entities to skip before the rows start; a previous result's nextOffset. Default 0.
  • Returns: count (every match), nextOffset when more remain, and entities[] with requiredCoverage, coverageLimit, and state.

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. Covers the active organization; another organization's roster is read after switching to it with switchOrganization.

  • Access: Read
  • Backed by: GET /team-members
  • Inputs:
    • query — Optional. Match a single member by email or name (case-insensitive substring).
    • includeInvited — Include people invited but not yet accepted (status invited). Default true.
    • limit — Max members to return (1-100). Default 100.
  • Returns: count, active, invited, and teamMembers[] (email, name, role, status).

inviteTeamMember — Invite a team member (writes)

Send an invitation to join the active organization as a member or owner. This emails a real person. They are not a member until they accept; listTeamMembers shows them as invited meanwhile. The API refuses an invitation that repeats one from the last seven days or names an existing member; listTeamMembers shows both. Each call covers the active organization only; another organization takes its own call after switchOrganization.

  • 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. Default member.
  • Returns: invited, email, role, status, and a note: the invitation email is sent; they become a member when they accept.

removeTeamMember — Remove a team member (writes)

Remove a person from the active organization by email. Removes an active member, or cancels their outstanding invitation, whichever applies. Owners cannot be removed with an organization key. Each call covers the active organization only; another organization takes its own call after switchOrganization.

  • 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 a note saying whether a member was removed or a pending invitation withdrawn.

getAuditTrail — Get account audit trail

List recent events on the account, newest first: policies bound or cancelled, assignments started or ended, applications, certificates reviewed, invoices charged. Each event gives its type, when it happened, and the ids of the records it touched. For questions about what changed recently or when something happened.

  • Access: Read
  • Backed by: GET /events
  • Inputs:
    • type — Optional case-insensitive filter on the event type, e.g. policy, assignment, invoice.
    • limit — Max events to return, newest first (1-100). Default 25.
  • Returns: count, complete, and events[] — type, created/createdReadable, and the ids of the records each event touched. The raw event payload is not returned. When a type filter is applied to a partial page, filterNote says so.

listOrganizations — List connected organizations

List the 1099Policy organizations this connection can act on, and which one is active. The other tools read and change the active organization only.

  • Access: Read
  • Backed by: none — reads the connection's own state.
  • Inputs: none
  • Returns: count, the active organization, and accounts[] (label, live or sandbox, active).

switchOrganization — Switch the active organization

Make another connected 1099Policy organization the active one, by its position in the organization list. Changes which organization the other tools act on; changes no records.

  • Access: Read. Changes which organization the connection acts on; changes no records.
  • Backed by: none — changes the connection's own state.
  • Inputs:
    • account (required) — Which organization to switch to, as its position in listOrganizations (1 for the first); positions are only meaningful against that list.
  • Returns: switched, the now-active organization, and the list. The switch persists for the connection, including across token refreshes.

Classification

analyzeContract — Analyze a contract for misclassification risk

Judge whether a written work arrangement the user shared (a contract, statement of work, offer letter or email thread) holds up as independent-contractor work under a U.S. state's classification test. Takes the document's full text and the state whose law applies. Returns the overall risk, each factor of the test with a pass, fail or unclear verdict and the clause that drove it, and what to change. Writes nothing. The result is an automated heuristic, not legal advice.

  • Access: Read
  • Not offered in ChatGPT.
  • Backed by: POST /classification/analyses (stores nothing)
  • Inputs:
    • contractText (required) — The full text of the agreement from what the user shared (PDF, image or pasted text): every clause, in order, with its heading or number, as plain text rather than a summary.
    • state — The U.S. state whose law applies, as a two-letter code (CA, NY, TX, MA) or FEDERAL for the U.S. Department of Labor test: the one the agreement's governing-law clause names, or where the work is performed. listClassificationStates shows what is available.
    • contractor — Optional. The contractor (cn_…) the agreement is with, when they are on the account; their name is passed to the analysis.
    • contractorName — Optional. The worker's or their business's name when there is no contractor record.
  • Returns: overallRisk (low, medium, high, critical), test, summary, factors[] with verdict (pass, fail, unclear), the evidence quoted from the text, explanation and recommendation, recommendations[], disclaimer, and a nextStep. A factor the text is silent on comes back as a question for the user.

listClassificationStates — List jurisdictions for contract analysis

List the U.S. states (two-letter codes) and FEDERAL whose worker-classification tests analyzeContract can apply, and which one is used when none is given.

  • Access: Read
  • Not offered in ChatGPT.
  • Backed by: GET /classification/states
  • Inputs: none.
  • Returns: states and the default applied when none is given.

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.

Show me our coverage as a chart.

Draws the share of contractors with an active policy in the conversation, with the count that have none and up to ten of their names.

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.

Here's the COI Alvarez just sent — does it cover us for the Northwind launch? (with the PDF or a photo of it attached)

Reads the certificate, checks it against your insurance requirement, and reports what passes and what falls short, with the amounts. What the certificate does not show — an expiration date, an unclear additional-insured box — comes back as a question to you, not as a guess.

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?

Estimates the premium and checks eligibility without placing any coverage, and reports the estimate in dollars with the wage it is based on. The figure is non-binding until 1099Policy confirms it.

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 the invoices for pay cycles starting in June — what each contractor owed — with totals across all of them. These are the contractors' invoices, not the agency's own bill.

Here's the agreement we're about to send Rivera — will it hold up as a 1099 arrangement in California? (with the contract attached)

Transcribes the agreement, applies California's ABC test clause by clause, and reports the risk: which factors fail and the sentence that makes them fail, what to change, and what the agreement is silent on. It says plainly that this is an automated review, not legal advice. Not available in ChatGPT.

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.

The certificate looks right. File it.

Saves Alvarez's certificate to his record from the fields as read plus the answers you gave, runs the review, and reports whether it came back approved or flagged. No file is stored; the fields are, with who supplied each.

Put Alvarez's certificate PDF on his record.

Opens a drop zone in the conversation. The PDF dropped on it is stored on his record and reviewed like a dashboard upload, and the card shows the result: approved, or flagged with what is missing. Offered only on connections approved for Make changes.

Send Priya an application link for the copywriting engagement.

Creates an application link and returns it for you to send her.

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.

Was this page helpful?

Yes

No

Was this page helpful?

Yes

No

MCP Server

MCP troubleshooting

© Copyright 2026. All rights reserved.

© Copyright 2026. All rights reserved.

© Copyright 2026. All rights reserved.

© Copyright 2026. All rights reserved.