Developers / MCP

Folio and Kit MCP server

Connect Claude, ChatGPT, Notion and other MCP clients to a creator’s Folio and Kit account: endpoint, OAuth sign-in, limits and the full tool reference.

Overview

Folio and Kit runs a remote Model Context Protocol server. Any MCP client can use it to read a creator's deals, contracts, invoices, media kit, rate cards and Folio Value, and to act on them — create a deal, draft a contract or invoice, send it to a brand — on the creator's behalf, after they sign in and approve access.

Server URL (Streamable HTTP)
https://www.folioandkit.com/mcp

Every tool is limited to what the creator's plan already includes in the app, and connecting doesn't cost anything extra. Amounts are in GBP.

Quick start

Claude

  1. Open Settings → Connectors and choose Add custom connector.
  2. Name it “Folio and Kit” and paste https://www.folioandkit.com/mcp.
  3. Select Connect, sign in to Folio and Kit and approve access.
  4. Enable the connector in a conversation and ask, for example, “What deals do I have in negotiation?”

ChatGPT

  1. Turn on Developer mode in ChatGPT's settings (under apps and connectors).
  2. Create a connector with the URL https://www.folioandkit.com/mcp and OAuth authentication.
  3. Sign in to Folio and Kit when prompted, then use the connector in a chat.

Notion Custom Agents

  1. A workspace owner allows custom MCP servers in Settings → Notion AI.
  2. In the agent's Tools & Access, add a custom MCP connection with https://www.folioandkit.com/mcp.
  3. Sign in to Folio and Kit, then choose which tools the agent may run automatically.

Other clients and testing

Any client that supports remote MCP servers with OAuth works. To explore the server by hand, use the MCP Inspector, pick Streamable HTTP, enter the server URL and connect:

Terminal
npx @modelcontextprotocol/inspector

Menu names in each assistant change over time — if a step doesn't match, look for “connectors” or “MCP” in its settings.

Authentication

The server uses OAuth 2.1 with PKCE, following the MCP authorization spec. Clients discover everything from the server — there are no API keys to create.

  1. A request without a valid token gets 401 with a WWW-Authenticate header whose resource_metadata points to https://www.folioandkit.com/.well-known/oauth-protected-resource/mcp.
  2. That document (RFC 9728) names the authorization server, which is Folio and Kit's sign-in provider. Its metadata (RFC 8414) is also mirrored at https://www.folioandkit.com/.well-known/oauth-authorization-server.
  3. The client identifies itself with a Client ID Metadata Document or registers with Dynamic Client Registration.
  4. The creator signs in and approves access on the consent screen; the client receives an access token.
  5. Send it on every request as Authorization: Bearer <token>.

A token acts as the one creator who approved it, with their plan. Creators can disconnect at any time in their assistant's settings, or ask us to revoke access at support@folioandkit.com.

Transport and protocol

  • Streamable HTTP at /mcp (POST for requests; GET and DELETE per the transport spec).
  • The protocol version is negotiated at initialisation; revisions from 2025-06-18 onwards are supported.
  • Server name folio-and-kit. The server sends instructions describing the product to the model.
  • Capabilities: tools. Every tool has a title and readOnlyHint, destructiveHint and openWorldHint annotations.

Plans, limits and errors

Tools follow the creator's plan exactly as the app does. Free accounts can use the rate calculator, up to 2 deals, one media kit and Folio Value; paid features and higher limits come with Creator and Pro — see pricing. The plan badge on each tool below shows which plans can run it; usage limits (for example active deals, contracts or invoices) apply on top.

Expected problems come back as a normal tool result with isError: true and a plain-language message written to be shown to the creator as it is, for example:

Example tool error
Rate Intelligence is available on the Creator or Pro plan. Manage your plan at folioandkit.com/pricing.

The same applies to missing or ambiguous records (the message lists the matches and the id to pass), invalid arguments and usage limits.

Each account can make 120 tool calls per minute. Over that, calls return:

Rate limit
Too many requests: Folio and Kit allows 120 tool calls per minute per account. Wait a minute, then try again.

Tool results

Every tool returns a text summary for the model. Most also return structuredContent with the same data as JSON, including record ids (dealId, contractId, invoiceId, …).

Tools that act on an existing record accept a brand or client name. If a name matches more than one record, the error lists them with their ids — call the tool again with the id. Fields ending in Pence are in pence; …Gbp fields are in pounds.

Actions that need confirmation

Tools that email a brand or client, or publish the creator's media kit, are marked destructiveHint: true and openWorldHint: true. Deleting, voiding and merging are marked destructive too. MCP clients use these hints to ask the user before running the tool; the server itself does not add a second confirmation.

If you build your own client, ask the creator before calling any tool marked Sends / publishes below, and show them what will be sent and to whom.

Interactive widgets

In clients that support MCP Apps (Claude and ChatGPT among them), some tools also show an interactive card in the conversation. Clients without MCP Apps get the same text result as before, so nothing depends on the widget.

  • Rate estimate — Suggested price range for a brand deal, and whether a deal’s rate is fair. Shown for calculate_rate, get_rate_intelligence. Resource ui://folio/rates.
  • Money overview — Folio Value and Index, earnings, and invoice status. Shown for get_folio_value_index, get_earnings_summary, list_invoices, get_invoice. Resource ui://folio/money.
  • Media kit preview — A preview of the creator’s public media kit with its share link. Shown for get_media_kit. Resource ui://folio/media-kit.
  • Deal pipeline — Brand deals grouped by stage, with deliverables and next steps. Shown for list_deals, get_deal. Resource ui://folio/deals.

