Install
$ agentstack add skill-voicenterteam-claude-marketplace-mute-recording ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
> Language. Reply in the user's language: detect what they write — Hebrew→Hebrew, English→English — and mirror it, switching if they switch mid-conversation. This shapes your prose, your questions, and your AskUserQuestion option labels only. It does not change the artifacts you produce — identifiers, JSON keys, BCP-47 language codes, API field names, and other data stay exactly as specified.
Help the developer integrate real-time recording mute/unmute into their CRM — so agents can pause recording when a customer provides sensitive information (credit card, ID number, etc.).
When to use this skill
Use this skill when the user wants to:
- Add a "Pause Recording" button in their CRM for PCI-DSS compliance
- Automatically pause recording when an agent opens a payment form
- Mute recording for a specific call by its ID (
ivrid) - Mute all calls on an extension (when the agent enters a sensitive mode)
- Resume recording after sensitive data entry is complete
Environment Variables
VOICENTER_MONITOR_SERVER=https://monitor1.voicenter.co
# Replace "monitor1" with your account's actual monitor server.
# Get the dynamic server from the Real-Time API connection URL, or contact Voicenter support.
How it works
- Send a mute request by extension to mute all active calls on that extension.
- Send a mute request by call ID (
ivrid) to mute one specific call. - Set
state: "0"to unmute and resume recording.
⚠️ Dynamic Monitor Server
The endpoint uses a dynamic monitor server assigned to your account. URL format: https://.voicenter.co/api/MuteUnmuteCalls
To get your account's monitor server:
- From the Real-Time API: the socket connection URL contains your monitor server hostname
- Or contact Voicenter support to get your static monitor server name (e.g.
monitor1,monitor2)
Mute by Extension
Mutes all active calls on the given extension SIP code.
Note: If the agent makes a new call after this request, that new call will not be muted automatically — send another mute request.
POST-JSON
{
"extension": "SIPSIP",
"state": "1"
}
GET
https://YOUR_MONITOR.voicenter.co/api/MuteUnmuteCalls?extension=SIPSIP&state=1
| Field | Required | Values | |---|---|---| | extension | ✅ | SIP code of the extension | | state | ✅ | "1" = Mute, "0" = Unmute |
Mute by Call ID (ivrid)
Mutes one specific call by its unique Voicenter call ID.
POST-JSON
{
"ivrid": "202406011200abc123def456",
"state": "1"
}
GET
https://YOUR_MONITOR.voicenter.co/api/MuteUnmuteCalls?ivrid=202406011200abc123def456&state=1
| Field | Required | Values | |---|---|---| | ivrid | ✅ | Unique call ID from Click2Call response, CDR Notification, or Real-Time events | | state | ✅ | "1" = Mute, "0" = Unmute |
Response
{
"ErrorCode": "200",
"Message": "Success",
"ActionID": "14d3b31988b247be8ff5818d1cadc3d3"
}
| Field | Description | |---|---| | ErrorCode | "200" = success | | Message | "Success" on success; "UniqueIvrID not found" if ivrid is wrong; "Parameters are not valid..." if params are malformed | | ActionID | Unique ID of this mute action |
TypeScript Implementation
const MONITOR_SERVER = process.env.VOICENTER_MONITOR_SERVER!; // e.g. 'https://monitor1.voicenter.co'
interface MuteResponse {
ErrorCode: string;
Message: string;
ActionID: string;
}
async function muteByExtension(extension: string, mute: boolean): Promise {
const res = await fetch(`${MONITOR_SERVER}/api/MuteUnmuteCalls`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ extension, state: mute ? '1' : '0' }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data: MuteResponse = await res.json();
if (data.ErrorCode !== '200') throw new Error(`Mute failed: ${data.Message}`);
return data;
}
async function muteByCallId(ivrid: string, mute: boolean): Promise {
const res = await fetch(`${MONITOR_SERVER}/api/MuteUnmuteCalls`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ivrid, state: mute ? '1' : '0' }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data: MuteResponse = await res.json();
if (data.ErrorCode !== '200') throw new Error(`Mute failed: ${data.Message}`);
return data;
}
PCI-DSS Payment Flow Pattern
// 1. Agent clicks "Enter Payment Details" in CRM
async function onPaymentFormOpen(agentExtension: string) {
await muteByExtension(agentExtension, true);
console.log('Recording paused — payment data not recorded');
}
// 2. Agent collects credit card info (this portion is not recorded)
// 3. Agent clicks "Done" in CRM
async function onPaymentFormClose(agentExtension: string) {
await muteByExtension(agentExtension, false);
console.log('Recording resumed');
}
Tips
- Use mute by ivrid for precision when an agent has multiple concurrent calls (conference, attended transfer).
- Use mute by extension for simple single-call scenarios where you don't have the ivrid handy.
- The
ivridfor a live call is available from the Real-Time API (ExtensionEvent) or from the Click2Call responseCALLID. - Mute state is reflected in:
recording.IsMutedfield in Real-TimeExtensionEventisMutedfield in Pop-Up Screen webhook payload- The CDR recording metadata after the call ends
- Compliant with PCI-DSS requirements for protecting cardholder data during voice transactions.
Related Skills
- Real-Time API — Get
ivridof the current live call and monitor mute state changes - Click2Call — The
CALLIDreturned is the same asivridfor mute requests - Active Calls —
recording.IsMutedfield shows current mute state per extension - Pop-Up Screen —
isMutedfield in the popup payload reflects real-time recording state
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: VoicenterTeam
- Source: VoicenterTeam/claude-marketplace
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.