Helpy developer guide

Connect Claude, ChatGPT, Cursor and Hermes to Helpy over MCP, and your systems through the REST API and webhooks — always with each user's exact permissions.

Overview

There are three ways to connect anything to Helpy. All of them run with exactly the permissions and data scope of the user who connected, and follow any change immediately:

MethodForAddress
MCP serverAI apps: Claude, ChatGPT, Cursor, Hermes, Claude Code, VS Codehttps://helpy.ai/api/mcp
REST API v1Your systems, scripts, n8n, Make and appshttps://helpy.ai/api/v1
WebhooksReal-time events (customer created or updated)Helpy → Apps → Zapier/Webhooks

The full OpenAPI 3.1 description of the REST API (for Postman, Swagger and SDK generators):

https://helpy.ai/api/v1/openapi.json

Connect an AI app in two minutes

One link for every app. The app discovers sign-in by itself (OAuth): you sign in to Helpy once and approve — no key to copy. Step-by-step setup is inside Helpy under Settings → AI connections.

Server link

https://helpy.ai/api/mcp
AppSetup
ClaudeSettings → Connectors → Add custom connector → paste the link → Connect and approve. On Team/Enterprise the owner adds it once for the organization.
ChatGPTSettings → Apps & Connectors → Advanced → turn on Developer mode → Create: the link with OAuth → approve.
CursorThe “Add to Cursor” button in Helpy, or ~/.cursor/mcp.json then Login in MCP settings.
Hermes~/.hermes/config.yaml then hermes mcp login helpy — or an API key for unattended runs.
Claude CodeThe command below, then /mcp → helpy → Authenticate.
VS Code.vscode/mcp.json then Agent mode in Copilot Chat.

Cursor — ~/.cursor/mcp.json

{
  "mcpServers": {
    "helpy": {
      "url": "https://helpy.ai/api/mcp"
    }
  }
}

Hermes — ~/.hermes/config.yaml

mcp_servers:
  helpy:
    url: "https://helpy.ai/api/mcp"
    auth: oauth

# then run: hermes mcp login helpy

Claude Code

claude mcp add --transport http helpy https://helpy.ai/api/mcp

VS Code — .vscode/mcp.json

{
  "servers": {
    "helpy": {
      "type": "http",
      "url": "https://helpy.ai/api/mcp"
    }
  }
}

With an API key instead of sign-in (Hermes on a server, n8n, any MCP client without OAuth): send the header Authorization: Bearer <key>.

Hermes with an API key (HELPY_API_KEY environment variable)

mcp_servers:
  helpy:
    url: "https://helpy.ai/api/mcp"
    headers:
      Authorization: "Bearer ${HELPY_API_KEY}"

How the MCP server works

  • Transport: stateless Streamable HTTP (JSON-RPC over POST) — protocol versions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05.
  • Tools: the same tools as the Helpy assistant (about 90) — the app only sees what the user is allowed to do in their company, plan and installed apps.
  • Reads run immediately. Any change returns a preview with an action_id and does nothing; after the user agrees in the chat the app calls helpy_confirm_action. There are also helpy_cancel_action and helpy_undo_action (for reversible changes, within minutes).
  • Changes that affect many customers need acknowledge_bulk=true after the user confirms the count.
  • search and fetch: unified search over customers, conversations and the help center (compatible with ChatGPT Deep Research).
  • Ready-made prompts appear as shortcuts in Claude and Cursor:
PromptWhat it does
daily_briefingToday's numbers, waiting conversations, tasks and bookings — with a prioritized plan.
inbox_triageConversations waiting for a reply: a summary of each and a suggested reply.
follow_up_leadsNew or untouched customers — who to follow up with and how.
customer_360Everything about one customer: details, conversations, tasks and bookings, and the next best step.
weekly_reportLast 7 days vs. the week before, with recommendations.
launch_campaignA full campaign plan (page, messages, follow-up) carried out step by step with your approval.

Limit tools to groups: append group names to the link, comma-separated, e.g. /api/mcp/crm,inbox,tasks. Account, help and approval tools are always included.

GroupContains
crmCustomers, stages, notes and audiences
inboxSearch, read, reply to and update conversations
tasksTasks and teammates
bookingsBookings and availability
pagesLanding pages, QR codes, catalogs and brand
outreachSequences, WhatsApp templates and broadcasts
automationsAutomations and recipes
agentsAI agents and their campaigns
callsCalls, callbacks and call flows
prospectsProspect search and company research
workspaceReports, app diagnosis, team and settings

Authentication

OAuth 2.1 (for apps a user connects themselves):

ItemValue
Resource metadata (RFC 9728)https://helpy.ai/.well-known/oauth-protected-resource/api/mcp
Authorization server (RFC 8414)https://helpy.ai/.well-known/oauth-authorization-server
Authorization endpointhttps://helpy.ai/oauth/authorize
Token endpointhttps://helpy.ai/api/oauth/token
Dynamic client registration (RFC 7591)https://helpy.ai/api/oauth/register
Revocation (RFC 7009)https://helpy.ai/api/oauth/revoke
Scopeshelpy:read to read, helpy:write to make changes — the user can untick changes on the consent screen
SecurityPKCE (S256) required, 1-hour access tokens, 90-day rotating refresh tokens (reuse of a stolen one closes the connection), CIMD supported