Widgets are self-contained HTML (MIME type text/html;profile=mcp-app) and load nothing from other origins, so they need no CSP domains. Their buttons only do things that stay inside the creator's account — re-running a rate estimate, moving a deal to its next stage, ticking off a deliverable. Anything that emails a brand or publishes is still a chat request, where the client's confirmation applies.

Tool reference

72 tools, grouped by area. Open a tool to see its parameters. This list is generated from the server's own tool definitions.

Deals (8)

create_dealCreate dealWriteAll plans

Create a new brand deal in the creator's deal tracker. Only call this when the user is clearly asking to create/add/log a deal. Never invent a brand name — if it's missing, ask the user for it in plain text instead of calling this tool.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand or company name. Required.
platformsobject[]Which platforms this deal covers, only if mentioned, e.g. [{"platform":"Instagram","contentType":"Reel","quantity":2},{"platform":"TikTok","contentType":"Story","quantity":1}]. A deal can span multiple platforms.
dealValuenumberThe deal value in GBP, as a plain number — only if mentioned.
notesstringAny other relevant detail the user mentioned.
contactNamestringBrand contact name, only if mentioned.
contactEmailstringBrand contact email, only if mentioned.
update_deal_stageMove deal to a stageWriteAll plans

Move an existing deal to a new pipeline stage (e.g. mark it as won, negotiating, etc). The deal must already exist — never use this to create one.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringWhich brand's deal to update. Required.
stagerequiredstring (enum)The new stage.outreach · negotiating · contract_sent · live · completed
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
archive_dealArchive dealWriteAll plans

Archive an existing deal (hides it from the active pipeline; reversible, not a delete).

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringWhich brand's deal to archive. Required.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
update_dealUpdate dealWriteAll plans

Update one or more fields on an existing deal (contact details, platform, content type, value, deadlines, notes). Only include fields the user actually mentioned changing.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringWhich brand's deal to update. Required.
brandWebsitestringNew brand website, only if mentioned.
contactNamestringNew contact name, only if mentioned.
contactEmailstringNew contact email, only if mentioned.
platformsobject[]Replaces the deal's full platform/deliverable list, only if the user described new or changed platforms — e.g. [{"platform":"Instagram","contentType":"Reel","quantity":2}]. Omit entirely to leave platforms unchanged.
dealValuenumberNew deal value in GBP, only if mentioned.
contentDeadlinestringNew content deadline (YYYY-MM-DD), only if mentioned.
paymentDueDatestringNew payment due date (YYYY-MM-DD), only if mentioned.
notesstringNew/updated notes, only if mentioned.
campaignBriefstringNew campaign brief text, only if mentioned.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
list_dealsList dealsReadAll plans

List the creator's brand deals — optionally filtered by pipeline stage. Use when the user asks what deals they have, which brands they're working with, what's in their pipeline, or anything about deal status or deadlines.

Asks before running: No (read-only)

ParameterTypeDescription
stagestring (enum)Filter by stage — only set this if the user's current message names a stage. Omit to return all active deals.outreach · negotiating · contract_sent · live · completed
get_dealGet deal detailsReadAll plans

Get full details of a specific deal — stage, value, platforms, deadlines, contact, brief, notes, linked contracts and invoices. Use when the user asks about a specific brand deal.

Asks before running: No (read-only)

ParameterTypeDescription
brandNamestringThe brand name to look up. Give this or dealId.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
add_deliverableAdd deliverable to dealWriteAll plans

Add a deliverable (a piece of content the creator owes) to an existing deal's checklist, e.g. "1× Instagram Reel".

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringWhich brand's deal to add the deliverable to. Required.
descriptionrequiredstringWhat the deliverable is, e.g. "Instagram Reel with product demo".
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
set_deliverable_doneMark deliverable done or not doneWriteAll plans

Mark a deal deliverable as done (or not done). Use get_deal first to find the deliverableId.

Asks before running: Usually (host decides)

ParameterTypeDescription
deliverableIdrequiredstringThe deliverableId from get_deal.
isCompletedrequiredbooleantrue to mark done, false to mark not done.

Deal analysis (AI) (8)

get_rate_intelligenceCheck if a deal rate is fairWriteCreator · Pro

Assess whether a specific deal's rate is fair — returns a below/at/above-market verdict, a suggested fair range, reasoning, and a counter-offer line if the rate is low. Use whenever the user asks if a deal's rate is good, fair, too low, or how it compares to the market. Requires Creator or Pro plan — a Free-plan user gets an upgrade message instead of a verdict.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand name of the deal to assess. Required.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
get_fit_scoreScore audience-brand fitWriteCreator · Pro

Score 1–10 how well a deal's brand fits the creator's audience and niche, with reasons and red flags. Saves the score to the deal.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand name of the deal. Required.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
draft_negotiation_emailDraft a negotiation emailWriteCreator · Pro

Write a negotiation email to a deal's brand contact and save it as a draft on the deal (nothing is sent). Types: counter_offer, scope_creep_pushback, follow_up_after_silence, kill_fee_request, content_feedback_pushback, firm_follow_up. Returns a draftId for send_deal_email.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand name of the deal. Required.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
draftTyperequiredstring (enum)What the email should do.counter_offer · scope_creep_pushback · follow_up_after_silence · kill_fee_request · content_feedback_pushback · firm_follow_up
analyse_briefAnalyse a campaign briefWritePro

