209 lines
5.1 KiB
Markdown
209 lines
5.1 KiB
Markdown
# Handoff Notes
|
|
|
|
Last updated: 2026-04-21
|
|
|
|
## Current State
|
|
|
|
This repo now contains three related pieces:
|
|
|
|
- A standalone PHP VoIP.ms library under `src/`.
|
|
- A CLI tool at `voipms-cli.php`.
|
|
- A test HTTP MCP server under `mcp/`, launched with `bin/serve-mcp.sh`.
|
|
|
|
The original `phonebook.php` file is intentionally unchanged as a simple cURL
|
|
reference example.
|
|
|
|
## Library
|
|
|
|
Main files:
|
|
|
|
- `src/VoipMsClient.php`
|
|
- `src/VoipMsResponse.php`
|
|
- `src/PhonebookGroupEnsureResult.php`
|
|
- `src/PhonebookGroupUpdateResult.php`
|
|
- `src/PhonebookNumberGroupResult.php`
|
|
|
|
The client supports generic raw API access:
|
|
|
|
```php
|
|
$client->request('getDIDsInfo', ['did' => '5551234567']);
|
|
$client->call('getBalance');
|
|
```
|
|
|
|
It also has convenience helpers for:
|
|
|
|
- Balance lookup.
|
|
- DID lookup.
|
|
- CDR lookup with default call-status flags.
|
|
- Account filter lookup through `getAccounts()` / `getCallAccounts()`.
|
|
- Call recording listing, retrieval, and email delivery.
|
|
- Phonebook entries and groups.
|
|
- Idempotently adding a number to a phonebook group.
|
|
- Removing matching numbers from a phonebook group.
|
|
- CallerID Filtering.
|
|
- Call account filters.
|
|
- SMS sending.
|
|
|
|
Important phonebook behavior:
|
|
|
|
- VoIP.ms phonebook groups store `members` as semicolon-separated phonebook
|
|
entry IDs.
|
|
- A group can exist with no entries.
|
|
- VoIP.ms may allow duplicate phonebook entries for the same number.
|
|
- Library helpers try to avoid creating duplicates and avoid duplicate group
|
|
membership.
|
|
|
|
## CLI
|
|
|
|
The CLI can call raw VoIP.ms API methods:
|
|
|
|
```bash
|
|
./voipms-cli.php getBalance
|
|
./voipms-cli.php getPhonebookGroups
|
|
./voipms-cli.php getPhonebook Spam
|
|
```
|
|
|
|
Useful CLI features:
|
|
|
|
- `--dry-run`
|
|
- `--format pretty|json|raw`
|
|
- `help <command>` and `<command> help`
|
|
- `list`
|
|
- `completion bash`
|
|
|
|
Friendlier behavior currently implemented:
|
|
|
|
- `cdr` alias maps normal options to `getCDR` parameters.
|
|
- `cdr` defaults to all call statuses to avoid VoIP.ms `no_callstatus`.
|
|
- `getPhonebook 16389` maps to `group=16389`.
|
|
- `getPhonebook Spam` maps to `group_name=Spam`.
|
|
- `getPhonebookGroups Spam` maps to `name=Spam`.
|
|
|
|
## Test MCP Server
|
|
|
|
Files:
|
|
|
|
- `mcp/http-server.php`
|
|
- `bin/serve-mcp.sh`
|
|
- `docs/mcp.md`
|
|
|
|
Start it:
|
|
|
|
```bash
|
|
export VOIPMS_API_USERNAME='you@example.com'
|
|
export VOIPMS_API_PASSWORD='your-api-password'
|
|
export MCP_AUTH_TOKEN='choose-a-long-random-token'
|
|
|
|
./bin/serve-mcp.sh
|
|
```
|
|
|
|
Defaults:
|
|
|
|
```text
|
|
MCP_HOST=0.0.0.0
|
|
MCP_PORT=8787
|
|
MCP endpoint: http://0.0.0.0:8787/mcp
|
|
Health endpoint: http://0.0.0.0:8787/health
|
|
```
|
|
|
|
For Grok or hosted clients that cannot send custom headers, query-token auth is
|
|
available for testing:
|
|
|
|
```text
|
|
http://YOUR_HOST:8787/mcp?token=YOUR_TOKEN
|
|
http://YOUR_HOST:8787/sse?token=YOUR_TOKEN
|
|
```
|
|
|
|
Prefer `Authorization: Bearer <token>` when the client supports it.
|
|
|
|
## MCP Compatibility Work
|
|
|
|
The first MCP server only handled POST JSON-RPC. It was updated after Grok
|
|
could connect over HTTP but reported the server did not work.
|
|
|
|
Current compatibility support:
|
|
|
|
- `POST /mcp` JSON-RPC.
|
|
- `GET /mcp` Streamable HTTP-style SSE probe.
|
|
- `GET /sse` legacy SSE probe with an `endpoint` event pointing to `/mcp`.
|
|
- `DELETE /mcp`.
|
|
- `OPTIONS` CORS preflight.
|
|
- `Mcp-Session-Id` response header.
|
|
- Protocol negotiation for `2024-11-05`, `2025-03-26`, and `2025-06-18`.
|
|
- JSON-RPC notifications return `202 Accepted`.
|
|
- Query-token auth fallback.
|
|
|
|
Current MCP tools:
|
|
|
|
- `voipms_get_balance`
|
|
- `voipms_get_phonebook_groups`
|
|
- `voipms_get_phonebook_entries`
|
|
- `voipms_get_callerid_filters`
|
|
- `voipms_get_accounts`
|
|
- `voipms_get_call_accounts`
|
|
- `voipms_get_call_recordings`
|
|
- `voipms_get_call_recording`
|
|
- `voipms_send_call_recording_email`
|
|
- `voipms_get_call_transcript`
|
|
- `voipms_get_recent_cdr`
|
|
- `voipms_add_number_to_phonebook_group`
|
|
- `voipms_remove_number_from_phonebook_group`
|
|
|
|
Mutation tools default to `dry_run=true`.
|
|
|
|
`voipms_get_call_transcript` is a placeholder until transcript storage and a
|
|
transcription provider are added.
|
|
|
|
## Last Verification Done
|
|
|
|
No live VoIP.ms API calls were made during MCP compatibility testing.
|
|
|
|
Verified locally:
|
|
|
|
- `php -l mcp/http-server.php`
|
|
- `bash -n bin/serve-mcp.sh`
|
|
- `POST /mcp initialize`
|
|
- `POST /mcp tools/list`
|
|
- `POST /mcp notifications/initialized`
|
|
- `GET /mcp`
|
|
- `GET /sse`
|
|
- Query-token auth
|
|
- Unauthorized request returns `401`
|
|
|
|
Temporary local test server was stopped afterward.
|
|
|
|
## Likely Next Steps
|
|
|
|
1. Try Grok again with:
|
|
|
|
```text
|
|
http://YOUR_HOST:8787/mcp?token=YOUR_TOKEN
|
|
```
|
|
|
|
If Grok has a separate SSE mode, try:
|
|
|
|
```text
|
|
http://YOUR_HOST:8787/sse?token=YOUR_TOKEN
|
|
```
|
|
|
|
2. If Grok still fails, capture server log lines showing:
|
|
|
|
- HTTP method
|
|
- path
|
|
- status code
|
|
- whether it hit `/mcp`, `/sse`, `/message`, `/health`, or another path
|
|
|
|
3. Add more MCP tools after basic connection works:
|
|
|
|
- `voipms_inspect_number`
|
|
- `voipms_suggest_spam_numbers`
|
|
- `voipms_mark_number_as_spam`
|
|
- `voipms_unmark_number_as_spam`
|
|
- real transcript generation/storage behind `voipms_get_call_transcript`
|
|
|
|
4. Consider adding an audit log for MCP mutation tool calls before exposing
|
|
`dry_run=false` to remote agents.
|
|
|
|
5. Eventually replace the PHP built-in server with a more production-suitable
|
|
deployment if this becomes more than a test endpoint.
|