Wufoo MCP by usefulapi
Read forms, fields, entries, reports and comments by field title, and submit entries.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"wufoo": {
"url": "https://wufoo.usefulapi.io/mcp"
}
}
}Remote endpoints
https://wufoo.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (18)
π’wufoo_list_forms(page, limit, includeTodayCount)
List the forms the API key's user can access: name, description, hash (permanent identifier), URL title, public/private, start/end dates, entry limit, created/updated timestamps. Set includeTodayCount to add EntryCountToday. Wufoo: GET /forms.json.
Input Schema
{
"type": "object",
"properties": {
"page": {
"description": "Page number (default 1).",
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"description": "Forms per page (1-1000; Wufoo default 1000).",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"includeTodayCount": {
"description": "Include EntryCountToday, the number of entries received today.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_get_form(form, includeTodayCount)
Fetch one form's settings by hash or URL title β name, description, confirmation message, notification emails, public flag, language, start/end dates, entry limit and links. Wufoo: GET /forms/{identifier}.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"includeTodayCount": {
"description": "Include EntryCountToday.",
"type": "boolean"
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_get_form_fields(form, system)
The field structure of a form: each field's Title, Type, API ID (Field###, used for filters, sorting and submissions), required flag, default value and page. Checkbox, name, address and likert fields list SubFields with their own IDs; multiple-choice, dropdown and likert fields list Choices. Admin-only fields are not returned. Wufoo: GET /forms/{identifier}/fields.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"system": {
"description": "Include system metadata (IP, LastPage, CompleteSubmission, payment Status/PurchaseTotal/Currency/TransactionId/MerchantType).",
"type": "boolean"
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_list_form_entries(form, pageStart, pageSize, sort, sortDirection, ...)
List a form's submitted entries (as in the Entry Manager), keyed by field API ID (Field105β¦) plus EntryId, DateCreated, CreatedBy, DateUpdated, UpdatedBy. Filter like the Entry Manager (Filter1=Field105 Contains foo, combined with match AND/OR), sort by any field ID, and page with pageStart/pageSize (max 100). For entries keyed by human field titles use wufoo_get_labeled_entries. Wufoo: GET /forms/{identifier}/entries.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"pageStart": {
"description": "Zero-based index of the first entry to return (default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"pageSize": {
"description": "Entries per page (1-100; Wufoo default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"sort": {
"description": "Field API ID to sort by (e.g. EntryId, DateCreated, Field105).",
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]*$"
},
"sortDirection": {
"description": "ASC (default) or DESC. Only applies together with sort.",
"type": "string",
"enum": [
"ASC",
"DESC"
]
},
"system": {
"description": "Include system metadata (IP, LastPage, CompleteSubmission, payment Status/PurchaseTotal/Currency/TransactionId/MerchantType).",
"type": "boolean"
},
"filters": {
"description": "Entry Manager-style filters (up to 10), sent as Filter1, Filter2β¦",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]*$",
"description": "Field API ID to filter on (Field105, EntryId, DateCreatedβ¦). See wufoo_get_form_fields."
},
"operator": {
"type": "string",
"enum": [
"Contains",
"Does_not_contain",
"Begins_with",
"Ends_with",
"Is_less_than",
"Is_greater_than",
"Is_on",
"Is_before",
"Is_after",
"Is_not_equal_to",
"Is_equal_to",
"Is_not_NULL"
],
"description": "Comparison operator."
},
"value": {
"description": "Value to compare with. Omit only for Is_not_NULL. Dates/times: \"YYYY-MM-DD HH:MM:SS\", read by Wufoo as US Pacific time.",
"type": [
"string",
"number"
]
}
},
"required": [
"field",
"operator"
]
}
},
"match": {
"description": "Combine filters: AND (all must match, default) or OR (any).",
"type": "string",
"enum": [
"AND",
"OR"
]
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_get_labeled_entries(form, pageStart, pageSize, sort, sortDirection, ...)
Fetch a page of a form's entries with every Field### key replaced by the field's human title β e.g. "Email", or "Title β Label" for sub-fields of checkbox, name, address and likert fields ("Name β First", "Address β City"). EntryId, DateCreated and the other default/system keys stay as they are. Empty values are dropped unless includeEmpty is set. Also returns fieldIds (title β API ID) for building filters or submissions. Takes the same paging, sorting and filter arguments as wufoo_list_form_entries. Wufoo: GET /forms/{identifier}/fields.json + /entries.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"pageStart": {
"description": "Zero-based index of the first entry to return (default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"pageSize": {
"description": "Entries per page (1-100; Wufoo default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"sort": {
"description": "Field API ID to sort by (e.g. EntryId, DateCreated, Field105).",
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]*$"
},
"sortDirection": {
"description": "ASC (default) or DESC. Only applies together with sort.",
"type": "string",
"enum": [
"ASC",
"DESC"
]
},
"system": {
"description": "Include system metadata (IP, LastPage, CompleteSubmission, payment Status/PurchaseTotal/Currency/TransactionId/MerchantType).",
"type": "boolean"
},
"filters": {
"description": "Entry Manager-style filters (up to 10), sent as Filter1, Filter2β¦",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]*$",
"description": "Field API ID to filter on (Field105, EntryId, DateCreatedβ¦). See wufoo_get_form_fields."
},
"operator": {
"type": "string",
"enum": [
"Contains",
"Does_not_contain",
"Begins_with",
"Ends_with",
"Is_less_than",
"Is_greater_than",
"Is_on",
"Is_before",
"Is_after",
"Is_not_equal_to",
"Is_equal_to",
"Is_not_NULL"
],
"description": "Comparison operator."
},
"value": {
"description": "Value to compare with. Omit only for Is_not_NULL. Dates/times: \"YYYY-MM-DD HH:MM:SS\", read by Wufoo as US Pacific time.",
"type": [
"string",
"number"
]
}
},
"required": [
"field",
"operator"
]
}
},
"match": {
"description": "Combine filters: AND (all must match, default) or OR (any).",
"type": "string",
"enum": [
"AND",
"OR"
]
},
"includeEmpty": {
"description": "Keep empty-string and null values (default false: they are omitted).",
"type": "boolean"
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_count_form_entries(form, filters, match)
Count a form's entries β all of them, or only those matching filters (same filter format as wufoo_list_form_entries). Useful to plan paging. Returns {EntryCount}. Wufoo: GET /forms/{identifier}/entries/count.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"filters": {
"description": "Entry Manager-style filters (up to 10), sent as Filter1, Filter2β¦",
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_]*$",
"description": "Field API ID to filter on (Field105, EntryId, DateCreatedβ¦). See wufoo_get_form_fields."
},
"operator": {
"type": "string",
"enum": [
"Contains",
"Does_not_contain",
"Begins_with",
"Ends_with",
"Is_less_than",
"Is_greater_than",
"Is_on",
"Is_before",
"Is_after",
"Is_not_equal_to",
"Is_equal_to",
"Is_not_NULL"
],
"description": "Comparison operator."
},
"value": {
"description": "Value to compare with. Omit only for Is_not_NULL. Dates/times: \"YYYY-MM-DD HH:MM:SS\", read by Wufoo as US Pacific time.",
"type": [
"string",
"number"
]
}
},
"required": [
"field",
"operator"
]
}
},
"match": {
"description": "Combine filters: AND (all must match, default) or OR (any).",
"type": "string",
"enum": [
"AND",
"OR"
]
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_list_form_comments(form, entryId, pageStart, pageSize)
List the comments team members left on a form's entries in the Entry Manager: CommentId, EntryId, Text, CommentedBy, DateCreated. Optionally only for one entry. Page with pageStart/pageSize (max 100). Wufoo: GET /forms/{identifier}/comments.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"entryId": {
"description": "Only comments on this EntryId.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"pageStart": {
"description": "Zero-based index of the first comment (default 0).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"pageSize": {
"description": "Comments per page (1-100; Wufoo default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_count_form_comments(form)
Count all comments on a form's entries. Returns {Count}. Wufoo: GET /forms/{identifier}/comments/count.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
}
},
"required": [
"form"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_list_reports
List the reports the API key's user can access: name, description, hash, URL title, public flag and created/updated timestamps. Wufoo: GET /reports.json.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_get_report(report)
Fetch one report by hash or URL title. Wufoo: GET /reports/{identifier}.json.
Input Schema
{
"type": "object",
"properties": {
"report": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Report identifier: its permanent hash (e.g. qa4d98l1ib9or7) or its URL title. See wufoo_list_reports."
}
},
"required": [
"report"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_get_report_fields(report, system)
The field structure of the form a report is built on (same shape as wufoo_get_form_fields). Wufoo: GET /reports/{identifier}/fields.json.
Input Schema
{
"type": "object",
"properties": {
"report": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Report identifier: its permanent hash (e.g. qa4d98l1ib9or7) or its URL title. See wufoo_list_reports."
},
"system": {
"description": "Include system metadata (IP, LastPage, CompleteSubmission, payment Status/PurchaseTotal/Currency/TransactionId/MerchantType).",
"type": "boolean"
}
},
"required": [
"report"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_list_report_entries(report, system)
The entries that make up a report β what its datagrid widget or an export would show, keyed by field API ID. Wufoo documents no paging or filter parameters for this endpoint. Wufoo: GET /reports/{identifier}/entries.json.
Input Schema
{
"type": "object",
"properties": {
"report": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Report identifier: its permanent hash (e.g. qa4d98l1ib9or7) or its URL title. See wufoo_list_reports."
},
"system": {
"description": "Include system metadata (IP, LastPage, CompleteSubmission, payment Status/PurchaseTotal/Currency/TransactionId/MerchantType).",
"type": "boolean"
}
},
"required": [
"report"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_count_report_entries(report)
Count the entries in a report. Returns {EntryCount}. Wufoo: GET /reports/{identifier}/entries/count.json.
Input Schema
{
"type": "object",
"properties": {
"report": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Report identifier: its permanent hash (e.g. qa4d98l1ib9or7) or its URL title. See wufoo_list_reports."
}
},
"required": [
"report"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_list_report_widgets(report)
The chart, graph (pie/bar/line) and big-number widgets on a report: Name, Type, TypeDesc, Size and Hash (the hash embeds the widget). Text and datagrid widgets are not returned. Wufoo: GET /reports/{identifier}/widgets.json.
Input Schema
{
"type": "object",
"properties": {
"report": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Report identifier: its permanent hash (e.g. qa4d98l1ib9or7) or its URL title. See wufoo_list_reports."
}
},
"required": [
"report"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π’wufoo_list_users
List the account's users: name, email, timezone, company, owner/admin flags and create-forms/reports/themes permissions. Each user's API key is redacted from the result. Wufoo: GET /users.json.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄wufoo_submit_entry(form, fields)
WRITE: submits a new entry to a form, exactly as if someone filled it in β it is stored and triggers the form's notifications, webhooks and integrations. Keys are field API IDs from wufoo_get_form_fields (Field1, Field105β¦); fields with sub-fields (name, address, checkbox) take one key per sub-field ID. Dates must be YYYYMMDD. Field validation and form limits still apply: a rejected submission returns each field error. Limited by Wufoo to 50 submissions per user per 5 minutes. Wufoo: POST /forms/{identifier}/entries.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"fields": {
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^Field\\d+$"
},
"additionalProperties": {
"type": "string"
},
"description": "Values keyed by field API ID, e.g. {\"Field1\": \"Ada\", \"Field2\": \"Lovelace\", \"Field217\": \"20260315\"}."
}
},
"required": [
"form",
"fields"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄wufoo_add_webhook(form, url, handshakeKey, metadata)
WRITE: adds a webhook to a form, so Wufoo POSTs every new entry to the given URL. Idempotent per URL: calling again with the same URL updates its handshake key / metadata setting instead of adding a duplicate. Forms allow at most 10 integrations. Returns WebHookPutResult.Hash β keep it, it is needed to delete the webhook. Wufoo: PUT /forms/{identifier}/webhooks.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^https?:\\/\\/\\S+$",
"description": "The URL Wufoo will POST each new entry to."
},
"handshakeKey": {
"description": "Shared secret Wufoo includes in each POST so the receiver can reject unwanted requests.",
"type": "string",
"maxLength": 255
},
"metadata": {
"description": "Include form/field structure in each POST (Wufoo default false).",
"type": "boolean"
}
},
"required": [
"form",
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}π΄wufoo_delete_webhook(form, hash)
WRITE: removes a webhook from a form; the receiving URL stops getting new entries immediately. Needs the webhook hash returned by wufoo_add_webhook (Wufoo has no endpoint to list webhooks). Wufoo: DELETE /forms/{identifier}/webhooks/{webhookHash}.json.
Input Schema
{
"type": "object",
"properties": {
"form": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "Form identifier: its permanent hash (e.g. s1afea8b1vk0jf7) or its URL title (e.g. wufoo-api-example). See wufoo_list_forms."
},
"hash": {
"type": "string",
"pattern": "^[A-Za-z0-9]+$",
"description": "Webhook hash (WebHookPutResult.Hash from wufoo_add_webhook)."
}
},
"required": [
"form",
"hash"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence