{
  "id": "07-usefulapi-io",
  "slug": "usefulapi-io",
  "normalized_name": "usefulapi io",
  "name": "usefulapi.io",
  "vendor_url": "usefulapi.io",
  "category": "mcp-infrastructure",
  "what_it_does": "A hosted catalogue of 146 single-application MCP servers, one per SaaS product, each on its own subdomain, wrapping that product's public REST API as a named tool list with per-tool read and write labels and the underlying REST call documented against each tool.",
  "ai_features": "None. It is a wrapper host, and unusually transparent about it: each tool's description names the exact upstream REST endpoint it calls, so the mapping between an MCP tool and a vendor API route is legible before connecting.",
  "mcp_status": "official (usefulapi's own servers; not endorsed by the wrapped vendors)",
  "mcp_url": "https://pipedrive.usefulapi.io/mcp ; https://<app>.usefulapi.io/mcp, one subdomain per application, listed at https://usefulapi.io/ with a page per server such as https://usefulapi.io/aircall ; repo https://github.com/m190/usefulapi-mcp",
  "mcp_auth": "per-application OAuth. The setup instructions add the subdomain as a custom connector and the user then authenticates with the wrapped vendor when prompted, so usefulapi brokers the connection rather than taking an API key up front.",
  "api_gate": "free - every server page publishes the same two tiers, \"Free 100 tool calls / month\" and \"Pro $9/mo\" or \"$90/yr\", which is the cheapest paid tier of any gateway in this file.",
  "revops_role": "A stopgap for the long tail: it puts an agent in front of a GTM tool that has shipped no MCP server of its own, at a price where trying it costs nothing, and its per-tool REST mapping makes it a useful reference even for someone who never connects it.",
  "tier": "RESEARCHED",
  "last_checked": "2026-09-07",
  "sources": "https://usefulapi.io/, https://usefulapi.io/aircall, https://pipedrive.usefulapi.io/mcp, https://github.com/m190/usefulapi-mcp",
  "notes": "Verified 2026-09-07: POST of an MCP initialize to https://pipedrive.usefulapi.io/mcp returned HTTP 200 with a full initialize result, serverInfo name \"pipedrive-mcp\" version 1.0.0, protocol 2025-06-18, so the servers are live and the initialize handshake is open even though tool calls require the user's own vendor authorisation. RECLASSIFIED FROM THE CANDIDATE ROW for the same reason as Pipeworx: the research filed it \"third-party wrapper (community)\", which describes its relationship to the wrapped vendors correctly, but the servers are usefulapi's own first-party product, so mcp_status is official with the qualifier carried in the value itself. THE CAVEAT IS THE ENTRY: none of the wrapped vendors endorses these servers, the wrapped vendor's own terms of service still govern the API calls underneath, and connecting one means a third party sits in the OAuth path to a system of record. GTM-relevant servers seen in the catalogue include Aircall (27 tools), Pipedrive, Mixpanel, Chargebee, Zendesk and Groove HQ. The Aircall server page is a good worked example of the transparency: every tool names its upstream call, for instance aircall_search_calls documented as \"Aircall REST: GET /calls/search\". Compare against 02-engagement-outbound.md's Aircall entry, where the only servers found were community ones, and note that this host is one of them. 2026-09-07: The repo is the usefulapi portal and server catalogue: README \"usefulapi - Hosted MCP servers for the tools you already use ... Portal: https://usefulapi.io\", with servers/<app>/server.json for each hosted server (https://github.com/m190/usefulapi-mcp).",
  "mcp_status_bucket": "official",
  "api_gate_bucket": "free",
  "mcp_urls": [
    "https://pipedrive.usefulapi.io/mcp",
    "https://usefulapi.io/",
    "https://usefulapi.io/aircall",
    "https://github.com/m190/usefulapi-mcp"
  ],
  "source_urls": [
    "https://usefulapi.io/",
    "https://usefulapi.io/aircall",
    "https://pipedrive.usefulapi.io/mcp",
    "https://github.com/m190/usefulapi-mcp"
  ],
  "source_annotations": [],
  "vendor_domain": "usefulapi.io",
  "display_name": "usefulapi.io",
  "docs_url": null,
  "jobs": [],
  "jobs_tagged_by": null,
  "jobs_tagged_on": null,
  "github_url": null,
  "github_stars": null,
  "github_last_commit": null,
  "github_archived": null,
  "github_fetched_on": null,
  "github_candidates": [
    "https://github.com/m190/usefulapi-mcp",
    "https://github.com/m190/usefulapi-mcp"
  ],
  "docs_digest": null,
  "docs_last_crawled": null,
  "submission": null,
  "mcp_tools": [
    {
      "name": "Server",
      "description": "Category",
      "required_params": [],
      "evidence": "readme",
      "repo_party": "third-party",
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_add_note",
      "description": "Add a note, linked to at least one of a deal/person/organization/lead. `content` is required (HTML or plain text). Uses v1 (v2 has no notes endpoint). Pipedrive REST: POST /api/v1/notes.",
      "required_params": [
        "content"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "write"
    },
    {
      "name": "pipedrive_create_activity",
      "description": "Create a new activity (task/event). `subject` is required; link it to a deal/person/org and set type/date/time as needed. Pipedrive REST: POST /api/v2/activities.",
      "required_params": [
        "subject"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "write"
    },
    {
      "name": "pipedrive_create_deal",
      "description": "Create a new deal. `title` is required; link it to a person/org/pipeline/stage/owner as needed. Pipedrive REST: POST /api/v2/deals.",
      "required_params": [
        "title"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "write"
    },
    {
      "name": "pipedrive_create_person",
      "description": "Create a new person (contact). `name` is required; `email`/`phone` are convenience strings mapped to Pipedrive's structured emails/phones arrays. Pipedrive REST: POST /api/v2/persons.",
      "required_params": [
        "name"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "write"
    },
    {
      "name": "pipedrive_get_current_user",
      "description": "Get the authenticated user's profile (name, email, company, locale, timezone). Pipedrive REST: GET /api/v1/users/me.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_get_deal",
      "description": "Get a single deal by its id. Pipedrive REST: GET /api/v2/deals/{id}.",
      "required_params": [
        "id"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_get_organization",
      "description": "Get a single organization by its id. Pipedrive REST: GET /api/v2/organizations/{id}.",
      "required_params": [
        "id"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_get_person",
      "description": "Get a single person (contact) by its id. Pipedrive REST: GET /api/v2/persons/{id}.",
      "required_params": [
        "id"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_activities",
      "description": "List activities (tasks/events), optionally filtered by filter/owner/deal/person/org/done/updated_since. Pipedrive REST: GET /api/v2/activities.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_deals",
      "description": "List deals, optionally filtered by filter/owner/person/org/pipeline/stage/status and sorted. Pipedrive REST: GET /api/v2/deals.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_notes",
      "description": "List notes, optionally filtered by user/deal/person/org/lead. Uses v1 (v2 has no notes endpoint) with start+limit pagination. Pipedrive REST: GET /api/v1/notes.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_organizations",
      "description": "List organizations, optionally filtered by filter/owner and sorted. Pipedrive REST: GET /api/v2/organizations.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_persons",
      "description": "List persons (contacts), optionally filtered by filter/owner/org and sorted. Pipedrive REST: GET /api/v2/persons.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_pipelines",
      "description": "List all pipelines. Pipedrive REST: GET /api/v2/pipelines.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_list_stages",
      "description": "List stages, optionally restricted to a single pipeline. Pipedrive REST: GET /api/v2/stages.",
      "required_params": [],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_search_deals",
      "description": "Search deals by term across selected fields. Pipedrive REST: GET /api/v2/deals/search.",
      "required_params": [
        "term"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_search_items",
      "description": "Global search across multiple item types (deals, persons, organizations, products, leads, files, etc.). Pipedrive REST: GET /api/v2/itemSearch.",
      "required_params": [
        "term"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_search_organizations",
      "description": "Search organizations by term across selected fields. Pipedrive REST: GET /api/v2/organizations/search.",
      "required_params": [
        "term"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    },
    {
      "name": "pipedrive_search_persons",
      "description": "Search persons (contacts) by term across selected fields. Pipedrive REST: GET /api/v2/persons/search.",
      "required_params": [
        "term"
      ],
      "evidence": "live-list",
      "repo_party": null,
      "source_party": null,
      "risk": "read"
    }
  ],
  "mcp_tool_count": 20,
  "mcp_tools_evidence": "live-list",
  "mcp_tools_repo": "m190/usefulapi-mcp",
  "mcp_tools_repo_party": "third-party",
  "mcp_catalog_shape": "dynamic",
  "mcp_catalog_note": "a gateway that generates an MCP server per wrapped vendor API",
  "mcp_tools_fetched_on": "2026-09-27",
  "cli_status": "none-found",
  "cli_party": null,
  "cli_binary": null,
  "cli_install": [],
  "cli_login": null,
  "cli_commands_seen": [],
  "cli_docs_url": null,
  "cli_repo": null,
  "cli_packages": [],
  "cli_evidence": null,
  "cli_checked_on": "2026-09-27",
  "github_org": null,
  "github_org_status": "unresolved",
  "github_org_url": null,
  "github_org_evidence": {
    "rule": null,
    "reason": "github candidates were seen but none passed the evidence rules",
    "candidates_rejected": [
      {
        "login": "m190",
        "from": "rule 2",
        "type": "User",
        "website": null,
        "rejected": "website (none) does not match usefulapi.io"
      }
    ]
  },
  "github_org_repos": 0,
  "github_org_repos_mcp": 0,
  "github_org_repos_cli": 0,
  "github_org_latest_activity": null,
  "github_org_recent_repos": [],
  "github_org_checked_on": "2026-09-08",
  "mcp_endpoint": null,
  "mcp_docs_url": null,
  "endpoint_status": "not-probed",
  "endpoint_http_status": null,
  "endpoint_last_probed": null,
  "endpoint_wall_note": null,
  "canonical": true,
  "canonical_id": "07-usefulapi-io",
  "also_listed_in": [],
  "source_file": "07-mcp-infrastructure.md",
  "source_line": 409,
  "file_index": 18,
  "category_num": "07",
  "category_slug": "mcp-infrastructure",
  "category_label": "MCP Layer",
  "heading": "usefulapi.io",
  "missing_schema_fields": [],
  "extra_fields": {},
  "display_rank": 56
}
