paperform-mcp
https://paperform.usefulapi.io
Registry code: 5ea70ea984ea18df
Tools for Paperform, hosted by usefulapi.io. Read-only tools never change data; ask the user before a tool that creates, changes or deletes Paperform data. Free plan: 100 tool calls per month. Run paperform_usage_status to see the calls used this month. If the user asks for something none of these tools can do, tell the user and, with their OK, run paperform_request_feature to record the request. Pro (unlimited calls, $9/month or $90/year): when the user wants more calls or reaches the limit, run paperform_upgrade; it returns a Stripe Checkout link for the user to open.…
- endpoint
- https://paperform.usefulapi.io/mcp
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is paperform-mcp live?
- Yes — it answered the hub's last check (checked 35m ago). It answered 100% of checks over the last 30 days.
- Is paperform-mcp free to use?
- No — it asks for a key or a login before it will serve.
- What tools does paperform-mcp have?
- 23 tools: paperform_get_submission, paperform_get_coupon, paperform_list_spaces, paperform_list_forms, paperform_get_form, paperform_create_coupon, paperform_list_papersign_spaces, paperform_list_form_fields, ….
- Is paperform-mcp safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 23 tools
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
paperform_get_submission auth-required never probed
Fetch one submission by id, with every answer, device info, payment charge and PDFs. Paperform: GET /submissions/{id}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "submission_id" ], "properties": { "submission_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The submission id (from paperform_list_submissions)." } } }arguments 15 linespaperform_get_coupon auth-required 35m ago
Fetch one coupon on a form by code. Paperform: GET /forms/{slug_or_id}/coupons/{code}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form", "code" ], "properties": { "code": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The coupon code, e.g. DISCOUNT1." }, "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." } } }arguments 22 linespaperform_list_spaces auth-required 35m ago
List the account's spaces (folders that group forms): id, name, dates. Needs the Business API. Paperform: GET /spaces.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "skip": { "type": "integer", "maximum": 1000000, "minimum": 0, "description": "Results to skip (offset). Pass the previous reply's next_skip." }, "sort": { "enum": [ "ASC", "DESC" ], "type": "string", "description": "Sort by created_at: DESC (default, newest first) or ASC." }, "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Results per page, 1-100 (Paperform default 20)." }, "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only spaces whose name matches this text." }, "after_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results after this id (e.g. the previous reply's last_id)." }, "before_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results before this id." }, "after_date": { "type": "string", "description": "Only results created after this ISO 8601 date-time (UTC). Ignored by Paperform when after_id is set." }, "before_date": { "type": "string", "description": "Only results created before this ISO 8601 date-time (UTC). Ignored by Paperform when before_id is set." } } }arguments 52 linespaperform_list_forms auth-required 35m ago
List the forms in the Paperform account (id, slug, custom_slug, title, url, live, tags, submission_count, space_id, dates), newest first. Search by title, or also by slug/custom_slug with search_fields. Start here to find the slug or id the other tools need. Paperform: GET /forms.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "skip": { "type": "integer", "maximum": 1000000, "minimum": 0, "description": "Results to skip (offset). Pass the previous reply's next_skip." }, "sort": { "enum": [ "ASC", "DESC" ], "type": "string", "description": "Sort by created_at: DESC (default, newest first) or ASC." }, "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Results per page, 1-100 (Paperform default 20)." }, "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Text to match (partial, case-insensitive) — the form title unless search_fields says otherwise." }, "after_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results after this id (e.g. the previous reply's last_id)." }, "before_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results before this id." }, "after_date": { "type": "string", "description": "Only results created after this ISO 8601 date-time (UTC). Ignored by Paperform when after_id is set." }, "before_date": { "type": "string", "description": "Only results created before this ISO 8601 date-time (UTC). Ignored by Paperform when before_id is set." }, "search_fields": { "type": "array", "items": { "enum": [ "title", "slug", "custom_slug" ], "type": "string" }, "maxItems": 3, "minItems": 1, "description": "Which fields `search` matches: any of title, slug, custom_slug (default title only)." } } }arguments 66 linespaperform_get_form auth-required never probed
Fetch one form by slug, custom slug or id: title, description, url, live flag, tags, submission_count, space and dates. Paperform: GET /forms/{slug_or_id}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." } } }arguments 15 linespaperform_create_coupon auth-required never probed
WRITE: create a coupon code on a form, with a fixed discountAmount or a discountPercentage (not both), an optional target (price or subscription) and expiry. Respondents can use it at checkout as soon as it is enabled. Undo: paperform_update_coupon with enabled=false. Paperform: POST /forms/{slug_or_id}/coupons.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form", "code" ], "properties": { "code": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,64}$", "description": "The new coupon code, e.g. SPRING20." }, "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "target": { "enum": [ "price", "subscription" ], "type": "string", "description": "What the discount applies to: the one-off price or a subscription." }, "enabled": { "type": "boolean", "description": "Whether respondents can use the coupon." }, "expiresAt": { "anyOf": [ { "type": "string", "description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z (sent to Paperform in UTC)." }, { "type": "null" } ], "description": "When the coupon expires (ISO 8601 with a timezone), or null for no expiry." }, "discountAmount": { "type": "number", "maximum": 1000000000, "minimum": 0, "description": "A fixed discount, in the form's currency (e.g. 10 = 10.00)." }, "discountPercentage": { "type": "number", "maximum": 100, "minimum": 0, "description": "A percentage discount, 0-100." } } }arguments 57 linespaperform_list_papersign_spaces auth-required never probed
List Papersign spaces (id, name, root_folder_id). Needs the Papersign API. Paperform: GET /papersign/spaces.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only spaces whose name matches this text." } } }arguments 12 linespaperform_list_form_fields auth-required never probed
List a form's questions (key, title, type, required, custom_key, description, options). The field keys are the keys of a submission's `data` object, so read this to interpret answers. Paperform: GET /forms/{slug_or_id}/fields.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only fields whose name matches this text." } } }arguments 21 linespaperform_list_submissions auth-required never probed
List one page of a form's completed submissions, newest first: answers (`data`, keyed by field key — see paperform_list_form_fields), device and UTM info, payment `charge`, generated PDFs and created_at. Page with skip/next_skip or after_id/last_id; filter by date. Paperform: GET /forms/{slug_or_id}/submissions.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "skip": { "type": "integer", "maximum": 1000000, "minimum": 0, "description": "Results to skip (offset). Pass the previous reply's next_skip." }, "sort": { "enum": [ "ASC", "DESC" ], "type": "string", "description": "Sort by created_at: DESC (default, newest first) or ASC." }, "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Results per page, 1-100 (Paperform default 20)." }, "after_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results after this id (e.g. the previous reply's last_id)." }, "before_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results before this id." }, "after_date": { "type": "string", "description": "Only results created after this ISO 8601 date-time (UTC). Ignored by Paperform when after_id is set." }, "before_date": { "type": "string", "description": "Only results created before this ISO 8601 date-time (UTC). Ignored by Paperform when before_id is set." } } }arguments 55 linespaperform_list_partial_submissions auth-required never probed
List one page of a form's partial submissions (someone started the form), newest first: answers so far, last_answered field, dates. Partials that were later completed stay in the list with submitted_at set; only those with submitted_at null are abandoned. Useful for drop-off analysis and follow-ups. Paperform: GET /forms/{slug_or_id}/partial-submissions.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "skip": { "type": "integer", "maximum": 1000000, "minimum": 0, "description": "Results to skip (offset). Pass the previous reply's next_skip." }, "sort": { "enum": [ "ASC", "DESC" ], "type": "string", "description": "Sort by created_at: DESC (default, newest first) or ASC." }, "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Results per page, 1-100 (Paperform default 20)." }, "after_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results after this id (e.g. the previous reply's last_id)." }, "before_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results before this id." }, "after_date": { "type": "string", "description": "Only results created after this ISO 8601 date-time (UTC). Ignored by Paperform when after_id is set." }, "before_date": { "type": "string", "description": "Only results created before this ISO 8601 date-time (UTC). Ignored by Paperform when before_id is set." } } }arguments 55 linespaperform_get_partial_submission auth-required never probed
Fetch one partial submission by id, with the answers given so far. It may have been completed since (submitted_at set); submitted_at null means abandoned. Paperform: GET /partial-submissions/{id}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "partial_submission_id" ], "properties": { "partial_submission_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The partial submission id (from paperform_list_partial_submissions)." } } }arguments 15 linespaperform_list_products auth-required never probed
List the products sold on a form (SKU, name, price, quantity in stock, sold, minimum/maximum, discountable, images). Paperform: GET /forms/{slug_or_id}/products.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only products whose name matches this text." } } }arguments 21 linespaperform_get_product auth-required never probed
Fetch one product on a form by SKU: price, quantity in stock, sold count, limits. Paperform: GET /forms/{slug_or_id}/products/{sku}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form", "sku" ], "properties": { "sku": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The product SKU (from paperform_list_products)." }, "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." } } }arguments 22 linespaperform_list_coupons auth-required never probed
List a form's coupon codes (code, enabled, target, discountAmount or discountPercentage, expiresAt). Paperform: GET /forms/{slug_or_id}/coupons.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." } } }arguments 15 linespaperform_list_webhooks auth-required never probed
List the webhooks on a form (id, target_url, triggers: submission / partial_submission, dates). Needs the Business API. Paperform: GET /forms/{slug_or_id}/webhooks.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form" ], "properties": { "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "skip": { "type": "integer", "maximum": 1000000, "minimum": 0, "description": "Results to skip (offset). Pass the previous reply's next_skip." }, "sort": { "enum": [ "ASC", "DESC" ], "type": "string", "description": "Sort by created_at: DESC (default, newest first) or ASC." }, "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Results per page, 1-100 (Paperform default 20)." }, "after_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results after this id (e.g. the previous reply's last_id)." }, "before_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results before this id." }, "after_date": { "type": "string", "description": "Only results created after this ISO 8601 date-time (UTC). Ignored by Paperform when after_id is set." }, "before_date": { "type": "string", "description": "Only results created before this ISO 8601 date-time (UTC). Ignored by Paperform when before_id is set." } } }arguments 55 linespaperform_list_space_forms auth-required never probed
List the forms in one space. Needs the Business API. Paperform: GET /spaces/{id}/forms.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "space_id" ], "properties": { "space_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The space id (from paperform_list_spaces, or a form's space_id)." } } }arguments 15 linespaperform_list_papersign_documents auth-required never probed
List Papersign e-signature documents (id, name, status, folder, space, signers, variables, source form/submission, sent/completed dates), filtered by name, status, folder, space or the Paperform submission that created them. Needs the Papersign API. Paperform: GET /papersign/documents.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "skip": { "type": "integer", "maximum": 1000000, "minimum": 0, "description": "Results to skip (offset). Pass the previous reply's next_skip." }, "sort": { "enum": [ "ASC", "DESC" ], "type": "string", "description": "Sort by created_at: DESC (default, newest first) or ASC." }, "limit": { "type": "integer", "maximum": 100, "minimum": 1, "description": "Results per page, 1-100 (Paperform default 20)." }, "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only documents whose name matches this text." }, "status": { "type": "array", "items": { "enum": [ "draft", "inProgress", "archived", "canceled", "expired", "rejected", "completed" ], "type": "string" }, "maxItems": 7, "minItems": 1, "description": "Only documents in these statuses." }, "after_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results after this id (e.g. the previous reply's last_id)." }, "space_id": { "type": "string", "pattern": "^[1-9]\\d{0,18}$", "description": "Only documents anywhere in this space (from paperform_list_papersign_spaces)." }, "before_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Cursor: only results before this id." }, "folder_id": { "type": "string", "pattern": "^[1-9]\\d{0,18}$", "description": "Only documents in this folder or its subfolders (from paperform_list_papersign_folders)." }, "after_date": { "type": "string", "description": "Only results created after this ISO 8601 date-time (UTC). Ignored by Paperform when after_id is set." }, "before_date": { "type": "string", "description": "Only results created before this ISO 8601 date-time (UTC). Ignored by Paperform when before_id is set." }, "paperform_submission_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only documents created from this Paperform submission id." } } }arguments 86 linespaperform_get_papersign_document auth-required never probed
Fetch one Papersign document by id: status, signers and their progress, variables, folder, space and dates. Needs the Papersign API. Paperform: GET /papersign/documents/{id}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "document_id" ], "properties": { "document_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The Papersign document id (from paperform_list_papersign_documents)." } } }arguments 15 linespaperform_get_signed_document_url auth-required never probed
Get a download link for a completed (fully signed) Papersign document as a PDF. A fresh link is made on each call and is valid for one week (expires_at_utc). Needs the Papersign API. Paperform: GET /papersign/documents/{id}/completed-document-url.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "document_id" ], "properties": { "document_id": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The id of a completed Papersign document." } } }arguments 15 linespaperform_list_papersign_folders auth-required never probed
List Papersign folders (id, name, parent_id, space_id), optionally inside one space or folder. Needs the Papersign API. Paperform: GET /papersign/folders.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "search": { "type": "string", "maxLength": 200, "minLength": 1, "description": "Only folders whose name matches this text." }, "space_id": { "type": "string", "pattern": "^[1-9]\\d{0,18}$", "description": "Only folders in this space." }, "folder_id": { "type": "string", "pattern": "^[1-9]\\d{0,18}$", "description": "Only folders below this folder." } } }arguments 22 linespaperform_update_coupon auth-required never probed
WRITE: change a coupon on a form — enable or disable it, change its discount (amount or percentage), target or expiry (null = never expires). Only the fields you pass are sent. Paperform: PUT /forms/{slug_or_id}/coupons/{code}.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form", "code" ], "properties": { "code": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The coupon code, e.g. DISCOUNT1." }, "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "target": { "enum": [ "price", "subscription" ], "type": "string", "description": "What the discount applies to: the one-off price or a subscription." }, "enabled": { "type": "boolean", "description": "Whether respondents can use the coupon." }, "expiresAt": { "anyOf": [ { "type": "string", "description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z (sent to Paperform in UTC)." }, { "type": "null" } ], "description": "When the coupon expires (ISO 8601 with a timezone), or null for no expiry." }, "discountAmount": { "type": "number", "maximum": 1000000000, "minimum": 0, "description": "A fixed discount, in the form's currency (e.g. 10 = 10.00)." }, "discountPercentage": { "type": "number", "maximum": 100, "minimum": 0, "description": "A percentage discount, 0-100." } } }arguments 58 linespaperform_set_product_quantity auth-required never probed
WRITE: set how many units of a form product are available (its stock quantity), e.g. after restocking. Replaces the current value; read it first with paperform_get_product. Not atomic: it overwrites rather than adjusts, so a sale between your read and this write is lost. Paperform: PUT /forms/{slug_or_id}/products/{sku}/quantity.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form", "sku", "quantity" ], "properties": { "sku": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The product SKU (from paperform_list_products)." }, "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "quantity": { "type": "integer", "maximum": 100000000, "minimum": 0, "description": "The new stock quantity (0 or more)." } } }arguments 29 linespaperform_set_product_sold auth-required never probed
WRITE: set the number of units of a form product recorded as sold (e.g. to correct it after a refund or an offline sale). Replaces the current value; read it first with paperform_get_product. Not atomic: it overwrites rather than adjusts, so a sale between your read and this write is lost. Paperform: PUT /forms/{slug_or_id}/products/{sku}/sold.
{ "type": "object", "$schema": "https://json-schema.org/draft/2020-12/schema", "required": [ "form", "sku", "sold" ], "properties": { "sku": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The product SKU (from paperform_list_products)." }, "form": { "type": "string", "maxLength": 200, "minLength": 1, "description": "The form's slug, custom slug or id (from paperform_list_forms)." }, "sold": { "type": "integer", "maximum": 100000000, "minimum": 0, "description": "The new sold count (0 or more)." } } }arguments 29 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's id5ea70ea984ea18df.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/5ea70ea984ea18df/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/5ea70ea984ea18df?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.
Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.
- rotacloud.usefulapi.io rotacloud-mcp
- breathe-hr.usefulapi.io breathe-hr-mcp
- churchsuite.usefulapi.io churchsuite-mcp
- gingr.usefulapi.io gingr-mcp
- teachworks.usefulapi.io teachworks-mcp
- talentlms.usefulapi.io talentlms-mcp
- textline.usefulapi.io textline-mcp
- checkly.usefulapi.io checkly-mcp
64 more sit on this domain. All of them.