API keys (for systems and automation): Helpy → Settings → AI connections → API keys. The key is shown once and works with both the MCP server and the REST API. “Allow changes” grants helpy:write.

Authorization: Bearer hlp_sk_YOUR_KEY

REST API v1

  • Base URL: https://helpy.ai/api/v1
  • Responses are always { "data": ..., "meta"?: ... } and errors { "error": { "code", "message" } }.
  • Cursor pagination: send meta.nextCursor as ?cursor= on the next request.
  • Translated labels (stage and service names) default to Arabic — use ?locale=en or Accept-Language: en for English.
  • Anything outside the user's data scope returns 404 as if it didn't exist.
RequestPermissionDescription
GET /me—User, company, effective permissions and connection
GET /leadsleads.viewCustomers: ?search= ?status= ?cursor=
POST /leadsleads.createCreate a customer (phone or email) with the app's validation and duplicate check
GET /leads/{id}leads.viewFull customer profile
PATCH /leads/{id}leads.status / pipeline.move / leads.assignStatus, stage, deal value or owner
GET|POST /leads/{id}/notesleads.view / leads.notesNotes
GET /leads/{id}/timelineleads.viewFull activity timeline
GET /pipeline/stagespipeline.viewPipeline stages
GET|POST /taskstasks.view / tasks.createTasks: ?status=open|done ?scope=mine|all
GET|PATCH|DELETE /tasks/{id}tasks.view / tasks.edit / tasks.deleteA task — done:true completes it
GET /conversationsinbox.viewConversations: ?scope= ?state= ?channel= ?q=
GET /conversations/{id}inbox.viewA conversation with its messages
POST /conversations/{id}/messagesinbox.reply + the channel permissionSend a text reply (WhatsApp within the 24-hour window)
POST /conversations/{id}/stateinbox.stateOpen, snooze or close
GET|POST /bookingsbookings.view / bookings.createA day's bookings ?date= or a new booking
GET /bookings/options · /bookings/slotsbookings.viewResources, services and free times
POST /bookings/{id}/statusbookings.editconfirm, complete or no_show
GET /teamteam.viewTeammates and departments

Create a customer

curl -X POST https://helpy.ai/api/v1/leads \
  -H "Authorization: Bearer hlp_sk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Sara Ahmed","phone":"+966501112233","email":"sara@example.com","tags":["expo"]}'

A follow-up task on the customer

curl -X POST https://helpy.ai/api/v1/tasks \
  -H "Authorization: Bearer hlp_sk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Call Sara","leadId":"LEAD_ID","dueAt":"2026-11-01T09:00:00Z","priority":"HIGH"}'

Reply to a conversation

curl -X POST https://helpy.ai/api/v1/conversations/CONVERSATION_ID/messages \
  -H "Authorization: Bearer hlp_sk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"أهلاً سارة، عرض السعر في الطريق 👋"}'

JavaScript

const res = await fetch("https://helpy.ai/api/v1/leads?search=Sara", {
  headers: { Authorization: `Bearer ${process.env.HELPY_API_KEY}` },
});
const { data, error } = await res.json();

Python

import os, requests

res = requests.get(
    "https://helpy.ai/api/v1/tasks",
    headers={"Authorization": f"Bearer {os.environ['HELPY_API_KEY']}"},
)
tasks = res.json()["data"]

Errors and limits

StatusCodeMeaning
400invalid_body · invalid_* · nothing_to_updateMissing or invalid input
401unauthorizedMissing, invalid, revoked or expired token
403forbidden · insufficient_scope · api_disabledMissing permission, read-only key, or connections turned off for the company
404not_foundNot found or outside the user's data scope
409duplicate · whatsapp_window_closed · email_not_supportedConflicts with the current state
422validation_failedInvalid data (phone or email)
429rate_limitedToo many requests — wait for Retry-After
  • REST: 240 reads and 60 writes per minute per connection.
  • MCP: 120 requests per minute per connection.
  • Every response carries Helpy-Api-Version and X-RateLimit-Limit.

Webhooks

In Helpy → Apps → Zapier/Webhooks add your URL and pick events: lead.created and lead.updated. Each delivery is a JSON POST, retried up to 6 times until your URL answers 2xx.

Body

{
  "event": "lead.created",
  "data": { "id": "…", "name": "Sara Ahmed", "phone": "+9665…", "status": "NEW", "createdAt": "…" },
  "firedAt": "2026-10-28T12:00:00.000Z"
}

Verify the request comes from Helpy: the X-Webhook-Signature header is sha256=HMAC-SHA256(raw body, webhook secret).

Node.js

import { createHmac, timingSafeEqual } from "node:crypto";

function fromHelpy(rawBody, header, secret) {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  return header?.length === expected.length && timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}

Security and privacy

  • Every request re-checks the user, permissions and data scope from the database — nothing is cached in the token.
  • Tokens and keys are stored as SHA-256 hashes only, and no secret is ever logged.
  • Users disconnect any app or key instantly, and owners can disconnect their team's. “Sign out everywhere” and password changes disconnect everything.
  • Connecting, disconnecting, key creation and every change are written to the audit log.
  • In MCP: customer messages and notes are treated as data, not instructions, and changes need explicit approval.
  • The Helpy team can turn connections off for the whole platform or a single company at once.