byourside-mcp
v0.1.0
Published
MCP server giving AI agents a phone via By Your Side outbound AI calls.
Maintainers
Readme
byourside-mcp
MCP server that gives any MCP client (Claude Desktop, Cursor, etc.) a phone -- place outbound AI calls, poll for results, and list call history via the By Your Side Agent API.
Prerequisites
- Node 18 or newer
- A By Your Side agent API key (starts with
bys_ak_)
Quick start
cd mcp
npm install
BYOURSIDE_API_KEY=bys_ak_your_key_here npm startMCP client configuration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on your OS:
{
"mcpServers": {
"byourside": {
"command": "node",
"args": ["/absolute/path/to/voip-agent/mcp/src/server.js"],
"env": { "BYOURSIDE_API_KEY": "bys_ak_your_key_here" }
}
}
}Cursor
Add to .cursor/mcp.json in your project (or the global ~/.cursor/mcp.json):
{
"mcpServers": {
"byourside": {
"command": "node",
"args": ["/absolute/path/to/voip-agent/mcp/src/server.js"],
"env": { "BYOURSIDE_API_KEY": "bys_ak_your_key_here" }
}
}
}To point at a staging or self-hosted instance, add "BYOURSIDE_API_BASE": "https://staging.example.com" to the env block.
Tools
place_call
Places an outbound AI phone call toward an objective. Returns a callId immediately; the call runs asynchronously. Poll get_call with that callId until status is terminal.
Inputs:
| Field | Type | Required | Description |
|---|---|---|---|
| to | string | yes | Destination number in E.164 (e.g. +14155550123) |
| objective | string | yes | What the call should accomplish |
| context | string | no | Background context for the assistant |
| fields | array | no | Structured fields to extract (up to 20 items: { name, type?, description? }) |
| webhookUrl | string | no | HTTPS URL to receive the signed result when the call ends |
| callerId | string | no | Caller ID override; must be a number on your account |
Returns: { callId, status } where status is queued on success.
get_call
Fetches the current status and result of a call.
Inputs:
| Field | Type | Required | Description |
|---|---|---|---|
| callId | string | yes | The callId from place_call |
Returns: { id, status, summary, transcript, extracted, recordingUrl, to, objective, startedAt, endedAt, durationSec, error? }
list_calls
Lists recent calls placed by your account (most recent first).
Inputs:
| Field | Type | Required | Description |
|---|---|---|---|
| limit | number | no | Max calls to return (default 20, max 100) |
Returns: { calls: [ { id, to, objective, status, summary, createdAt, startedAt, endedAt, durationSec, error? } ] }
Call statuses
| Status | Terminal? | Meaning |
|---|---|---|
| queued | no | Call accepted, not yet dialing |
| ringing | no | Dialing the destination |
| in_progress | no | Call is live |
| completed | yes | Call finished normally |
| no_answer | yes | Destination did not pick up |
| voicemail | yes | Reached voicemail |
| declined | yes | Call was rejected |
| failed | yes | Technical failure |
Place your first call
- Configure your MCP client as above.
- Ask your assistant: "Place a call to +14155550123 with the objective: confirm the meeting time for tomorrow at 2pm."
- The assistant calls
place_calland gets back acallId. - Ask: "Check on call
<callId>-- did it complete?" - The assistant calls
get_calland returns the status, summary, and any extracted fields.
Manual end-to-end test
- Set
BYOURSIDE_API_KEYand optionallyBYOURSIDE_API_BASEin your MCP client config. - Configure the client using the JSON above.
- Ask your agent to call a number you control with a specific objective and one extraction field (e.g.
{ name: "confirmed", type: "boolean" }). - Confirm
place_callreturns acallId. - Call
get_callrepeatedly untilstatusis terminal; verifyextracted.confirmedis present. - Try a blocked destination (e.g. a premium-rate number) and confirm the mapped error message is returned.
Development
Run tests:
cd mcp && node --testCheck server parses:
node --check mcp/src/server.jsSmoke test (missing key, should exit 1):
node mcp/src/server.jsSmoke test (with dummy key, should print "ready on stdio" to stderr):
BYOURSIDE_API_KEY=bys_ak_test node mcp/src/server.js