
Developers
Work with your Agents from Claude, ChatGPT and your own code.
AgentWaves speaks the Model Context Protocol. Connect an AI app once and it can look up calls, contacts and tasks, see what your Agents are doing, and with your permission, have an Agent make a call.
Start here
Everything you need to connect
- MCP serverOne address for every MCP client, with OAuth sign-in or an API key.
- REST APIJSON endpoints for calls, contacts, tasks and Agents, with clear errors.
- OpenAPI specA machine-readable spec for code generators and API tools.
- Setup guides by appStep by step for Claude, ChatGPT, Claude Code, Cursor, VS Code and more.
- Signed webhooksCalls, tasks and orders sent to your system the moment they change.
- Agent skillTeach your AI app how to work with your Agents, safely.
MCP server
https://agentwaves.net/mcpOne URL to connect
Add it as a connector or MCP server, sign in, and choose what the app may do.
Setup guidesSetup guides
Connected in a couple of minutes
Apps that support sign-in connect with your AgentWaves account. The rest use an API key you create in AgentWaves. Either way the app works as you, within your role.
ClaudeSign in
- In Claude (web, desktop or mobile), open Settings, then Connectors, and choose Add custom connector. Team and Enterprise: an admin adds it under Organization settings, Connectors.
- Name it AgentWaves and paste the connector URL. Leave the advanced OAuth fields empty.
- Click Add, then Connect. The AgentWaves sign-in opens: pick the workspace and what Claude may do, then Allow.
- In a new chat, turn on AgentWaves in the tools menu and ask: Where am I with AgentWaves?
ChatGPTSign in
- In ChatGPT, open Settings, then Apps and Connectors, then Advanced settings, and turn on Developer mode (Plus, Pro, Business and Enterprise plans).
- Choose Create, name it AgentWaves, paste the connector URL and keep OAuth as the authentication.
- Save, then Connect: approve the AgentWaves sign-in with the workspace and access you want.
- In a chat, choose AgentWaves from the tools and ask what you need.
Claude CodeSign in
- Run this in your terminal:
- Then type /mcp in Claude Code and choose AgentWaves to sign in. To use an API key instead, add --header "Authorization: Bearer YOUR_AGENTWAVES_KEY".
claude mcp add --transport http agentwaves https://agentwaves.net/mcp
CursorAPI key
- In AgentWaves, open Developers and create an API key.
- Open Cursor Settings, then MCP, then Add new MCP server (or edit ~/.cursor/mcp.json) and add:
{
"mcpServers": {
"agentwaves": {
"url": "https://agentwaves.net/mcp",
"headers": { "Authorization": "Bearer YOUR_AGENTWAVES_KEY" }
}
}
}VS Code (Copilot)API key
- In AgentWaves, open Developers and create an API key.
- Add this to .vscode/mcp.json in your project (or your user MCP settings), then start the server from the MCP list:
{
"servers": {
"agentwaves": {
"type": "http",
"url": "https://agentwaves.net/mcp",
"headers": { "Authorization": "Bearer YOUR_AGENTWAVES_KEY" }
}
}
}WindsurfAPI key
- In AgentWaves, open Developers and create an API key.
- Edit ~/.codeium/windsurf/mcp_config.json and add:
{
"mcpServers": {
"agentwaves": {
"serverUrl": "https://agentwaves.net/mcp",
"headers": { "Authorization": "Bearer YOUR_AGENTWAVES_KEY" }
}
}
}Gemini CLIAPI key
- In AgentWaves, open Developers and create an API key.
- Edit ~/.gemini/settings.json and add:
{
"mcpServers": {
"agentwaves": {
"httpUrl": "https://agentwaves.net/mcp",
"headers": { "Authorization": "Bearer YOUR_AGENTWAVES_KEY" }
}
}
}Any MCP clientAPI key
- Transport: Streamable HTTP at the connector URL.
- Authentication: send an API key as Authorization: Bearer YOUR_AGENTWAVES_KEY, or use OAuth 2.1 sign-in (discovery at /.well-known/oauth-protected-resource, PKCE S256, dynamic client registration).
- Start with the get_started tool.
Tool reference
What an AI app can do in AgentWaves
Read tools work on every connection. Act tools need read and act access, and each one checks the person's own role. Every action is written to the audit log.
Read
Look things up. Nothing changes.
get_startedStart here. The workspace, its plan, Agents, phone numbers and the last 7 days of calls, leads and tasks, plus what the connection is allowed to do.
list_agentsEvery Agent with its state (on, off or not published), what it focuses on, language, phone numbers, WhatsApp number and call count.
list_callsRecent phone calls, newest first, with summary and outcome. Filter by Agent name, direction, a phone number (any part) and how many days back.
get_callOne call in full: details, summary, extracted details (name, email, company, follow-up) and the transcript.
find_contactsSearch contacts and leads by name, phone, company or tag (use * for the newest), with what the Agents remember about each.
get_contactOne contact: details, consent, what the Agents remember, open tasks and recent calls.
list_tasksFollow-up tasks from email, WhatsApp, calls and orders. Show open (default), done or all.
get_taskOne task with all its notes, the email it came from and its contact.
order_progressWhere a call from order_call is now: waiting for approval, scheduled, ringing, talking or ended, with the time of each step, what the Agent did during the call and, once it ends, the outcome and summary. Give the task_id (or approval_id) that order_call returned.
list_campaignsOutbound campaigns with their status, Agent and progress.
search_knowledgeSearch what an Agent knows about the business (website, documents, notes).
Act
Changes something or places a call. Your AI app should confirm with you first.
order_callHave an Agent call a number and do something (ask for a price, confirm a delivery, remind someone), now or at a time. It becomes an order and a task, and the outcome is written on the task. Calls to other people follow calling hours; the owner's own saved phone rings at any hour. Confirm the number and the brief with the user first.
add_task_noteWrite a note on a task (what happened, what is next). An open task moves to in progress.
set_task_statusMark a task open, in progress, done or dismissed.
update_contactChange a contact's name, email, company or position, or put them on or take them off the do-not-call list.
set_agent_onTurn an Agent off (it stops answering calls and messages) or back on.
REST API
The same power from your own code
Plain HTTPS and JSON, built on the same tools as the MCP server, so access rules and the audit trail are identical. Send an API key from AgentWaves as a bearer token.
- Answers arrive in a data field. Errors arrive in an error field with a code and a message, together with the usual HTTP status.
- A read key sees the read endpoints only. Act endpoints also check the person's role.
- Up to 300 requests a minute per key. Every change lands in the workspace audit log.
Example
curl "https://agentwaves.net/api/v1/calls?days=7" \
-H "Authorization: Bearer $AGENTWAVES_KEY"
curl -X POST https://agentwaves.net/api/v1/call-orders \
-H "Authorization: Bearer $AGENTWAVES_KEY" \
-H "Content-Type: application/json" \
-d '{"agent": "Layla", "phone": "+14155550123", "task": "Confirm the appointment tomorrow at 10:00"}'Workspace
- GET
/workspaceThe workspace, its plan, Agents, numbers, the last 7 days, and what this key may doRead
Agents
- GET
/agentsEvery Agent with its state, focus, language and numbersRead - PATCH
/agents/{agent}Turn an Agent off or back onAct - GET
/agents/{agent}/knowledgeSearch what an Agent knows about the businessRead
Calls
- GET
/callsRecent calls, newest first, with summary and outcomeRead - GET
/calls/{call_id}One call with summary, extracted details and transcriptRead - POST
/call-ordersHave an Agent call a number now or at a set timeAct - GET
/call-orders/statusWhere an ordered call is now, and its outcome once it endsRead
Contacts
- GET
/contactsSearch contacts by name, phone, company or tagRead - GET
/contacts/{contact_id}One contact with consent, memory, open tasks and recent callsRead - PATCH
/contacts/{contact_id}Change a contact's details or do-not-call statusAct
Tasks
- GET
/tasksFollow-up tasks from calls, WhatsApp, email and ordersRead - GET
/tasks/{task_id}One task with its notes, source and contactRead - PATCH
/tasks/{task_id}Mark a task open, in progress, done or dismissedAct - POST
/tasks/{task_id}/notesWrite a note on a taskAct
Campaigns
- GET
/campaignsOutbound campaigns with status, Agent and progressRead
Webhooks
Know the moment a call ends
AgentWaves POSTs signed JSON to your system when calls, tasks and orders change, so your CRM, sheets or back office stay in step without polling. Signatures follow the Standard Webhooks spec, so ready-made libraries verify them.
- Answer with any 2xx within 10 seconds. Anything else is retried after 1 minute, 5 minutes, 30 minutes, 2, 5, 10 and 14 hours.
- The same event can arrive twice: use webhook-id to skip repeats. Order is not guaranteed, so use the timestamp.
- Public https addresses only. An endpoint that keeps failing for three days is turned off, and you are told.
- Add an endpoint in AgentWaves under Developers, choose its events, and copy the signing secret it shows once.
Events
call.startedA call starts ringing, inbound or outbound.call.endedA call ends, with its duration and outcome.call.summarizedThe call summary and the details the Agent picked up are ready.task.createdA follow-up task is created from a call, WhatsApp, email or an order.task.updatedA task changes: status, assignee, notes or due date.order.createdSomeone orders an Agent to call or message a person.order.updatedAn order moves on: scheduled, calling, or a new note from the Agent.order.completedAn order is done or dismissed, with the Agent's last note.
What arrives
POST /your/endpoint
webhook-id: evt_3f1c0b9a7d2e4c5b6a7f8e9d
webhook-timestamp: 1792494954
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{
"id": "evt_3f1c0b9a7d2e4c5b6a7f8e9d",
"type": "call.ended",
"timestamp": "2026-10-20T09:15:54.000Z",
"workspaceId": "cmw1org00001",
"data": {
"id": "cmw1call0001",
"direction": "inbound",
"status": "completed",
"from": "+14155550123",
"to": "+14155550199",
"agent": {
"id": "cmw1agent001",
"name": "Layla"
},
"contact": {
"id": "cmw1contact1",
"name": "Daniel Reyes"
},
"campaignId": null,
"startedAt": "2026-10-20T09:14:02.000Z",
"answeredAt": "2026-10-20T09:14:03.000Z",
"endedAt": "2026-10-20T09:15:54.000Z",
"durationSeconds": 112,
"outcome": "appointment_booked",
"endReason": "caller_hung_up",
"link": "https://agentwaves.net/app/calls/cmw1call0001"
}
}Verify the signature
import crypto from "node:crypto";
// body: the raw request body, as text, before any JSON parsing.
export function verifyAgentWaves(secret, headers, body) {
const id = headers["webhook-id"];
const ts = headers["webhook-timestamp"];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const key = Buffer.from(secret.replace("whsec_", ""), "base64");
const expected = "v1," + crypto.createHmac("sha256", key).update(`${id}.${ts}.${body}`).digest("base64");
return headers["webhook-signature"].split(" ").some(
(sig) => sig.length === expected.length && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)),
);
}Agent skill
A skill that teaches your AI app the job
A short SKILL.md file your AI app loads when you ask about calls, contacts, tasks or your Agents. It knows which tool answers which question and the rules that keep customers safe.
- 01Starts every session with get_started, so it never guesses names
- 02Reads back the number, the Agent and the goal before ordering a call
- 03Never calls a contact on the do-not-call list
- 04Follows an ordered call to the end and notes what is still open
Access and safety
Your data, on your terms
OAuth 2.1 sign-in
PKCE and dynamic client registration. The person picks the workspace and the access, and can revoke it any time.
Read only, or read and act
Choose per app or per API key. Act tools stay hidden from read-only connections.
Your role still applies
An app can never do more than the person who connected it.
Every action audited
Calls ordered, tasks changed and contacts edited are logged under the person, marked as coming from an AI app.
Put your Agents inside the AI apps you already use.
Choose a plan, meet your Chief of Staff, then connect Claude or ChatGPT in a minute.