Analyse the campaign brief saved on a deal: deliverables, scope-creep flags, questions to ask the brand and an estimated value. The deal must already have a brief (set one with update_deal's campaignBrief). Saves the analysis to the deal.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand name of the deal. Required.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
estimate_timeEstimate time for deliverablesWritePro

Estimate realistic hours for each content deliverable (research, filming, editing, revisions, posting) and in total. If a deal is named, the estimate is saved to that deal.

Asks before running: Usually (host decides)

ParameterTypeDescription
deliverablesrequiredstring[]The deliverables to estimate, e.g. ["1× Instagram Reel with product demo", "3× Instagram Stories"].
brandNamestringThe deal to save the estimate to, only if the user named one.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
check_complianceCheck a caption for ad disclosureWritePro

Check a sponsored post caption for UK ASA/CAP ad-disclosure compliance (is the paid-partnership label present, visible before the fold, not buried in hashtags). If it fails, returns the issues and a compliant rewrite. Saves the check to the deal.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand name of the deal. Required.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
captionTextrequiredstringThe full caption text to check.
platformrequiredstringWhere it will be posted, e.g. "Instagram", "TikTok", "YouTube".
platformTagUsedbooleantrue if the creator will also switch on the platform's own paid-partnership tag.
get_deal_insightsGet deal insightsWritePro

Find patterns across the creator's completed deals — payment speed, content performance, rate trends — plus a monthly revenue forecast. Needs at least 5 completed deals with a value. Saves the latest insights to the dashboard.

Asks before running: Usually (host decides)

No parameters.

send_deal_emailSend a negotiation email to the brandSends / publishesAll plans

Email a saved negotiation draft (draftId from draft_negotiation_email) to the deal's brand contact, from the creator. Optionally override the subject or body. This sends a real email to someone outside the creator's account — show the creator the final text first.

Asks before running: Yes — reaches someone outside your account

ParameterTypeDescription
draftIdrequiredstringThe draftId returned by draft_negotiation_email.
subjectstringReplacement subject line, only if the creator edited it.
bodystringReplacement email body, only if the creator edited it.

Brands (2)

list_brandsList brandsReadAll plans

List the brands the creator has worked with, each with its known name variants (aliases) and deal count. Use to spot duplicates like "Gymshark" and "Gymshark Ltd" before merge_brands.

Asks before running: No (read-only)

No parameters.

merge_brandsMerge duplicate brandsWriteAll plans

Merge one brand into another when they are the same company: every deal moves to the kept brand, its names become aliases, and the merged brand is deleted. Cannot be undone. Get both brandIds from list_brands.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
keepBrandIdrequiredstringbrandId of the brand to keep.
mergeBrandIdrequiredstringbrandId of the duplicate to merge into it and delete.

Contracts (7)

create_contractDraft contractWriteAll plans

Draft a new contract for a brand deal. Only call this when the user clearly wants a contract drafted, with at minimum the deliverables, fee, payment terms, and usage rights they described — ask in plain text for anything essential that's missing rather than guessing.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand name. Required.
brandAddressstringBrand address, only if mentioned.
brandContactNamestringBrand contact name, only if mentioned.
brandContactEmailstringBrand contact email, only if mentioned.
deliverablesrequiredobject[]What the creator will deliver, e.g. [{"description":"Instagram Reel","quantity":2}]. Required.
totalFeerequirednumberTotal fee in GBP. Required.
paymentStructurerequiredstringe.g. "100% on completion", "50/50 split". Required.
paymentTermsrequiredstringe.g. "30 days". Required.
usageRightsrequiredstringe.g. "Organic social only". Required.
usageRightsDurationstringNumeric value only, e.g. "12". Only if mentioned.
usageRightsDurationUnitstring (enum)Unit for usageRightsDuration. Required if usageRightsDuration is set.months · weeks · campaign
exclusivitystringOnly if mentioned.
exclusivityPeriodstringOnly if mentioned.
send_contract_for_signatureSend contract for signatureSends / publishesAll plans

Email an existing draft contract to the brand for review and signature.

Asks before running: Yes — reaches someone outside your account

ParameterTypeDescription
brandNamerequiredstringWhich brand's contract to send. Required.
contractNumberstringThe exact contract number, only if the brand name matches more than one contract.
list_contractsList contractsReadAll plans

List the creator's drafted contracts — optionally filtered by status. Use when the user asks about contracts, which are signed, which are pending, etc.

Asks before running: No (read-only)

ParameterTypeDescription
statusstring (enum)Filter by contract status — only set this if the user's current message names a status. Omit to return all contracts.draft · sent · signed · expired
get_contractGet contract detailsReadAll plans

Get full details of a specific contract — deliverables, fee, payment terms, usage rights, exclusivity, status. Use when the user asks about a specific contract's terms. If the user gives a contract number (e.g. "CON-2026-7216"), use contractNumber — it resolves exactly, unlike brandName which can match several contracts for the same brand.

Asks before running: No (read-only)

ParameterTypeDescription
brandNamestringThe brand name on the contract. Give this or contractNumber.
contractNumberstringThe exact contract number, if the user mentioned one (e.g. "CON-2026-7216"). Preferred over brandName when available — it always resolves to exactly one contract.
contractIdstringThe contractId from list_contracts/get_contract, only if the brand name matches more than one contract.
get_contracts_by_brandContracts by brandReadAll plans

Return a breakdown of the creator's contracts grouped by brand as a pie chart — how many contracts per brand. Use when the user asks to see their contracts broken down, distributed, or visualized by brand (e.g. "pie chart of contracts by brand", "which brands do I have the most contracts with").

Asks before running: No (read-only)

No parameters.

archive_contractArchive contractWriteAll plans

Archive a Folio-drafted contract: it is hidden from the active contracts list and stops counting toward the plan's contract limit. The record, its signatures and any linked invoice are kept (not a delete). Folio has no un-archive button today.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringThe brand name on the contract. Give this, contractNumber or contractId.
contractNumberstringThe exact contract number, e.g. "CON-2026-7216". Preferred when known.
contractIdstringThe contract's id (contractId from list_contracts/get_contract), only if the brand name matches more than one contract.
scan_contractScan drafted contract for red flagsWriteCreator · Pro

Run the Contract Red Flag Scanner on a contract drafted in Folio: flags risky or missing terms (payment, usage rights, exclusivity, revisions, kill fee) with a suggestion for each, and saves the result on the contract. Not legal advice. For contracts a brand sent the creator, use get_imported_contract instead.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringThe brand name on the contract. Give this, contractNumber or contractId.
contractNumberstringThe exact contract number, e.g. "CON-2026-7216". Preferred when known.
contractIdstringThe contract's id (contractId from list_contracts/get_contract), only if the brand name matches more than one contract.

Imported contracts (7)

list_imported_contractsList imported contractsReadAll plans

List contracts brands sent the creator that were uploaded to Folio for a red-flag scan — brand, file name, overall risk and number of open flags. Contracts drafted in Folio are listed by list_contracts instead.

Asks before running: No (read-only)

No parameters.

get_imported_contractGet imported contract scanReadAll plans

Get the red-flag scan of an imported (brand-supplied) contract: overall risk, summary, each flag numbered with its risk and suggested fix, the extracted terms, and how it compares with the previous version if one was uploaded.

Asks before running: No (read-only)

ParameterTypeDescription
brandNamestringBrand name (or uploaded file name) of the imported contract. Give this or scanId.
scanIdstringThe imported contract's scanId from list_imported_contracts, only if the brand name matches more than one.
update_imported_contract_brandUpdate imported contract brand detailsWriteAll plans

Correct the brand name and/or brand contact email on an imported contract (the email is where send_pushback_email sends to). Only include the fields the user wants changed.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringBrand name (or uploaded file name) of the imported contract. Give this or scanId.
scanIdstringThe imported contract's scanId from list_imported_contracts, only if the brand name matches more than one.
newBrandNamestringThe corrected brand name, only if the user gave one.
newBrandContactEmailstringThe corrected brand contact email, only if the user gave one.
set_contract_flag_dismissedDismiss or restore a contract flagWriteAll plans

Mark one red flag on an imported contract as dismissed (the creator accepts the risk, so it is left out of pushback emails) or restore it. Use get_imported_contract first to find the flagNumber.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringBrand name (or uploaded file name) of the imported contract. Give this or scanId.
scanIdstringThe imported contract's scanId from list_imported_contracts, only if the brand name matches more than one.
flagNumberrequiredintegerThe flag's number as listed by get_imported_contract (1 = first).
dismissedrequiredbooleantrue to dismiss the flag, false to restore it.
delete_imported_contractDelete imported contractWriteAll plans

Permanently delete an imported contract: the uploaded file, its scan and flags. This cannot be undone. Frees an imported-contract slot.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
brandNamestringBrand name (or uploaded file name) of the imported contract. Give this or scanId.
scanIdstringThe imported contract's scanId from list_imported_contracts, only if the brand name matches more than one.
draft_pushback_emailDraft pushback emailReadCreator · Pro

Draft an email to the brand raising the open (not dismissed) red flags on an imported contract. Returns a subject and body for the creator to review; nothing is saved or sent. Send it with send_pushback_email once the creator is happy.

Asks before running: No (read-only)

ParameterTypeDescription
brandNamestringBrand name (or uploaded file name) of the imported contract. Give this or scanId.
scanIdstringThe imported contract's scanId from list_imported_contracts, only if the brand name matches more than one.
send_pushback_emailSend pushback email to brandSends / publishesAll plans

Email the brand about an imported contract, from the creator (replies go to the creator's account email), and log it on the contract. Sends to the brand contact email stored on the imported contract. Only send text the creator has approved.

Asks before running: Yes — reaches someone outside your account

ParameterTypeDescription
brandNamestringBrand name (or uploaded file name) of the imported contract. Give this or scanId.
scanIdstringThe imported contract's scanId from list_imported_contracts, only if the brand name matches more than one.
subjectrequiredstringEmail subject line.
bodyrequiredstringEmail body text, as approved by the creator.

Invoices (12)

create_invoiceCreate invoiceWriteAll plans

Create a draft invoice, typically for a deal that already exists. If the brand matches an existing deal, the client's name/email are filled in automatically. If there's no matching deal, a client email must be given.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand/client this invoice is for. Required.
descriptionrequiredstringWhat the invoice is for, e.g. "Instagram Reel campaign". Required.
amountrequirednumberThe invoice amount in GBP. Required.
dueDaterequiredstringDue date (YYYY-MM-DD). Required.
toEmailstringClient email — only needed if there's no existing deal with this brand.
toAddressstringThe client's postal address. Invoices need one — ask the user for it if it isn't known.
dealIdstringThe deal's id (dealId from list_deals/get_deal), only if the brand name matches more than one deal.
send_invoice_to_clientEmail invoice to clientSends / publishesAll plans

Email an existing invoice to the client.

Asks before running: Yes — reaches someone outside your account

ParameterTypeDescription
brandNamerequiredstringWhich client's invoice to send. Required.
invoiceNumberstringThe exact invoice number, only if the client name matches more than one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
list_invoicesList invoicesReadAll plans

List the creator's invoices — optionally filtered by status. Use when the user asks about invoices, what's outstanding, what's overdue, or who hasn't paid.

Asks before running: No (read-only)

ParameterTypeDescription
statusstring (enum)Filter by invoice status — only set this if the user's current message names a status. Omit to return all invoices.draft · sent · viewed · overdue · paid · cancelled
get_invoiceGet invoice detailsReadAll plans

Get full details of a specific invoice — amount, status, due date, line items, payment history. Use when the user asks about a specific invoice for a brand or client. If the user gives an invoice number (e.g. "INV-2026-0042"), use invoiceNumber — it resolves exactly, unlike brandName which can match several invoices for the same client.

Asks before running: No (read-only)

ParameterTypeDescription
brandNamestringThe brand or client name on the invoice. Give this or invoiceNumber.
invoiceNumberstringThe exact invoice number, if the user mentioned one (e.g. "INV-2026-0042"). Preferred over brandName when available — it always resolves to exactly one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
get_earnings_summaryEarnings summaryReadAll plans

Return an aggregated financial snapshot: total earned (paid invoices), money outstanding (sent/overdue invoices), pipeline value (in-play deals), and completed deal count. Use when the user asks how much they've earned, what's outstanding, their pipeline value, or how they're tracking financially.

Asks before running: No (read-only)

No parameters.

issue_invoiceIssue invoiceWriteAll plans

Issue a draft invoice: assigns the next invoice number in the creator's series, sets the due date from their payment terms, and locks the invoice so it can no longer be edited (corrections then need a credit note). Does not email it — use send_invoice_to_client for that.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
record_paymentRecord invoice paymentWriteAll plans

Record a payment the creator has received against an issued invoice. Partial payments are fine; the invoice counts as paid once its payments add up to the total. Recording a second or later payment on the same invoice needs the Creator or Pro plan.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
amountrequirednumberThe amount received, in the invoice's currency (e.g. 250.50). Required.
paidAtstringThe date it was received (YYYY-MM-DD). Defaults to today.
methodstring (enum)How it was paid. Defaults to bank_transfer.bank_transfer · card · cash · other
referencestringA payment reference, only if mentioned.
void_invoiceVoid invoiceWriteAll plans

Void an issued invoice that has no payments recorded, cancelling it permanently (its number stays used). If payments have been recorded, issue a credit note instead.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
reasonrequiredstringWhy the invoice is being voided — kept on the invoice's record. Required.
issue_credit_noteIssue credit noteWritePro

Issue a credit note that cancels an issued invoice in full (the correct way to fix an issued invoice, or one with payments recorded). Also creates a replacement draft invoice for the same client.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
archive_invoiceArchive invoiceWriteAll plans

Archive an invoice: hides it from the active invoices list without changing its status or payment record.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
delete_draft_invoiceDelete draft invoiceWriteAll plans

Delete a draft (not yet issued) invoice. Issued invoices can't be deleted — void them or issue a credit note.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
draft_payment_chaserDraft payment chaser emailReadPro

Draft a payment-chaser email for an overdue invoice, in a tone matched to how late it is. Returns a subject and body for the creator to review — nothing is saved or sent.

Asks before running: No (read-only)

ParameterTypeDescription
brandNamestringThe brand/client name on the invoice. Give this, invoiceNumber or invoiceId.
invoiceNumberstringThe exact invoice number (e.g. "INV-2026-0042"). Preferred over brandName when known — it always resolves to one invoice.
invoiceIdstringThe invoiceId from list_invoices/get_invoice, only if the brand name matches more than one invoice.
chaserTyperequiredstring (enum)How overdue the invoice is: day7 (gentle nudge), day14 (polite, names the due date), day30 (firm), day60 (serious, mentions next steps).day7 · day14 · day30 · day60

Rates and past deals (9)

get_rate_cardsList rate cardsReadAll plans

List the creator's saved rate cards — platform, content type, label, and min/max rate range. Use when the user asks what they charge, or whether they have a rate card set up for a platform. This is their own price list, not a market comparison — use get_rate_intelligence instead when the user asks whether a specific deal's rate is fair, good, or below/above market.

Asks before running: No (read-only)

ParameterTypeDescription
platformstringFilter to a specific platform (e.g. Instagram, TikTok) — only set this if the user's current message names a platform. Omit to return all rate cards.
calculate_rateCalculate a rateReadAll plans

Estimate what the creator should charge a brand for a piece of sponsored content, using Folio's rate calculator (the same one as the Rate Card screen). Returns a suggested range, a confidence level and a breakdown. If the creator has logged a matching past deal, the minimum is never below what they were actually paid. Nothing is saved — use create_rate_card to save a result.

Asks before running: No (read-only)

ParameterTypeDescription
platformrequiredstring (enum)The platform the content is for. UGC means content the brand posts itself.Instagram · TikTok · YouTube · Twitter/X · LinkedIn · UGC · Other
deliverableTypestringContent type, exactly as listed for the platform — Instagram: Feed post, Story, Reel / Short; TikTok: TikTok; YouTube: YouTube video, YouTube Short; Twitter/X: Sponsored tweet; LinkedIn: LinkedIn post; UGC: Product Video, Video Ad, Unboxing, Testimonial/Review, Tutorial, Product Photo, Photo Ad, Blog; Other: Other. Omit to use the platform's first option.
followersintegerFollower count on that platform. Needed for every platform except UGC.
engagementRatenumberEngagement rate as a percentage, e.g. 3.5. Defaults to 3.
nichestring (enum)Content niche. Defaults to "other".financeB2B · tech · beauty · fashion · fitness · travel · parenting · food · entertainment · other
marketstring (enum)UK (£) or IN (India, ₹). Defaults to UK.UK · IN
deliverableCountintegerHow many of that deliverable in the bundle. Defaults to 1.
usageRightsbooleanBrand can use the content in paid ads.
exclusivitystring (enum)Exclusivity period the brand wants. Defaults to none.none · 30_days · 60_days · 90_days
repurposingbooleanBrand can repurpose the content across channels.
includesPhotosbooleanUGC video formats only: bundle product photos with the video.
rawFootageRightsbooleanUGC video formats only: brand gets the unedited source footage.
create_rate_cardSave a rate cardWriteAll plans

Run the rate calculator and save the result as a new entry on the creator's Rate Card (their saved price list, also used by their media kit and deal checks). Rates always come from the calculator — there is no way to type a price in directly.

Asks before running: Usually (host decides)

ParameterTypeDescription
platformrequiredstring (enum)The platform the content is for.Instagram · TikTok · YouTube · Twitter/X · LinkedIn · UGC · Other
deliverableTypestringContent type, exactly as listed for the platform — Instagram: Feed post, Story, Reel / Short; TikTok: TikTok; YouTube: YouTube video, YouTube Short; Twitter/X: Sponsored tweet; LinkedIn: LinkedIn post; UGC: Product Video, Video Ad, Unboxing, Testimonial/Review, Tutorial, Product Photo, Photo Ad, Blog; Other: Other. Omit to use the platform's first option.
followersintegerFollower count on that platform. Needed for every platform except UGC.
engagementRatenumberEngagement rate as a percentage, e.g. 3.5. Defaults to 3.
nichestring (enum)Content niche. Defaults to "other".financeB2B · tech · beauty · fashion · fitness · travel · parenting · food · entertainment · other
marketstring (enum)UK (£) or IN (India, ₹). Defaults to UK.UK · IN
deliverableCountintegerHow many of that deliverable in the bundle. Defaults to 1.
usageRightsbooleanBrand can use the content in paid ads.
exclusivitystring (enum)Exclusivity period the brand wants. Defaults to none.none · 30_days · 60_days · 90_days
repurposingbooleanBrand can repurpose the content across channels.
includesPhotosbooleanUGC video formats only: bundle product photos with the video.
rawFootageRightsbooleanUGC video formats only: brand gets the unedited source footage.
labelstringOptional name to tell apart cards with the same platform and content type, e.g. "Agency rate".
update_rate_cardUpdate a rate cardWriteAll plans

Change the inputs of a saved rate card and recalculate its range, as editing it on the Rate Card screen does. Only include the fields that change; everything else keeps the card's saved values. Changing the platform resets the content type to that platform's first option unless one is given.

Asks before running: Usually (host decides)

ParameterTypeDescription
rateCardIdrequiredstringThe rateCardId from get_rate_cards.
platformstring (enum)New platform, only if it changes.Instagram · TikTok · YouTube · Twitter/X · LinkedIn · UGC · Other
deliverableTypestringContent type, exactly as listed for the platform — Instagram: Feed post, Story, Reel / Short; TikTok: TikTok; YouTube: YouTube video, YouTube Short; Twitter/X: Sponsored tweet; LinkedIn: LinkedIn post; UGC: Product Video, Video Ad, Unboxing, Testimonial/Review, Tutorial, Product Photo, Photo Ad, Blog; Other: Other. Omit to use the platform's first option.
followersintegerFollower count on that platform. Needed for every platform except UGC.
engagementRatenumberEngagement rate as a percentage, e.g. 3.5. Defaults to 3.
nichestring (enum)Content niche. Defaults to "other".financeB2B · tech · beauty · fashion · fitness · travel · parenting · food · entertainment · other
marketstring (enum)UK (£) or IN (India, ₹). Defaults to UK.UK · IN
deliverableCountintegerHow many of that deliverable in the bundle. Defaults to 1.
usageRightsbooleanBrand can use the content in paid ads.
exclusivitystring (enum)Exclusivity period the brand wants. Defaults to none.none · 30_days · 60_days · 90_days
repurposingbooleanBrand can repurpose the content across channels.
includesPhotosbooleanUGC video formats only: bundle product photos with the video.
rawFootageRightsbooleanUGC video formats only: brand gets the unedited source footage.
labelstringNew name for the card; an empty string removes it.
delete_rate_cardDelete a rate cardWriteAll plans

Permanently delete one saved rate card entry. This can't be undone.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
rateCardIdrequiredstringThe rateCardId from get_rate_cards.
list_past_dealsList logged past dealsReadAll plans

List the deals the creator has logged as already closed on their Rate Card screen (their deal history). These set a floor under calculate_rate: it never suggests less than they were paid for the same platform and content type. Not the same as the deal tracker — use list_deals for active brand deals.

Asks before running: No (read-only)

No parameters.

add_past_dealLog a past dealWriteAll plans

Log a deal the creator has already closed to their deal history on the Rate Card screen, so the rate calculator never suggests less than they were actually paid. Use list_deals/create_deal for deals still in progress.

Asks before running: Usually (host decides)

ParameterTypeDescription
descriptionrequiredstringA short description of the deal in the creator's words, e.g. "5 Instagram Reels for Gymshark".
platformrequiredstring (enum)The platform the content was for.Instagram · TikTok · YouTube · Twitter/X · LinkedIn · UGC · Other
contentTyperequiredstringContent type, exactly as listed for the platform — Instagram: Feed post, Story, Reel / Short; TikTok: TikTok; YouTube: YouTube video, YouTube Short; Twitter/X: Sponsored tweet; LinkedIn: LinkedIn post; UGC: Product Video, Video Ad, Unboxing, Testimonial/Review, Tutorial, Product Photo, Photo Ad, Blog; Other: Other.
feeAmountrequirednumberThe total fee for the whole deal (all deliverables), as a plain number.
quantityintegerHow many deliverables the fee covered. Defaults to 1.
nichestring (enum)Content niche, if known.financeB2B · tech · beauty · fashion · fitness · travel · parenting · food · entertainment · other
marketstring (enum)UK (£) or IN (India, ₹).UK · IN
dealDatestringWhen the deal closed (YYYY-MM-DD), if known.
update_past_dealEdit a logged past dealWriteAll plans

Correct a deal in the creator's deal history. Only include the fields that change.

Asks before running: Usually (host decides)

ParameterTypeDescription
pastDealIdrequiredstringThe pastDealId from list_past_deals.
descriptionstringA short description of the deal in the creator's words, e.g. "5 Instagram Reels for Gymshark".
platformstring (enum)The platform the content was for.Instagram · TikTok · YouTube · Twitter/X · LinkedIn · UGC · Other
contentTypestringContent type, exactly as listed for the platform — Instagram: Feed post, Story, Reel / Short; TikTok: TikTok; YouTube: YouTube video, YouTube Short; Twitter/X: Sponsored tweet; LinkedIn: LinkedIn post; UGC: Product Video, Video Ad, Unboxing, Testimonial/Review, Tutorial, Product Photo, Photo Ad, Blog; Other: Other.
feeAmountnumberThe total fee for the whole deal (all deliverables), as a plain number.
quantityintegerHow many deliverables the fee covered. Defaults to 1.
nichestring (enum)Content niche, if known.financeB2B · tech · beauty · fashion · fitness · travel · parenting · food · entertainment · other
marketstring (enum)UK (£) or IN (India, ₹).UK · IN
dealDatestringWhen the deal closed (YYYY-MM-DD), if known.
delete_past_dealDelete a logged past dealWriteAll plans

Permanently remove a deal from the creator's deal history (it stops setting a floor under calculate_rate). This can't be undone.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
pastDealIdrequiredstringThe pastDealId from list_past_deals.

Media kit (7)

get_media_kitGet media kitReadAll plans

Return the creator's Media Kit — their public shareable page (platforms, rates, brand collabs) — including the link to share with a brand. Use when the user asks for their media kit link, wants to share their media kit, or asks what's on it.

Asks before running: No (read-only)

No parameters.

update_media_kitEdit media kitWriteAll plans

Edit the text sections of the creator's media kit: name, bio, why-work-with-me, rate justification, rate list, brands worked with, and contact details. Only include fields that change. If the kit is published, the public page shows the change straight away.

Asks before running: Usually (host decides)

ParameterTypeDescription
displayNamestringName shown at the top of the kit.
biostringThe "About me" text.
whyWorkWithMestringThe "Why work with me" text.
rateCardJustificationstringThe sentence or two shown with the rate card.
rateCardobject[]Replaces the whole rate list on the kit (in GBP). To show saved rate cards, read them with get_rate_cards first.
brandsWorkedWithstring[]Replaces the whole list of brand names shown as past collaborations.
contactEmailstringContact email brands should use.
bookingLinkstringOptional booking/calendar link; an empty string removes it.
set_media_kit_platformsChoose media kit platformsWriteAll plans

Choose which of the creator's platforms (from list_platforms) appear on their media kit. Pass null to show all of them, including any added later.

Asks before running: Usually (host decides)

ParameterTypeDescription
platformIdsrequiredobjectplatformIds to show, or null to show every platform.
update_showcase_itemsEdit showcase itemsWriteAll plans

Change the type, caption or platform tag of images/videos already in the media kit's content showcase (ids from get_media_kit). Only include fields that change. Uploading new items isn't available here — that's done in the Folio app.

Asks before running: Usually (host decides)

ParameterTypeDescription
itemsrequiredobject[]The items to change.
remove_showcase_itemRemove showcase itemWriteAll plans

Remove an image or video from the media kit's content showcase and delete the uploaded file. This can't be undone.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
showcaseItemIdrequiredstringThe showcaseItemId from get_media_kit.
set_media_kit_publishedPublish or hide media kitSends / publishesAll plans

Publish the creator's media kit (anyone with the link can see it: name, bio, audience stats, rates, brands and contact details) or hide it (the link shows a not-found page). Only call this when the user clearly asks to publish/unpublish, show/hide, or make their media kit live.

Asks before running: Yes — reaches someone outside your account

ParameterTypeDescription
isPublishedrequiredbooleantrue to publish, false to hide.
generate_media_kit_copyDraft media kit copyReadCreator · Pro

Draft the media kit's "About me", "Why work with me" and rate justification text from the creator's profile, platforms and rate cards. Nothing is saved — show the drafts to the user, and only if they want them, save with update_media_kit (aboutMe goes in bio).

Asks before running: No (read-only)

No parameters.

Platforms (4)

list_platformsList platformsReadAll plans

List the creator's social platforms with handle, follower count, engagement rate and profile link, as set in Folio's settings.

Asks before running: No (read-only)

No parameters.

add_platformAdd platformWriteAll plans

Add a social platform to the creator's profile. Its follower and engagement figures show in the audience stats of their media kit, including the public page if it's published.

Asks before running: Usually (host decides)

ParameterTypeDescription
platformrequiredstring (enum)Which platform.TikTok · Instagram · YouTube · Twitter/X · LinkedIn · Pinterest · Facebook · Twitch · Snapchat · Other
handlestringTheir handle on that platform, only if mentioned.
followerCountintegerFollower count, only if mentioned.
engagementRatenumberEngagement rate as a percentage, e.g. 3.5, only if mentioned.
profileUrlstringLink to their profile, only if mentioned.
update_platformUpdate platformWriteAll plans

Update a platform's handle, follower count, engagement rate or profile link. Only include fields that change; pass null to clear one. Changes show on the media kit, including the public page if it's published.

Asks before running: Usually (host decides)

ParameterTypeDescription
platformIdrequiredstringThe platformId from list_platforms.
handleobjectNew handle, or null to clear.
followerCountobjectNew follower count, or null to clear.
engagementRateobjectNew engagement rate (%), or null to clear.
profileUrlobjectNew profile link, or null to clear.
delete_platformRemove platformWriteAll plans

Permanently remove a platform from the creator's profile; it also disappears from their media kit. This can't be undone.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
platformIdrequiredstringThe platformId from list_platforms.

Pitches (3)

generate_pitchDraft outreach pitchWriteCreator · Pro

Draft a cold outreach pitch email to a brand the creator wants to work with, and save it to their Pitch Generator history. Only call this when the user clearly asks for a pitch or outreach email to be written for a specific brand.

Asks before running: Usually (host decides)

ParameterTypeDescription
brandNamerequiredstringThe brand to pitch. Required.
brandWebsitestringBrand website, only if mentioned.
platformsobject[]Which platforms/content types to propose, only if mentioned, e.g. [{"platform":"Instagram","contentType":"Reel","quantity":1}]. Can span multiple platforms.
targetValuenumberTarget fee in GBP, only if mentioned.
notesstringAny specific angle, product, or context the user mentioned.
list_pitchesList saved pitchesReadAll plans

List the outreach pitches saved in the creator's Pitch Generator history, newest first, 10 at a time — brand, date, subject and the full email body. Pass offset to fetch older pitches when hasMore is true.

Asks before running: No (read-only)

ParameterTypeDescription
offsetintegerHow many of the newest pitches to skip, for paging (0, 10, 20…). Defaults to 0.
delete_pitchDelete saved pitchWriteAll plans

Permanently delete one saved pitch from the creator's Pitch Generator history. Use list_pitches first to find the pitchId. This cannot be undone.

Asks before running: Yes — deletes or can't be undone

ParameterTypeDescription
pitchIdrequiredstringThe pitchId from list_pitches.

Account and Folio Value (5)

get_folio_value_indexGet Folio Value and Folio IndexReadAll plans

Return the creator's Folio Value (private £ valuation) and Folio Index (0-100 public reliability score shown on their media kit) — current numbers, tier, confidence level, the banked/locked-in/in-play cashflow breakdown, what moved since last month, and the single biggest available opportunity to raise it. Use when the user asks about their Folio Value, Folio Index, Folio Score, their valuation, their reliability score, why it changed, or how to improve it.

Asks before running: No (read-only)

No parameters.

get_profileGet creator profileReadAll plans

Return the creator's Folio profile — display name, legal name and address used on contracts, email, VAT number, bio, niches, audience location, current plan, and their platforms with follower counts and engagement. Use when the user asks about their profile, account details or which platforms Folio has on file.

Asks before running: No (read-only)

No parameters.

update_profileUpdate creator profileWriteAll plans

Change fields on the creator's Folio profile (Settings → Profile): display name, bio, and the legal name, address and VAT number used on contracts. Only include fields the user explicitly asked to change. Invoice details live in the business profile (update_business_profile) instead.

Asks before running: Usually (host decides)

ParameterTypeDescription
displayNamestringNew display name. Only if the user asked to change it.
legalNamestringNew legal name as it should appear on contracts. Only if the user asked to change it.
addressstringNew postal address as it should appear on contracts. Only if the user asked to change it.
biostringNew short bio. Only if the user asked to change it.
vatNumberstringNew VAT number. Only if the user asked to change it.
get_business_profileGet business profileReadAll plans

Return the business details printed on the creator's invoices — entity type, legal and trading name, company number, business address, VAT registration, payment terms and footer note — plus whether a payment method is on file and what is still missing before invoices can be sent. Bank details are never returned.

Asks before running: No (read-only)

No parameters.

update_business_profileUpdate business profileWriteAll plans

Change the business details printed on the creator's future invoices (already-issued invoices keep the old details). Only include fields the user explicitly asked to change; everything else is kept, and an empty string clears an optional field. Bank details and payment links can only be changed in the Folio app.

Asks before running: Usually (host decides)

ParameterTypeDescription
entityTypestring (enum)How the creator trades. Only if the user asked to change it.sole_trader · limited_company · partnership
legalNamestringLegal name of the person or company. Only if the user asked to change it.
tradingNamestringTrading name, if different from the legal name. Only if the user asked to change it.
companyNumberstringCompanies House number (required for limited companies). Only if the user asked to change it.
addressLine1stringBusiness address line 1. Only if the user asked to change it.
addressLine2stringBusiness address line 2. Only if the user asked to change it.
citystringTown or city. Only if the user asked to change it.
postcodestringPostcode. Only if the user asked to change it.
countrystringTwo-letter country code, e.g. GB. Only if the user asked to change it.
vatRegisteredbooleanWhether the creator is VAT registered. Only if the user asked to change it.
vatNumberstringVAT number in the format GB123456789 (required when VAT registered). Only if the user asked to change it.
paymentTermsDaysintegerDays a brand has to pay an invoice. Only if the user asked to change it.
invoiceFooterNotestringNote printed at the bottom of invoices. Only if the user asked to change it.

Data and privacy

  • The server never returns bank details or payment links, and they can't be changed through MCP.
  • We log each tool call (tool, time, whether it worked). Changes made through a connected assistant also appear in the creator's activity feed.
  • We don't see the conversation with the assistant — only the tool calls it sends.

The creator's assistant handles the data it receives under the creator's own terms with that platform. See the privacy policy and terms.

Support

Questions, problems connecting, or building an integration? Email support@folioandkit.com. New tools and changes are announced in the changelog.