Partiful MCP Server
A self-hosted Partiful MCP server and API that lets you operate Partiful events and guest workflows locally from MCP clients, REST, or Python.
Manage events: list/get, create, update, duplicate, cancel, and delete events you host or cohost.
Manage guests: list RSVP status, check-in state, plus-ones, notes, and questionnaire answers; export the Partiful guest-list CSV.
Run door and approval workflows: check guests in or undo check-in; approve pending guests individually or all.
Invite people: list past guests/mutuals and invite them through Partiful, or invite people by email.
Send Text Blasts to chosen RSVP status groups, optionally showing them in the event feed.
Access the same tools through MCP over stdio/HTTP, a local REST API with OpenAPI docs, or Python
call(...)scripts.Use read-only mode to expose only the 5 read tools; server is local by default and uses your own Chrome Partiful session.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Partiful MCP Servershow me the guest list for my birthday party and who's approved"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Partiful API and MCP server, self-hosted
A Partiful API and a Partiful MCP server you run on your own computer, in Python, on the session of your own Google Chrome. All 14 Partiful tools we run in production at Cotlet: events, guest lists with questionnaire answers, the Export CSV file, check-in, Guest Approval, invites and Text Blasts.
Partiful has no public API and no official MCP server. This repo gives you both:
MCP server for Claude Code, Claude Desktop, Cursor, Codex and any MCP client, over stdio or HTTP. Setup
REST API on
http://127.0.0.1:8787/api/v1/partiful, with OpenAPI docs at/docs. SetupPython:
call("list_guests", event_id="..."), plus 9 ready scripts inexamples/.
It is for technical people who want to run it themselves, for noncommercial use only (license). If you want it running 24/7 on a server, kept working when Partiful changes its site, for a team or a business, use the hosted version at cotlet.dev.
git clone https://github.com/cotletdev/partiful-api-mcp-server.git && cd partiful-api-mcp-server
python3 -m venv .venv && . .venv/bin/activate && pip install -e .
partiful-mcp connect # reads your Partiful session from Chrome
partiful-mcp call list_events
claude mcp add partiful -- "$PWD/.venv/bin/partiful-mcp" mcpContents
Related MCP server: byob
How it works
AI agent (MCP) / script (REST, Python) ──▶ partiful-mcp on your computer ──your Partiful sign-in──▶ api.partiful.com
▲ Firestore
partiful-mcp connect ───────┘ reads it once from your Chrome (DevTools Protocol)You sign in to Partiful in your own Chrome, with your phone number and the code Partiful texts you.
partiful-mcp connectattaches to that Chrome through the Chrome DevTools Protocol. It reads the partiful.com cookies and, from a partiful.com tab, the signed-in user that the Partiful web app keeps in IndexedDB (Firebase, with its refresh token). If no Partiful tab is open, it opens one in the background and closes it again. Both are saved to~/.config/partiful-api-mcp/session.json, readable by your user only.Every tool call is a request to the endpoints the Partiful web app calls itself: its functions on
api.partiful.com, and Firestore for guest lists and event edits. Requests go out with curl_cffi, which copies Chrome's TLS fingerprint. No headless browser runs.
Partiful's sign-in token lasts an hour. The server renews it from the saved refresh token at Google's securetoken.googleapis.com, the way the web app does, so you connect once and not every hour. When Partiful ends the session, the server reads it from Chrome again, if Chrome is open with remote debugging on.
Requirements
Python 3.11 or newer.
Google Chrome 144 or newer, signed in to Partiful on partiful.com. Any Chrome or Chromium works with a debugging port.
macOS, Linux or Windows.
A Partiful account that hosts the events. Reading and changing an event's guest list, approvals, check-in, invites and Text Blasts work for events you host or cohost.
get_eventopens any event your account can see.
Install
git clone https://github.com/cotletdev/partiful-api-mcp-server.git
cd partiful-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
partiful-mcp --versionWith uv: uv venv && uv pip install -e ., then uv run partiful-mcp ....
Setting it up with an AI agent (Claude Code, Codex, Cursor)? Open it in this folder and ask it to set up the repo: AGENTS.md tells it every step, and it asks you only for the steps in Chrome.
To update: git pull && pip install -e .. We copy every change of the hosted Partiful tools into this repo.
Connect your Chrome
Option A: your everyday Chrome (recommended)
Open
chrome://inspect/#remote-debuggingin Chrome and switch remote debugging on. Chrome then accepts DevTools connections from programs on this computer, and asks you before each one.Make sure you are signed in at partiful.com.
Run:
partiful-mcp connectChrome asks whether to allow the connection. Click Allow.
Saved 16 Partiful cookies and 1 sign-in keys to /Users/you/.config/partiful-api-mcp/session.json
Signed in to Partiful as Maya ChenYou can switch remote debugging off again afterwards. Leave it on if you want the server to pick up a new session by itself after Partiful signs you out.
connect looks for Chrome's DevToolsActivePort file in the default profile folder. For Chrome Beta, Canary or a custom profile folder, pass --profile-dir "<folder>".
Option B: a Chrome with a debugging port
Chrome does not open a debugging port on your default profile, so start a separate one, sign in to Partiful there once, and connect to it:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-partiful"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-partiful"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-partiful"
partiful-mcp connect --cdp http://127.0.0.1:9222--cdp also takes a ws:// DevTools URL, for example of a Chrome on another machine reached over an SSH tunnel.
There is no paste-a-cookie option. Partiful's API takes the signed-in user from the browser's IndexedDB, not a cookie, so connect needs a running Chrome once. After that the session file works on its own, also on a machine without Chrome.
Check the session at any time:
partiful-mcp statusMCP server
The MCP server lists every tool with its input schema, a description written for agents, and hints: read tools are marked read-only, and tools that invite, text, approve or delete are marked so your client asks before running them.
Claude Code
claude mcp add partiful -- /path/to/partiful-api-mcp-server/.venv/bin/partiful-mcp mcp
# read only:
claude mcp add partiful -- /path/to/partiful-api-mcp-server/.venv/bin/partiful-mcp mcp --read-onlyClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"partiful": {
"command": "/path/to/partiful-api-mcp-server/.venv/bin/partiful-mcp",
"args": ["mcp"]
}
}
}Cursor
~/.cursor/mcp.json, the same block as Claude Desktop. A ready copy is in mcp.json.
Codex
~/.codex/config.toml:
[mcp_servers.partiful]
command = "/path/to/partiful-api-mcp-server/.venv/bin/partiful-mcp"
args = ["mcp"]Over HTTP
partiful-mcp serve also serves MCP over streamable HTTP at http://127.0.0.1:8787/mcp, for clients that take a URL:
partiful-mcp serve
claude mcp add --transport http partiful http://127.0.0.1:8787/mcpThen ask your agent things like:
Who is going to Friday's dinner, and what dietary restrictions did they put in the questionnaire?
Approve all pending guests to my launch party who answered with a company name, and list the rest for me.
Copy last month's book club for November 14 at 7pm and invite the people who came.
Text everyone who is Going or Maybe to my rooftop dinner that the door code is 4512.
REST API
partiful-mcp serve # http://127.0.0.1:8787, MCP at /mcp, docs at /docsEach tool has its own route under /api/v1/partiful, the same paths as the hosted API at cotlet.dev, so code written against one works with the other. Path parts and the query string are arguments, and a JSON body adds the rest.
curl 'http://127.0.0.1:8787/api/v1/partiful/events?when=past'
curl 'http://127.0.0.1:8787/api/v1/partiful/events/hK3vQ9xLm2Pa7RtYc4Wd/guests?status=going'
curl -X PATCH http://127.0.0.1:8787/api/v1/partiful/events/hK3vQ9xLm2Pa7RtYc4Wd \
-H 'Content-Type: application/json' \
-d '{"location": "21 Mercer St, New York"}'Any tool by name, body as its arguments:
curl -X POST http://127.0.0.1:8787/api/v1/partiful/tools/list_guests -d '{"event_id": "hK3vQ9xLm2Pa7RtYc4Wd"}'GET /api/v1/partiful/tools: every tool with its route, input schema and an example answer.GET /docs: interactive OpenAPI docs,GET /openapi.jsonthe schema, for n8n, Postman or a generated client.Answers are JSON. Lists return
next_cursor; pass it back ascursorfor the next page.
The server listens on 127.0.0.1 only. To reach it from another device of yours, set a token, and every request then needs Authorization: Bearer <token>:
PARTIFUL_MCP_TOKEN=$(openssl rand -hex 24) partiful-mcp serve --host 0.0.0.0Python and the example scripts
Straight from Python, no server needed:
from partiful_api_mcp import call
from partiful_api_mcp.scripting import paginate, write_rows
events = call("list_events")["events"]
going = list(paginate("list_guests", {"event_id": events[0]["event_id"], "status": "going"}, "guests"))
write_rows(going, "going.csv")
call("update_event", event_id=events[0]["event_id"], location="21 Mercer St, New York")Or one tool from the shell: partiful-mcp call list_guests event_id=hK3vQ9xLm2Pa7RtYc4Wd status=pending, or with a JSON object.
Ready scripts in examples/. Each prints JSON or text, takes --out file.csv or --out file.json where it makes sense, and --help:
Script | What it does |
Events you host, with date, status and guests per RSVP status. | |
Saves the same CSV as the Export CSV button. | |
Guests of one or more events as sheet rows, one column per questionnaire question. | |
Each questionnaire answer with how many guests gave it and who, plus who has not answered. | |
Approves pending guests whose answers match | |
Checks guests in by name, or undoes it. | |
Past guests and mutuals you can invite, | |
Copies an event to a new date and invites the people who were going. | |
A Text Blast to chosen RSVP statuses, after showing how many people it reaches. |
python examples/export_guest_list.py --event hK3vQ9xLm2Pa7RtYc4Wd --status going --out rsvps.csv
python examples/approve_pending_guests.py --event hK3vQ9xLm2Pa7RtYc4Wd --match inc --dry-runOn a schedule, cron on your own computer works while it is on: 0 8 * * 1 cd ~/partiful-api-mcp-server && .venv/bin/python examples/export_rsvps.py --event <id> --status going --out rsvps.csv.
All 14 tools
event_id is the id in the event's link: hK3vQ9xLm2Pa7RtYc4Wd for partiful.com/e/hK3vQ9xLm2Pa7RtYc4Wd. list_events returns it. partiful-mcp tools prints this list, partiful-mcp tools --json adds the input schemas.
Events
Tool | Access | REST route | What it does |
| read |
| Events you host, with date, status and guest counts. |
| read |
| Full event: title, description, start and end, location, RSVP deadline, guest limit, Guest Approval and waitlist settings, link. |
| write |
| New event page. Nobody is invited until you call invite_guests. |
| write |
| Change the details or settings of an event you host. |
| write |
| Copy an event with its settings to a new date. The copy has no guests yet. |
| write |
| Cancel an event. Partiful notifies the guests. |
| write |
| Delete an event you host for everyone, with its guest list. |
Guest list
Tool | Access | REST route | What it does |
| read |
| Guests of an event with RSVP status, check-in and Guest Questionnaire answers. |
| read |
| The guest list as CSV, the same file as the Export CSV button. |
| write |
| Mark guests as checked in at the door, or undo it. |
| write |
| Approve pending guests on a Guest Approval event. |
Invites and Text Blasts
Tool | Access | REST route | What it does |
| read |
| People you can invite: your past guests and mutuals. |
| write |
| Invite past guests and mutuals through Partiful, or anyone by email. |
| write |
| Text a message to guests by RSVP status. Partiful allows up to 10 Text Blasts per event. |
Not built: inviting phone numbers (Partiful takes phone contacts only in its app), rejecting or removing guests, changing a guest's RSVP, cohosts, comments and photos, replies to a Text Blast, tickets, themes and Discover. Never built, on purpose: your Partiful sign-in, phone number, name and profile, and anything that moves money. Every request passes a guard that refuses those Partiful paths.
Configuration
Variable | Default | What it does |
|
| Folder of |
| Proxy for every request to Partiful, e.g. | |
|
| |
| Bearer token required by | |
|
| Address of |
Security and your Partiful account
No codes, no password. Partiful signs you in with a texted code. This code never asks for it: it reads the session Chrome already holds.
The session file is yours.
session.jsonis created with mode 0600 and holds the partiful.com cookies and the Firebase refresh token. Anyone who has it can act as you on Partiful, so keep it out of git and shared folders.Local by default.
servebinds to127.0.0.1and refuses another address withoutPARTIFUL_MCP_TOKEN.Three hosts only. Requests and redirects go only to partiful.com,
securetoken.googleapis.com(token renewal) andfirestore.googleapis.com(guest lists, event edits).Read-only mode.
--read-onlyorPARTIFUL_MCP_READ_ONLY=1exposes the 5 read tools only.Actions reach real people. Invites, Text Blasts, approvals and cancellations go out to real phones and inboxes at once, and a blast cannot be pulled back. MCP clients ask before running them; a script does not, so try it on a test event first.
Do not spam. Partiful caps Text Blasts at 10 per event and invites at 1,000 per event. You are responsible for what runs in your account.
Errors
The REST API answers {"error": "<code>", "message": "..."}. The MCP server returns the same code and message as a tool error.
Status | Code | What to do |
401 |
| No session, or Partiful signed you out. Sign in to Partiful in Chrome and run |
403 |
| Only a host of the event can do this. |
403 |
| The server runs read-only, or the request would change your Partiful account. |
403 |
| Partiful refused the request or showed a bot check. Open partiful.com in Chrome once, then retry. |
409 |
| Partiful asks for a CAPTCHA. Solve it in Chrome. |
422 |
| An argument is missing or wrong; the message names it. |
429 |
| Partiful is limiting the account. Wait a few minutes. |
502 |
| Partiful answered with an error, or changed its site. |
Self-hosted or hosted
This repo | ||
Tools | the same 14 | the same 14 |
Runs | on your computer, while it is on | in the cloud, 24/7 |
Partiful session | your Chrome, cookies and refresh token in a local file | your own Cloud Browser in the EU, profile encrypted with AES-256-GCM |
When Partiful changes its site |
| fixed for you, every tool tested daily |
Approvals | your MCP client asks per call | invites, Text Blasts and approvals wait for your OK, switchable per tool |
Works with | MCP clients on your machine, local scripts | Claude.ai and ChatGPT connectors, n8n, Make, Zapier, any HTTP client |
Who may use it | you, for noncommercial use | teams, businesses, agencies |
Price | free | free 7-day trial with 2,000 credits, no card; then one-time packs from $29 for 5,000 credits |
On the hosted version a successful Partiful call uses 25 credits, failed calls are free, and the Cloud Browser uses 50 credits a day while it has an app enabled for agents. Full pricing.
FAQ
Does Partiful have an official API? No. Partiful has no public API, no developer docs and no webhooks, and its help center documents no Zapier or Make connection. Guest data leaves Partiful only as a CSV you export by hand with the Export CSV button. Details: cotlet.dev/integrations/partiful-api-mcp-server.
Is there a Partiful MCP server for Claude, ChatGPT or Cursor?
Yes, this one runs on your machine: partiful-mcp mcp for Claude Code, Claude Desktop, Cursor and Codex. ChatGPT and Claude.ai connectors need a public HTTPS URL, which the hosted Partiful MCP server gives you.
Can I export a Partiful guest list to CSV or Google Sheets?
Yes: python examples/export_guest_list.py --event <id> --out guests.csv saves the Export CSV file, and examples/export_rsvps.py gives one row per guest with a column per questionnaire question, for a sheet. Phone numbers and emails are not in either, as in Partiful's own export.
Can it send Text Blasts?
Yes, send_text_blast to the RSVP statuses you choose. Partiful allows 10 per event and does not say how many are left, and a blast to Invited works only up to 100 people. A sent blast cannot be edited or pulled back.
Can it invite people by phone number?
No. Partiful takes phone contacts only in its app. invite_guests invites Partiful users from list_past_guests and anyone by email.
Why does it need my Chrome? To read your Partiful session without a texted code. Chrome is used once per sign-in, not for each call: the hourly token renewal goes to Google directly.
What happens when Partiful signs me out?
Calls fail with auth_expired. With Chrome remote debugging on, the server reads the new session on the next call (click Allow when Chrome asks); otherwise sign in on partiful.com and run partiful-mcp connect again.
Can it run on a VPS or in Docker?
Technically yes: connect once on a machine with Chrome and copy session.json to the server, into PARTIFUL_MCP_HOME. Partiful then sees your session from a datacenter IP, which looks less like you. For an always-on setup the hosted version keeps your session in your own Cloud Browser on a fixed IP.
Will my Partiful account get banned? Requests carry Chrome's fingerprint and go out one at a time, as you would click. Nobody can promise a platform never acts. Keep to your normal use and do not blast or invite people who did not ask for it.
Can I use it at work or for my clients? No, the license allows noncommercial use only. For a team, a company or client work, use Cotlet or write to contact@cotlet.dev.
Is it open source? The source is public, the license is not an open source license: noncommercial use only, no business use.
A tool broke or I need another one. Open an issue with the tool name and the error message.
License
PolyForm Noncommercial License 1.0.0. In short:
Allowed: noncommercial use: you, for your own personal purposes with your own Partiful account, or a charity, school, public research or government body. Changing the code, and sharing it under the same license.
Not allowed: any commercial use, your own business included; client work; selling or offering it, or a service built on it.
Maintained by Cotlet (@cotletdev). Partiful is a trademark of its owner. This project is unofficial and not affiliated with, endorsed or sponsored by Partiful.
Available Tools
14 toolsapprove_guestsApprove guestsADestructiveInspect
Approve pending guests on a Guest Approval event.
Moves the given pending guests, or all of them, to Approved, as Approve on the host's guest list does. Partiful tells each approved guest by text or email. Ids that are not pending are refused before the call waits for your approval. Returns how many were approved and how many still wait. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Approve everyone who is pending instead. Default: false. | |
| event_id | Yes | event_id from list_events. | |
| guest_ids | No | Pending guest_id values from list_guests (status pending). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that Partiful texts or emails each approved guest (explaining why destructiveHint and openWorldHint are set), that invalid ids abort the call before it waits for confirmation, that the call has an approval gate, and that the caller must be a host. These are exactly the side effects and preconditions an agent needs before a mutating call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and scope in the first two sentences, then tacks on preconditions and return shape in order of importance. The aside 'as Approve on the host's guest list does' is a small UI-mapping flourish, but no sentence is dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully reports the return shape (approved count plus still-waiting count) and covers side effects and permissions for a destructive mutation. It does not say what happens if all and guest_ids are supplied together, which is the one unresolved ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the basics; the description still adds meaning by framing guest_ids as 'the given pending guests' versus all as 'everyone who is pending', and by stating the pending-only validation rule that the schema does not encode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (Approve) and resource (pending guests on a Guest Approval event), and states scope: the given guests, or all of them. An agent can distinguish it from invite_guests and check_in_guests without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Hosts only" gives a prerequisite, and "Ids that are not pending are refused" tells the agent which inputs are valid, so the pending-only condition is explicit. There is no direct routing statement against siblings like check_in_guests, which is the remaining gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_eventCancel eventADestructiveInspect
Cancel an event. Partiful notifies the guests.
Cancels the event as Cancel event on its page does: the page stays up marked canceled. By default Partiful texts the guests on the list with your message, so this reaches real people; notify_guests false cancels without telling anyone. An event that is already canceled is refused. It cannot be undone here. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Note to guests sent with the cancellation. | |
| event_id | Yes | event_id from list_events. | |
| notify_guests | No | Let Partiful tell the guests that the event is canceled. Default: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/non-idempotent, but the description adds the crucial consequence the annotations cannot convey: real guests receive texts by default, the event page persists in a canceled state rather than disappearing, repeat cancellation is refused, and the action cannot be undone here. This is exactly the extra context a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered with scope, side effects, and constraints in short sentences. Every sentence adds distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent the observable outcome (page remains up, marked canceled, guests texted unless disabled) and the failure mode (already-canceled refused). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real-world meaning beyond the schema by emphasizing that notify_guests defaults to reaching real people and that the message is delivered with the cancellation. That consequence framing is genuinely useful over the bare schema field notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Cancel an event') and immediately clarifies the scope of that cancellation: the page stays up marked canceled, which implicitly distinguishes it from the destructive delete_event sibling. 'Hosts only' further pins the caller scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: default behavior texts guests, notify_guests=false suppresses that, already-canceled events are refused, and the action is irreversible. It stops short of naming delete_event as the alternative when permanent removal is wanted, so it is strong but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_in_guestsCheck in guestsAInspect
Mark guests as checked in at the door, or undo it.
Checks the given guests in, as the host's check-in list does, or takes the check-in back with undo. Guests get no message. Ids that are not on the guest list are refused. Returns how many guests changed and how many are checked in now. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| undo | No | Remove the check-in instead. Default: false. | |
| event_id | Yes | event_id from list_events. | |
| guest_ids | Yes | guest_id values from list_guests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that guests receive no message (no notification side-effect), that ids not on the guest list are refused (error behavior), that only hosts may call it (auth requirement), and what the response summarizes. These are exactly the mutation details annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The primary action is in the first sentence, with undo second and edge-case/return details following in short, dense sentences. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive, non-idempotent mutation with no output schema, the description covers side effects, permissions, error handling, and return shape — everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so event_id, guest_ids, and undo are already fully documented, and the description mostly restates them. It adds only the refusal rule for unknown ids, which is marginal over the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark guests as checked in at the door') plus the inverse operation ('undo it'), which is unambiguous against siblings like approve_guests and invite_guests. An agent can tell this is the door check-in action, not the invite/approve flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the undo path and the 'Hosts only' permission gate, and notes that non-guest ids are refused, giving clear conditions for use. It does not explicitly contrast with approve_guests or invite_guests, so the sibling differentiation is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventCreate eventAInspect
New event page. Nobody is invited until you call invite_guests.
Creates and publishes an event page hosted by this account, as Create on partiful.com does, with Partiful's default theme. It is private (only people with the link) unless visibility is public. Nobody is invited or texted; share url or call invite_guests. Times without an offset are read in timezone. Guest Approval and a guest limit exclude each other, so a call with both is refused. Returns the new event.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Event title. | |
| end_at | No | End, ISO 8601. Optional; must be after start_at. | |
| location | No | Address, place name or link. | |
| start_at | Yes | Start, ISO 8601. Without an offset it is read in the event's time zone. | |
| timezone | No | IANA zone the event is shown in, e.g. America/New_York. Default: the browser's zone. | |
| questions | No | Guest Questionnaire, short-answer questions asked at RSVP. An empty list turns it off. | |
| max_guests | No | Guest limit; RSVPs over it go to the waitlist. null removes the limit. | |
| visibility | No | private: only people with the link (default). public: anyone on or off Partiful. | |
| description | No | Event details shown on the page. | |
| rsvp_deadline | No | Last moment guests can RSVP, ISO 8601. | |
| guest_approval | No | Guests ask to join and you approve them (Guest Approval). Clears max_guests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the event is published immediately, private by default unless visibility is public, uses Partiful's default theme, sends no invitations or texts, and returns the new event. It also states the Guest Approval and guest-limit conflict and the timezone behavior for offsetless times.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key scoping statement is front-loaded and the description is appropriately sized for an 11-parameter creation tool. There is some redundancy around 'nobody is invited' and invite_guests, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool, the rich schema, and the absence of an output schema, the description is complete enough for an agent to call it correctly. It covers publishing behavior, privacy, invitation behavior, timezone handling, parameter conflicts, and the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries most parameter meaning. The description adds useful semantics by calling out the mutual exclusion between Guest Approval and guest limit and the timezone interpretation for times without offsets.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it creates and publishes an event page hosted by the account. It also distinguishes the creation step from invitation by explicitly saying nobody is invited until invite_guests is called.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the main usage context and names invite_guests as the alternative for inviting guests, plus the share-url path. It does not explicitly route the agent away from siblings like update_event or duplicate_event, so it stops short of full when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventDelete eventADestructiveInspect
Delete an event you host for everyone, with its guest list.
Deletes the event as Delete event in its settings does: the page, guest list, photos and messages are gone for everyone and cannot be restored. Guests who RSVPd may be told by Partiful. To keep the page and tell guests, use cancel_event. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | event_id from list_events. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds the material specifics: exactly what is destroyed (page, guest list, photos, messages), that it is irreversible, that guests may be notified by Partiful, and that host permission is required. This is real value beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Scope is front-loaded, consequences follow, then the alternative, then the permission gate. Four short sentences, each carrying distinct information with no repetition of the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-parameter tool with no output schema, the description covers irreversibility, blast radius, side effects on third parties, authorization, and the safer sibling. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage, the schema already documents event_id and even points to list_events as its source. The description adds no further constraint or format detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (delete), the resource (event), and the scope (one you host, for everyone, including the guest list). It is immediately distinguishable from cancel_event, which is explicitly cited as the non-destructive counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent: if the goal is to keep the page and notify guests, use cancel_event instead. It also states the precondition ('Hosts only'), so both the when and the who are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_eventDuplicate eventAInspect
Copy an event with its settings to a new date. The copy has no guests yet.
Makes a copy as Duplicate on the event page does: title, description, location, theme, questionnaire and RSVP settings, no guests and no messages. The copy starts at start_at and keeps the original's length; Partiful does not copy the RSVP deadline. Nobody is invited. Returns the new event. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title of the copy. Default: the same. | |
| event_id | Yes | event_id from list_events. | |
| start_at | Yes | Start of the copy, ISO 8601. Without an offset it is read in the event's time zone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the mutation annotations, it discloses exactly what is copied (title, description, location, theme, questionnaire, RSVP settings), what is omitted (guests, messages, RSVP deadline), that length is preserved, that nobody is invited, and that it returns the new event. It does not contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and appropriately detailed. It is slightly repetitive about guests and invitations—'no guests yet,' 'no guests and no messages,' and 'Nobody is invited'—but the repetition does add emphasis to an important constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the mutation, lack of output schema, and simple parameter set, the description is complete: it covers source event selection, copied fields, omitted fields, resulting event, host restriction, and return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains the three parameters. The description adds useful behavioral meaning for start_at by noting that the copy keeps the original's length and that the RSVP deadline is not copied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: copy an event to a new date. It clearly scopes what is copied and what is not (settings yes, guests/messages no), which distinguishes it from create_event, update_event, and delete_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context that this is for duplicating an existing event with its settings, in contrast to creating from scratch. It also states the 'Hosts only' prerequisite, though it does not explicitly name alternative sibling tools or exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_guest_listExport guest listARead-onlyIdempotentInspect
The guest list as CSV, the same file as the Export CSV button.
Returns the file the host's Export CSV button downloads, for the chosen RSVP statuses. Columns are Partiful's: Name, Status, Checked in, Check-in Time, RSVP date, then one column per Guest Questionnaire question. Status is Partiful's label, for example Approved on a Guest Approval event. The file text comes back in csv, not as a link, with rows (guests in the file) and a suggested filename. The file has no guest ids, emails or phone numbers; for guest ids use list_guests. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | event_id from list_events. | |
| statuses | No | RSVP statuses to include: going, maybe, cant_go, invited, waitlist, pending. Default: all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description still adds a lot: the file arrives as inline csv text rather than a link, it carries the column list, and it deliberately excludes guest ids, emails and phone numbers. It stops short of noting size limits or truncation behavior for very large guest lists, which is the one real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the artifact identity and the button equivalence. Slightly dense—the column list is long—but each sentence carries distinct information and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully describes the return payload: csv file text, the row count, and a suggested filename. Combined with the column and exclusion notes, an agent knows exactly what it will receive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining that Status is Partiful's own label (e.g. 'Approved on a Guest Approval event') and that the default is all statuses. It adds meaning about what the enum values actually render as, which the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (export the guest list as CSV) and pins down the exact artifact: the same file the host's Export CSV button downloads. It also distinguishes itself from list_guests by flagging that this file has no guest ids, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly redirects to a sibling: 'for guest ids use list_guests', and names the audience constraint 'Hosts only'. It also states the selection condition ('for the chosen RSVP statuses'), so when-to-use and the alternative are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventGet eventARead-onlyIdempotentInspect
Full event: title, description, start and end, location, RSVP deadline, guest limit, Guest Approval and waitlist settings, link.
Returns one event as its page shows it to the host, with guests per RSVP status and the Guest Questionnaire questions. Times are in the event's time zone. Works for any event the account can open; the write tools need an event it hosts.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | event_id from list_events. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds real context beyond them: the host's view of the page, guests grouped per RSVP status, questionnaire questions included, and times expressed in the event's own time zone. It does not address error behavior for an inaccessible or missing event.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the payload and followed by return scope, time zone, and permission notes. The opening field enumeration overlaps somewhat with the 'as its page shows it to the host' sentence, a small redundancy but not bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so by listing the fields, guest grouping, and questionnaire content. Time-zone and permission context round it out; only failure modes for a bad event_id are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already explains that event_id comes from list_events. The description body adds no further semantics about the identifier, so the baseline 3 for schema-covered parameters applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (get) and resource (one event) and enumerates the payload the agent will receive: title, description, times, location, RSVP deadline, guest limit, approval/waitlist settings, link. It separates itself from list_events by stating it returns one event and from the write siblings by noting they require an event the account hosts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usability boundary ('Works for any event the account can open') and contrasts with the write tools, which need a hosted event. It does not explicitly tell the agent to call list_events first to obtain the id, though the schema parameter note does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_guestsInvite guestsADestructiveInspect
Invite past guests and mutuals through Partiful, or anyone by email.
Sends invites as the host's Invite screen does, so they reach real people: Partiful users from list_past_guests get Partiful's invite, people in emails get an email with the event link and your note. There is no way to invite a phone number: Partiful takes phone contacts only in its app. Email invitees still sign in with a phone number to RSVP. Partiful allows 1,000 invites per event, 500 of them by email. A canceled event is refused. invited_total is the event's Invited count after the call. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| emails | No | People to invite by email, with the name the invite greets. | |
| message | No | Personal note sent with the invites. | |
| event_id | Yes | event_id from list_events. | |
| user_ids | No | user_id values from list_past_guests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing real-world side effects ('they reach real people'), hard quotas (1,000 invites per event, 500 by email), a refusal condition (canceled event), an auth prerequisite (Hosts only), and the meaning of the return field invited_total. This is exactly the context destructiveHint=true and openWorldHint=true imply but do not explain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the two invite channels are front-loaded, and each subsequent sentence carries distinct operational information (limits, refusals, return value, permissions). No sentence merely restates the name or the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with no output schema, the description supplies everything an agent needs: valid input sources, quotas, failure modes, permission requirement, and the meaning of the single returned count. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: user_ids must come from list_past_guests, emails carry a name 'the invite greets,' and message is the personal note delivered with the invite. The phone-sign-in note further clarifies why email invitees still need a phone number.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus its two delivery modes: 'Invite past guests and mutuals through Partiful, or anyone by email.' This clearly separates it from siblings like approve_guests, send_text_blast, and export_guest_list without the agent needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to source lists (user_ids from list_past_guests, emails for anyone else) and states an exclusion: phone numbers cannot be invited, only Partiful's app takes phone contacts. It also gates on 'Hosts only.' It stops short of naming sibling alternatives (e.g. approve_guests for pending requests), so it is clear context rather than a full when/when-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsList eventsARead-onlyIdempotentInspect
Events you host, with date, status and guest counts.
Returns the events this account hosts or cohosts, as the Hosting tab of the home page lists them: start and end in the event's time zone, active or canceled, and guests per RSVP status. Events you were only invited to are left out. Upcoming come soonest first, past most recent first. Use event_id in the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| when | No | upcoming, past or all. Default: upcoming. | |
| limit | No | 1 to 50. Default: 20. | |
| cursor | No | next_cursor from the previous call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the description's added value here is real: it discloses the inclusion rule (hosted or cohosted only, invitees excluded), the sort order per time range, and the meaning of the returned fields. It stops short of covering pagination behavior or result-size limits beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what the tool returns and followed by scope, ordering, and the event_id hand-off. No sentence repeats structured data or wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns, and it does so well (fields, ordering, statuses, guest counts). It doesn't sketch the shape of an individual event object or mention pagination fields, which would matter for an agent assembling follow-up calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies, but the description adds genuine meaning: 'Upcoming come soonest first, past most recent first' explains the consequence of the `when` enum values rather than just restating them. `limit` and `cursor` are left entirely to the schema, so it isn't a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (events this account hosts or cohosts) and enumerates what is returned: start/end in event time zone, active or canceled status, and guest counts per RSVP status. Scope exclusions ('events you were only invited to are left out') further sharpen the purpose. It doesn't explicitly distinguish itself from siblings like get_event or list_past_guests, which keeps it at 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use event_id in the other tools' gives an explicit hand-off to the rest of the toolset, and the Hosting-tab analogy plus the invited-events exclusion give clear usage context. There's no explicit statement of when to prefer get_event (single event detail) over this list, so it isn't a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_guestsList guestsARead-onlyIdempotentInspect
Guests of an event with RSVP status, check-in and Guest Questionnaire answers.
Returns the guest list the host sees, oldest RSVP first: name, RSVP status, party size with plus-one names, check-in, RSVP note and questionnaire answers. Hosts only. going includes guests approved on a Guest Approval event. guest_id goes to approve_guests and check_in_guests; total counts the guests that match the filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 1 to 200. Default: 100. | |
| cursor | No | next_cursor from the previous call. | |
| status | No | all, going, maybe, cant_go, invited, waitlist or pending. Default: all. | |
| event_id | Yes | event_id from list_events. | |
| checked_in | No | Only guests who are checked in (true) or not (false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real behavior: the host-scoped visibility ('the guest list the host sees'), the sort order ('oldest RSVP first'), and the subtlety that 'going' includes guests approved on a Guest Approval event. It does not discuss pagination behavior beyond the schema's cursor field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sections with the resource and its returned fields front-loaded, followed by cross-references to related tools. Dense but every sentence carries information; nothing repeats structured fields verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values and does so thoroughly — field list, ordering, totals, and host visibility. The only mild gap is how limit and cursor interact across pages, which is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description genuinely adds meaning: guest_id is explained as the identifier to pass to approve_guests and check_in_guests, and 'total counts the guests that match the filters' clarifies how the total relates to the status/checked_in filters. It also disambiguates the 'going' enum value, which the schema alone does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely (guests of an event) and enumerates what is returned: RSVP status, check-in, party size with plus-one names, RSVP note, questionnaire answers. It doesn't explicitly distinguish itself from sibling list_past_guests or export_guest_list, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Hosts only' provides a permission prerequisite, and the note that guest_id feeds approve_guests and check_in_guests hints at downstream workflows. However, there is no statement of when to prefer this tool over list_past_guests or export_guest_list, leaving the usage context implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_past_guestsList past guestsARead-onlyIdempotentInspect
People you can invite: your past guests and mutuals.
Returns the people Partiful offers on an event's Invite screen: past guests of your events and mutuals from events you went to, with how many events you shared. Give not_on_event_id to leave out people already on that event; there is no filter by one past event. query matches part of the name. user_id goes to invite_guests. A new account has nobody yet, and shared_events or last_shared_event stay 0 or null when Partiful leaves them out.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 1 to 200. Default: 50. | |
| query | No | Only names containing this text. | |
| cursor | No | next_cursor from the previous call. | |
| not_on_event_id | No | Leave out people already on this event (event_id), as its Invite list does. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/open-world safety, and the description goes further by disclosing data provenance, the returned fields (shared_events, last_shared_event), the empty-new-account case, and that those fields stay 0/null when Partiful omits them. That is meaningful behavioral context beyond the structured hints, though ordering and pagination behavior are left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the purpose before constraints and edge cases; each sentence carries information (scope, filter behavior, downstream use, empty-state caveats). It is packed rather than padded, though the last sentence compresses two separate edge cases into one long clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining what each result represents and how shared_events/last_shared_event can be zero or null. Combined with annotations and a fully described 4-param schema, an agent has enough to call it correctly; only result ordering/volume expectations are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value with the negative constraint that there is no per-event filter and by pointing user_id (an output field) at invite_guests. It largely restates query/not_on_event_id semantics that the schema already carries, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific purpose statement ('People you can invite: your past guests and mutuals') and then defines the exact resource: the set Partiful shows on an event's Invite screen, past guests of your events plus mutuals, with shared-event counts. That scope is clearly distinct from list_guests or invite_guests, so an agent can distinguish it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: use not_on_event_id to exclude people already on an event, 'there is no filter by one past event' closes off a plausible-but-wrong usage, and query matches partial names. It also chains to the next step ('user_id goes to invite_guests'), which is real workflow guidance, though it never explicitly contrasts with the sibling list_guests.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_text_blastSend Text BlastADestructiveInspect
Text a message to guests by RSVP status. Partiful allows up to 10 Text Blasts per event.
Sends a Text Blast as the host's Send Text Blast does: by text and email to every guest with the chosen RSVP statuses, push for guests with the app, and shown in the event's feed unless show_on_event_page is false. Real people get it at once and it cannot be taken back. Up to 480 characters. recipients and by_status count the guests with those statuses at the moment of sending; a choice that reaches nobody is refused before you confirm. Partiful allows 10 blasts per event and refuses a blast to Invited when that group holds more than 100 guests. The answer does not say how many blasts are left. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text. | |
| event_id | Yes | event_id from list_events. | |
| statuses | Yes | Who receives it: going, maybe, cant_go, invited, waitlist, pending. | |
| show_on_event_page | No | Also show the blast in the event's activity feed. Default: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses multi-channel fan-out (text, email, push, feed), irreversibility ('cannot be taken back'), two distinct rate/cap rules, the 100-invited refusal, and the fact that the response omits remaining-blast quota. This is exactly the destructive, non-idempotent behavior an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the critical irreversibility warning comes early. The 10-blast limit is stated twice (first line and again later), which is the one clearly removable redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a destructive mutation, the description does the heavy lifting: it explains what the response reports (recipients/by_status counts) and what it omits (blasts remaining). Docking one point because the naming of response fields not present in the schema invites confusion about the call shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so message length, statuses enum, and show_on_event_page default are already documented; the description mostly restates them. It adds the useful note that counts are computed 'at the moment of sending,' but its reference to 'recipients and by_status' names fields that appear nowhere in the input schema, which can read as phantom parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Text a message to guests by RSVP status.' No sibling tool does anything comparable (invite_guests adds people, list_guests reads them), so the agent can distinguish it on purpose alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions and conditions for use: host-only, RSVP-status targeting, 10 blasts per event, refusal when Invited exceeds 100 or a chosen status reaches nobody. It doesn't explicitly route the agent to alternatives (e.g., invite_guests to add recipients, list_guests to preview counts), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventUpdate eventAInspect
Change the details or settings of an event you host.
Changes only the fields you give, as the event's Edit page and settings panel do: title, times, time zone, location, description, RSVP deadline, guest limit, Guest Approval and the Guest Questionnaire. Fields left out keep their value; a call with no field is refused. Turning Guest Approval on removes the guest limit and the waitlist, and the first guest limit turns the waitlist on. New questions replace the questionnaire for guests who RSVP from then on. Returns the event after the change, with updated listing the fields you gave. Hosts only.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Event title. | |
| end_at | No | End, ISO 8601. Optional; must be after start_at. | |
| event_id | Yes | event_id from list_events. | |
| location | No | Address, place name or link. | |
| start_at | No | Start, ISO 8601. Without an offset it is read in the event's time zone. | |
| timezone | No | IANA zone the event is shown in, e.g. America/New_York. | |
| questions | No | Guest Questionnaire, short-answer questions asked at RSVP. An empty list turns it off. | |
| max_guests | No | Guest limit; RSVPs over it go to the waitlist. null removes the limit. | |
| description | No | Event details shown on the page. | |
| rsvp_deadline | No | Last moment guests can RSVP, ISO 8601. | |
| guest_approval | No | Guests ask to join and you approve them (Guest Approval). Clears max_guests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing PATCH semantics (omitted fields keep values, empty call refused), side effects (Guest Approval clears max_guests and the waitlist; a guest limit enables the waitlist), questionnaire replacement scope, and the return value. This is the kind of cross-field behavior an agent could not infer from readOnlyHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and every subsequent sentence carries information. The middle field-list sentence is dense and runs long, which costs a point but not readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description states what is returned (the event, with updated fields) and covers side effects, refusal behavior, and authorization. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining interactions the schema does not (guest_approval clears max_guests, max_guests turns on the waitlist, questions replace the questionnaire for future RSVPs). It stops short of covering null semantics for max_guests explicitly in prose, though the schema handles that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (change details/settings) plus concrete resource (an event you host), with an explicit field inventory that separates it from create_event, cancel_event, and get_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Establishes the precondition 'event you host' and anchors partial-update behavior to the event's Edit page, making it clear this is for edits rather than creation or reads. It does not explicitly name sibling alternatives or when to prefer get_event first, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
approve_guests - First observed
cancel_event - First observed
check_in_guests - First observed
create_event - First observed
delete_event - First observed
duplicate_event - First observed
export_guest_list - First observed
get_event - First observed
invite_guests - First observed
list_events - First observed
list_guests - First observed
list_past_guests - First observed
send_text_blast - First observed
update_event
TDQS
Scored across 14 tools
Each tool targets a distinct resource+action pair, and the descriptions explicitly disambiguate the risky pairs: cancel_event vs delete_event, duplicate_event vs create_event, and list_guests vs export_guest_list vs list_past_guests. An agent can select correctly without guessing.
All 14 tools follow a strict verb_noun snake_case pattern (list_events, create_event, approve_guests, send_text_blast). No camelCase or mixed verb styles appear.
14 tools sit in the well-scoped range and each maps to a concrete host workflow (event lifecycle, guest management, invites, export, messaging). No tool looks redundant or bolted on.
Event CRUD plus cancel/duplicate and the full guest lifecycle (list, approve, check-in, invite, export, blast) are covered with no dead ends in the core flow. Minor gaps remain, such as removing/declining an individual guest or managing cohosts and the waitlist directly.
Maintenance
Related MCP Connectors
Read your events, sales, orders and attendees from your AI assistant. OAuth sign-in, read only.
Run in-person events from your AI: create events, manage tickets, attendees, broadcasts.
SocialLoop: AI-native event platform — sell tickets, manage guests, run affiliates & promo codes.
Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceLets local AI agents drive the Chrome browser a user already has open, including signed-in sessions, by listing tabs, reading page text and actionable elements, then clicking, filling, selecting, scrolling, navigating, and capturing viewport screenshots without exporting cookies. Runs as a dependency-free local stdio process over Native Messaging, with per-tab leases, automatic reconnection, and pause/write-action controls.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to drive the user's real, already-logged-in Chrome browser locally, so they can read and navigate pages, click, type, fill forms, take screenshots, and inspect cookies, tabs, console, and network traffic without headless browsers or remote-debugging ports.1 npmISC
- AlicenseNot gradedqualityAmaintenanceLets AI coding tools drive the real, already-logged-in Chrome browser over local stdio—snapshotting and reading pages, clicking, typing, managing tabs, capturing screenshots, and inspecting network, console, storage, and cookies—without opening a remote-debugging port. It installs as a Chrome extension plus native-messaging bridge, so agents work in the user's authenticated sessions while passing bot detection.1 npmISC
- AlicenseNot gradedqualityCmaintenanceLets an AI agent drive the Chrome you already have open — with your existing tabs, logins, and IP — through CDP over stdio. Exposes tools for opening background tabs, clicking, typing, running JS, taking snapshots, and issuing raw CDP commands without disrupting the visible tab.MIT