@agentcall/mcp-server 0.16.9 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/http.js +14 -64
- package/dist/http.js.map +1 -1
- package/dist/index.js +5 -123
- package/dist/index.js.map +1 -1
- package/dist/offer-copy.d.ts +14 -0
- package/dist/offer-copy.d.ts.map +1 -0
- package/dist/offer-copy.js +15 -0
- package/dist/offer-copy.js.map +1 -0
- package/dist/schemas.d.ts +20 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +46 -0
- package/dist/schemas.js.map +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +131 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/account.d.ts +13 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +176 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/calls.d.ts.map +1 -1
- package/dist/tools/calls.js +4 -3
- package/dist/tools/calls.js.map +1 -1
- package/dist/tools/memory.d.ts.map +1 -1
- package/dist/tools/memory.js +2 -1
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/numbers.d.ts.map +1 -1
- package/dist/tools/numbers.js +7 -6
- package/dist/tools/numbers.js.map +1 -1
- package/dist/tools/schedules.js +1 -1
- package/dist/tools/schedules.js.map +1 -1
- package/dist/tools/sms.d.ts.map +1 -1
- package/dist/tools/sms.js +2 -1
- package/dist/tools/sms.js.map +1 -1
- package/package.json +61 -61
package/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# AgentCall MCP server
|
|
2
|
+
|
|
3
|
+
<!-- BEGIN GENERATED OFFER POLICY -->
|
|
4
|
+
## Current offer and agent behavior
|
|
5
|
+
|
|
6
|
+
New accounts receive a one-time 72-hour live trial with one US/Canada local number, 300 managed inbound AI seconds (five minutes) total, and five SMS send attempts to verified destinations. Card verification is required before number allocation; the clock starts when allocation succeeds. There is no monthly reset or automatic paid subscription. Live OTP extraction and outbound calls require Pro.
|
|
7
|
+
|
|
8
|
+
Existing Free accounts retain their assigned monthly allowances. Read the account's offerVersion, trial and limits rather than assuming every Free account has the same offer. Only describe a monthly reset when the account response supplies a non-null resetsAt.
|
|
9
|
+
|
|
10
|
+
Pro is $19.99/month plus number rental and usage: local/mobile numbers $2/month each, toll-free $2.50/month, outbound SMS $0.015/message, standard outbound voice $0.035/min, managed AI voice $0.40/min, BYOK voice $0.10/min plus your AI provider's charges, or Premium Voice $0.59/min. AI calls round up to whole minutes per call. New-account destination/business verification can still apply after upgrading.
|
|
11
|
+
|
|
12
|
+
After trial expiry, the number is held for at least 48 hours before release, with a successful expiry notice before release becomes eligible. A delayed notice extends the hold. Trial expiry and number retention are separate; stored configuration and results remain available. Upgrading during the hold preserves the number.
|
|
13
|
+
|
|
14
|
+
Before quoting allowances or taking a paid action, call get_plan (or GET /v1/account) and use the returned offerVersion, trial, limits, billingStatus and summary. New live_trial_72h_v1 accounts have a one-time 72-hour trial starting at successful number allocation, 300 managed inbound AI seconds total and five verified-destination SMS attempts; card verification is required first. No monthly reset, automatic upgrade or Free overage. Existing free_monthly_v1 accounts retain assigned monthly allowances. Live OTP extraction, outbound calls, BYOK and Premium Voice require Pro for new trial accounts. Explain payment_method_required, payment_recovery_required, trial expiry and quota errors; stop retrying them. Share the returned setup/upgrade link when the user wants to proceed, let the human complete card/payment steps, then reread get_plan before retrying. Do not assume saving a card upgrades the account, or promise a released number can be recovered. Pro is $19.99/month plus number rental and usage. Do not auto-run upgrade_to_pro just because another tool failed. Honor the user's authorization for any real-world action. Read https://api.agentcall.co/llms.txt for the current reference.
|
|
15
|
+
<!-- END GENERATED OFFER POLICY -->
|
|
16
|
+
|
|
17
|
+
Connect Claude Code, Claude Desktop, OpenClaw, or another MCP client to AgentCall phone numbers, SMS, voice, and caller memory.
|
|
18
|
+
|
|
19
|
+
Prefer the hosted Streamable HTTP endpoint `https://api.agentcall.co/mcp` for automatic server updates. Supply your own AgentCall key in the `Authorization: Bearer ...` header using your client's secure credential configuration. Never paste real keys into committed configuration or shared instructions.
|
|
20
|
+
|
|
21
|
+
For local stdio, run `npx -y @agentcall/mcp-server@latest` with `AGENTCALL_API_KEY` set in the process environment. Restart the MCP connection after updating. A client pinned to an older version must change its pin; existing sessions may cache tool descriptions.
|
|
22
|
+
|
|
23
|
+
Optional configuration: `AGENTCALL_BASE_URL` (default `https://api.agentcall.co`) and `AGENTCALL_TIMEOUT_MS` (default `30000`). `AGENTCALL_API_URL` remains supported as a compatibility alias. HTTP and stdio use the same tool and prompt factory.
|
|
24
|
+
|
|
25
|
+
Smithery listing: https://www.smithery.ai/servers/agentcall/agentcall. OpenClaw skill: `agentcall` on ClawHub. Refresh installed skills after a new release; publishing does not rewrite instructions already copied into a user's agent workspace.
|
|
26
|
+
|
|
27
|
+
Before any billable action, read `get_plan`. After payment or a plan change, read it again. Card setup does not subscribe the user to Pro. Full API reference: https://api.agentcall.co/llms.txt.
|
package/dist/http.js
CHANGED
|
@@ -5,69 +5,11 @@
|
|
|
5
5
|
* Supports Streamable HTTP protocol on /mcp endpoint.
|
|
6
6
|
*/
|
|
7
7
|
import { createServer } from "node:http";
|
|
8
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
8
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
10
9
|
import { AgentCall } from "agentcall";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { registerSMSTools } from "./tools/sms.js";
|
|
14
|
-
import { registerCallTools } from "./tools/calls.js";
|
|
15
|
-
import { registerWebhookTools } from "./tools/webhooks.js";
|
|
16
|
-
import { registerUsageTools } from "./tools/usage.js";
|
|
10
|
+
import { createMcpServer } from "./server.js";
|
|
11
|
+
import { OFFER_COPY } from "./offer-copy.js";
|
|
17
12
|
const PORT = parseInt(process.env.PORT || "3002", 10);
|
|
18
|
-
function createMcpServer(apiKey) {
|
|
19
|
-
const client = new AgentCall(apiKey);
|
|
20
|
-
const server = new McpServer({
|
|
21
|
-
name: "agentcall",
|
|
22
|
-
version: "0.7.0",
|
|
23
|
-
});
|
|
24
|
-
registerNumberTools(server, client);
|
|
25
|
-
registerSMSTools(server, client);
|
|
26
|
-
registerCallTools(server, client);
|
|
27
|
-
registerWebhookTools(server, client);
|
|
28
|
-
registerUsageTools(server, client);
|
|
29
|
-
// Register prompts
|
|
30
|
-
server.prompt("setup-agent-phone", "Provision a phone number and configure it for an AI agent", {
|
|
31
|
-
use_case: z.string().describe("What the number will be used for (e.g. 'OTP verification', 'customer support', 'appointment reminders')"),
|
|
32
|
-
country: z.string().optional().describe("Country code: US or CA (defaults to US)"),
|
|
33
|
-
type: z.string().optional().describe("Number type: local, tollfree, or mobile (defaults to local)"),
|
|
34
|
-
}, async ({ use_case, country, type }) => ({
|
|
35
|
-
messages: [{
|
|
36
|
-
role: "user",
|
|
37
|
-
content: {
|
|
38
|
-
type: "text",
|
|
39
|
-
text: `Provision a new ${country || "US"} ${type || "local"} phone number for: ${use_case}. Then list all my numbers to confirm it was provisioned successfully.`,
|
|
40
|
-
},
|
|
41
|
-
}],
|
|
42
|
-
}));
|
|
43
|
-
server.prompt("send-and-track-sms", "Send an SMS message and wait for a reply or OTP code", {
|
|
44
|
-
to: z.string().describe("Recipient phone number in E.164 format (e.g. '+14155551234')"),
|
|
45
|
-
message: z.string().describe("The SMS message to send"),
|
|
46
|
-
wait_for_otp: z.string().optional().describe("Set to 'true' to wait for an OTP reply after sending"),
|
|
47
|
-
}, async ({ to, message, wait_for_otp }) => ({
|
|
48
|
-
messages: [{
|
|
49
|
-
role: "user",
|
|
50
|
-
content: {
|
|
51
|
-
type: "text",
|
|
52
|
-
text: `Send an SMS to ${to} with the message: "${message}".${wait_for_otp === "true" ? " Then wait for an OTP code to arrive in response." : " Then check the inbox for any replies."}`,
|
|
53
|
-
},
|
|
54
|
-
}],
|
|
55
|
-
}));
|
|
56
|
-
server.prompt("ai-outbound-call", "Set up and make an AI-powered outbound voice call", {
|
|
57
|
-
to: z.string().describe("Who to call — phone number in E.164 format"),
|
|
58
|
-
purpose: z.string().describe("Purpose and instructions for the AI during the call"),
|
|
59
|
-
voice: z.string().optional().describe("Voice to use: alloy, ash, ballad, cedar (new), coral, echo, marin (new), sage, shimmer (default), verse. Run GET /v1/calls/voices for descriptions and samples."),
|
|
60
|
-
}, async ({ to, purpose, voice }) => ({
|
|
61
|
-
messages: [{
|
|
62
|
-
role: "user",
|
|
63
|
-
content: {
|
|
64
|
-
type: "text",
|
|
65
|
-
text: `Make an AI-powered voice call to ${to}. Purpose: ${purpose}.${voice ? ` Use the "${voice}" voice.` : ""} After the call completes, retrieve the transcript.`,
|
|
66
|
-
},
|
|
67
|
-
}],
|
|
68
|
-
}));
|
|
69
|
-
return server;
|
|
70
|
-
}
|
|
71
13
|
const httpServer = createServer(async (req, res) => {
|
|
72
14
|
// Health check
|
|
73
15
|
if (req.url === "/health") {
|
|
@@ -80,11 +22,12 @@ const httpServer = createServer(async (req, res) => {
|
|
|
80
22
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
81
23
|
res.end(JSON.stringify({
|
|
82
24
|
name: "AgentCall",
|
|
83
|
-
description: "Programmable phone numbers for AI agents —
|
|
25
|
+
description: "Programmable phone numbers for AI agents — 62 MCP tools for SMS, voice calls, OTP extraction, and more",
|
|
84
26
|
homepage: "https://agentcall.co",
|
|
85
27
|
documentation: "https://api.agentcall.co/docs",
|
|
86
28
|
mcp_endpoint: "/mcp",
|
|
87
|
-
auth: { type: "
|
|
29
|
+
auth: { type: "bearer" },
|
|
30
|
+
instructions: OFFER_COPY.agentGuidance,
|
|
88
31
|
}));
|
|
89
32
|
return;
|
|
90
33
|
}
|
|
@@ -108,6 +51,13 @@ const httpServer = createServer(async (req, res) => {
|
|
|
108
51
|
if (authHeader?.startsWith("Bearer ")) {
|
|
109
52
|
apiKey = authHeader.slice(7);
|
|
110
53
|
}
|
|
54
|
+
else if (authHeader?.startsWith("ac_live_")) {
|
|
55
|
+
// Smithery's saved config maps the key directly to Authorization.
|
|
56
|
+
apiKey = authHeader;
|
|
57
|
+
}
|
|
58
|
+
const smitheryHeader = req.headers.agentcallapikey;
|
|
59
|
+
if (!apiKey && typeof smitheryHeader === "string")
|
|
60
|
+
apiKey = smitheryHeader;
|
|
111
61
|
}
|
|
112
62
|
// Fallback to env var
|
|
113
63
|
if (!apiKey && process.env.AGENTCALL_API_KEY) {
|
|
@@ -120,7 +70,7 @@ const httpServer = createServer(async (req, res) => {
|
|
|
120
70
|
// Use provided API key, or a placeholder for scanning (tools/list works without real calls)
|
|
121
71
|
const apiKey = extractApiKey(req.url) || "placeholder_for_scanning";
|
|
122
72
|
try {
|
|
123
|
-
const server = createMcpServer(apiKey);
|
|
73
|
+
const server = createMcpServer(new AgentCall(apiKey, { baseUrl: process.env.AGENTCALL_BASE_URL || process.env.AGENTCALL_API_URL }));
|
|
124
74
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
125
75
|
await server.connect(transport);
|
|
126
76
|
await transport.handleRequest(req, res);
|
|
@@ -138,7 +88,7 @@ const httpServer = createServer(async (req, res) => {
|
|
|
138
88
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
139
89
|
res.end(JSON.stringify({
|
|
140
90
|
name: "AgentCall MCP Server",
|
|
141
|
-
description: "Programmable phone numbers for AI agents —
|
|
91
|
+
description: "Programmable phone numbers for AI agents — 62 MCP tools",
|
|
142
92
|
docs: "https://api.agentcall.co/docs",
|
|
143
93
|
mcp_endpoint: "/mcp",
|
|
144
94
|
dashboard: "https://agentcall.co",
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
3
|
import { AgentCall } from "agentcall";
|
|
5
|
-
import {
|
|
6
|
-
import { registerNumberTools } from "./tools/numbers.js";
|
|
7
|
-
import { registerSMSTools } from "./tools/sms.js";
|
|
8
|
-
import { registerCallTools } from "./tools/calls.js";
|
|
9
|
-
import { registerWebhookTools } from "./tools/webhooks.js";
|
|
10
|
-
import { registerUsageTools } from "./tools/usage.js";
|
|
11
|
-
import { registerMemoryTools } from "./tools/memory.js";
|
|
12
|
-
import { registerScheduleTools } from "./tools/schedules.js";
|
|
13
|
-
import { registerAgentfmTools } from "./tools/agentfm.js";
|
|
4
|
+
import { createMcpServer } from "./server.js";
|
|
14
5
|
function getApiKey() {
|
|
15
6
|
// Check CLI args: --api-key <key>
|
|
16
7
|
const args = process.argv.slice(2);
|
|
@@ -41,8 +32,8 @@ function getApiKey() {
|
|
|
41
32
|
*/
|
|
42
33
|
function getOptionalConfig() {
|
|
43
34
|
const out = {};
|
|
44
|
-
if (process.env.AGENTCALL_BASE_URL) {
|
|
45
|
-
out.baseUrl = process.env.AGENTCALL_BASE_URL;
|
|
35
|
+
if (process.env.AGENTCALL_BASE_URL || process.env.AGENTCALL_API_URL) {
|
|
36
|
+
out.baseUrl = process.env.AGENTCALL_BASE_URL || process.env.AGENTCALL_API_URL;
|
|
46
37
|
}
|
|
47
38
|
if (process.env.AGENTCALL_TIMEOUT_MS) {
|
|
48
39
|
const parsed = parseInt(process.env.AGENTCALL_TIMEOUT_MS, 10);
|
|
@@ -56,120 +47,11 @@ async function main() {
|
|
|
56
47
|
const optionalConfig = getOptionalConfig();
|
|
57
48
|
// Initialize the AgentCall SDK client
|
|
58
49
|
const client = new AgentCall(apiKey, optionalConfig);
|
|
59
|
-
|
|
60
|
-
// hover/inspection; keep in sync with package.json on every release.
|
|
61
|
-
const server = new McpServer({
|
|
62
|
-
name: "agentcall",
|
|
63
|
-
version: "0.16.8",
|
|
64
|
-
});
|
|
65
|
-
// Register all tools
|
|
66
|
-
registerNumberTools(server, client);
|
|
67
|
-
registerSMSTools(server, client);
|
|
68
|
-
registerCallTools(server, client);
|
|
69
|
-
registerWebhookTools(server, client);
|
|
70
|
-
registerUsageTools(server, client);
|
|
71
|
-
registerMemoryTools(server, client);
|
|
72
|
-
registerScheduleTools(server, client);
|
|
73
|
-
registerAgentfmTools(server);
|
|
74
|
-
// Register prompts
|
|
75
|
-
server.prompt("setup-agent-phone", "Provision a phone number and configure it for an AI agent", {
|
|
76
|
-
use_case: z.string().describe("What the number will be used for (e.g. 'OTP verification', 'customer support', 'appointment reminders')"),
|
|
77
|
-
country: z.string().optional().describe("Country code: US or CA (defaults to US)"),
|
|
78
|
-
type: z.string().optional().describe("Number type: local, tollfree, or mobile (defaults to local)"),
|
|
79
|
-
}, async ({ use_case, country, type }) => ({
|
|
80
|
-
messages: [{
|
|
81
|
-
role: "user",
|
|
82
|
-
content: {
|
|
83
|
-
type: "text",
|
|
84
|
-
text: `Provision a new ${country || "US"} ${type || "local"} phone number for: ${use_case}. Then list all my numbers to confirm it was provisioned successfully.`,
|
|
85
|
-
},
|
|
86
|
-
}],
|
|
87
|
-
}));
|
|
88
|
-
server.prompt("send-and-track-sms", "Send an SMS message and wait for a reply or OTP code", {
|
|
89
|
-
to: z.string().describe("Recipient phone number in E.164 format (e.g. '+14155551234')"),
|
|
90
|
-
message: z.string().describe("The SMS message to send"),
|
|
91
|
-
wait_for_otp: z.string().optional().describe("Set to 'true' to wait for an OTP reply after sending"),
|
|
92
|
-
}, async ({ to, message, wait_for_otp }) => ({
|
|
93
|
-
messages: [{
|
|
94
|
-
role: "user",
|
|
95
|
-
content: {
|
|
96
|
-
type: "text",
|
|
97
|
-
text: `Send an SMS to ${to} with the message: "${message}".${wait_for_otp === "true" ? " Then wait for an OTP code to arrive in response." : " Then check the inbox for any replies."}`,
|
|
98
|
-
},
|
|
99
|
-
}],
|
|
100
|
-
}));
|
|
101
|
-
server.prompt("ai-outbound-call", "Set up and make an AI-powered outbound voice call. The AI follows your purpose autonomously.", {
|
|
102
|
-
to: z.string().describe("Who to call — phone number in E.164 format"),
|
|
103
|
-
purpose: z.string().describe("Purpose and instructions for the AI during the call"),
|
|
104
|
-
voice: z.string().optional().describe("Voice to use: alloy, ash, ballad, cedar (new), coral, echo, marin (new), sage, shimmer (default), verse. Run GET /v1/calls/voices for descriptions and samples."),
|
|
105
|
-
}, async ({ to, purpose, voice }) => ({
|
|
106
|
-
messages: [{
|
|
107
|
-
role: "user",
|
|
108
|
-
content: {
|
|
109
|
-
type: "text",
|
|
110
|
-
text: `Make an AI-powered voice call to ${to}. Purpose: ${purpose}.${voice ? ` Use the "${voice}" voice.` : ""} After the call completes, retrieve the transcript.`,
|
|
111
|
-
},
|
|
112
|
-
}],
|
|
113
|
-
}));
|
|
114
|
-
server.prompt("follow-up-on-call", "Call back the person from a previous inbound call. The AI handles the follow-up conversation autonomously, grounded in what the original caller actually said (intent, commitments we made, outstanding tasks, unresolved questions). Use this when the user wants to return a missed call or follow up on an open item from a recent call.", {
|
|
115
|
-
call_id: z.string().describe("The ID of the original inbound call to follow up on (e.g. 'call_abc123'). Use list_calls or look at the call detail page if you don't have it."),
|
|
116
|
-
reason: z.string().optional().describe("Optional override for the follow-up reason (e.g. 'tell them their estimate is ready', 'confirm tomorrow's appointment'). If omitted, the AI follows up on whatever was open from the original call (commitments, unresolved questions, tasks)."),
|
|
117
|
-
voice: z.string().optional().describe("Voice for the follow-up call. Defaults to marin (soft, natural) since most follow-ups read better warm."),
|
|
118
|
-
language: z.string().optional().describe("Spoken language for the follow-up. 'auto' (default) matches the recipient. Specific ISO-639-1 codes (en, es, fr, de, ja, zh, and 25 more) pin the AI to that language even if the recipient speaks another."),
|
|
119
|
-
}, async ({ call_id, reason, voice, language }) => ({
|
|
120
|
-
messages: [{
|
|
121
|
-
role: "user",
|
|
122
|
-
content: {
|
|
123
|
-
type: "text",
|
|
124
|
-
text: [
|
|
125
|
-
`Follow up on inbound call ${call_id}.`,
|
|
126
|
-
``,
|
|
127
|
-
`Steps:`,
|
|
128
|
-
`1. Call get_call with callId=${call_id} to load the original call (caller's number, AgentCall number that answered, timestamps, direction).`,
|
|
129
|
-
`2. Call get_call_report with callId=${call_id} to load the structured report (intent, summary, commitments, tasks, unresolved questions, caller name, spam flag).`,
|
|
130
|
-
`3. STOP if the report has spam=true. Spam follow-ups dial back robocallers. Tell the user the original call was flagged as spam and ask if they really want to proceed before going further.`,
|
|
131
|
-
`4. Read the user back the caller's name (if known), the original call's date and intent, and the specific items you intend to follow up on (commitments made, tasks open, unresolved questions). ${reason ? `Also note the user has asked you to focus on: "${reason}".` : `If the report has no open items and no specific reason was provided, ask the user what they want the AI to say on the follow-up.`}`,
|
|
132
|
-
`5. Get the user's explicit confirmation before placing the call. Include the exact recipient number, the AgentCall number you'll call from, and the budget impact ($0.40/min Managed or $0.10/min BYOK on Pro; outbound AI is Pro-only).`,
|
|
133
|
-
`6. Build a follow-up systemPrompt that references ONLY what was captured in the original call's report: caller name, original intent, the specific items above, and conservative guardrails (never invent details, keep the call under 3 minutes, leave a brief voicemail if no answer, end the call cleanly when the goal is met).`,
|
|
134
|
-
`7. Build a firstMessage that names the caller (when known) and references the prior conversation, e.g. "Hi {Name}, this is calling you back about your earlier conversation with us. Do you have a quick moment?". Keep firstMessage verbatim — if language is non-English, translate this line yourself.`,
|
|
135
|
-
`8. Call initiate_ai_call with from=<the AgentCall number that answered the original call>, to=<the original caller's number from get_call>, systemPrompt=<the stitched follow-up prompt>, firstMessage=<the greeting>, voice="${voice || 'marin'}", language="${language || 'auto'}", maxDurationSecs=300.`,
|
|
136
|
-
`9. Tell the user the call was placed and remind them they can watch the live transcript at https://agentcall.co/calls/<the new call ID> while the AI handles the conversation.`,
|
|
137
|
-
].join('\n'),
|
|
138
|
-
},
|
|
139
|
-
}],
|
|
140
|
-
}));
|
|
141
|
-
server.prompt("setup-inbound-ai-receptionist", "Configure a phone number to be answered autonomously by an AI voice agent. Picks the right voice + system prompt for the use case and wires it up. Free tier: 5 minutes/month free trial. Once exhausted, calls hang up until next month resets, or upgrade to Pro for unlimited inbound AI at $0.40/min. Available on US and Canada numbers.", {
|
|
142
|
-
number_id: z.string().describe("The phone number ID to configure (e.g. 'num_abc123'). Use list_numbers first if you don't have it."),
|
|
143
|
-
use_case: z.string().describe("What the receptionist should do (e.g. 'front desk for Acme Plumbing', 'qualify B2B leads', 'book appointments for a salon', 'screen unwanted calls', 'answer FAQ for SaaS support')"),
|
|
144
|
-
business_name: z.string().describe("The business or person the AI is answering for (e.g. 'Acme Plumbing', 'Dr. Smith DDS')"),
|
|
145
|
-
key_facts: z.string().optional().describe("Any facts the AI should know — pricing, services, hours. Without these, the AI may hallucinate. Optional but strongly recommended."),
|
|
146
|
-
voice: z.string().optional().describe("Voice override. Defaults to a sensible match for the use case (e.g. marin for receptionist or support, sage for healthcare, coral for B2B sales)."),
|
|
147
|
-
}, async ({ number_id, use_case, business_name, key_facts, voice }) => ({
|
|
148
|
-
messages: [{
|
|
149
|
-
role: "user",
|
|
150
|
-
content: {
|
|
151
|
-
type: "text",
|
|
152
|
-
text: [
|
|
153
|
-
`Configure inbound AI on number ${number_id} for ${business_name}.`,
|
|
154
|
-
``,
|
|
155
|
-
`Use case: ${use_case}`,
|
|
156
|
-
key_facts ? `\nKey facts the AI should know:\n${key_facts}` : `\nNote: no key facts provided. The AI will follow the use case but may not know specifics like pricing or hours.`,
|
|
157
|
-
``,
|
|
158
|
-
`Steps:`,
|
|
159
|
-
`1. Fetch GET https://api.agentcall.co/v1/calls/prompt-templates and pick the template that best matches the use case.`,
|
|
160
|
-
`2. ${voice ? `Use the "${voice}" voice.` : `Pick the recommendedVoice from that template (or browse GET /v1/calls/voices if a different fit is better).`}`,
|
|
161
|
-
`3. Customize the template's systemPrompt — replace [BRACKETED] placeholders with the business name and any key facts above. Keep the structure (WHAT WE DO / INSTRUCTIONS / NEVER sections) intact.`,
|
|
162
|
-
`4. Call configure_inbound_ai with numberId=${number_id}, the customized systemPrompt, the chosen voice, and a warm firstMessage that names the business.`,
|
|
163
|
-
`5. Confirm the configuration was saved.`,
|
|
164
|
-
`6. Tell the user the number is now answering inbound calls. On Free, the first 5 minutes/month are free; once exhausted, calls hang up until the 1st of next month (UTC), or upgrade to Pro for unlimited inbound AI at $0.40/min.`,
|
|
165
|
-
].join('\n'),
|
|
166
|
-
},
|
|
167
|
-
}],
|
|
168
|
-
}));
|
|
50
|
+
const server = createMcpServer(client);
|
|
169
51
|
// Connect via stdio transport
|
|
170
52
|
const transport = new StdioServerTransport();
|
|
171
53
|
await server.connect(transport);
|
|
172
|
-
console.error("AgentCall MCP server running (
|
|
54
|
+
console.error("AgentCall MCP server running (62 tools, 5 prompts registered)");
|
|
173
55
|
}
|
|
174
56
|
main().catch((err) => {
|
|
175
57
|
console.error("Fatal error:", err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,SAAS,SAAS;IAChB,kCAAkC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CACV,0FAA0F;YAC1F,oEAAoE,CACrE,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,KAAK,CACX,sCAAsC;QACpC,2EAA2E;QAC3E,UAAU;QACV,yCAAyC;QACzC,iDAAiD,CACpD,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAA2C,EAAE,CAAC;IACvD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACjF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const OFFER_COPY: {
|
|
2
|
+
readonly version: "2026-09-08";
|
|
3
|
+
readonly trial: "New accounts receive a one-time 72-hour live trial with one US/Canada local number, 300 managed inbound AI seconds (five minutes) total, and five SMS send attempts to verified destinations. Card verification is required before number allocation; the clock starts when allocation succeeds. There is no monthly reset or automatic paid subscription. Live OTP extraction and outbound calls require Pro.";
|
|
4
|
+
readonly legacy: "Existing Free accounts retain their assigned monthly allowances. Read the account's offerVersion, trial and limits rather than assuming every Free account has the same offer. Only describe a monthly reset when the account response supplies a non-null resetsAt.";
|
|
5
|
+
readonly pricing: "Pro is $19.99/month plus number rental and usage: local/mobile numbers $2/month each, toll-free $2.50/month, outbound SMS $0.015/message, standard outbound voice $0.035/min, managed AI voice $0.40/min, BYOK voice $0.10/min plus your AI provider's charges, or Premium Voice $0.59/min. AI calls round up to whole minutes per call. New-account destination/business verification can still apply after upgrading.";
|
|
6
|
+
readonly retention: "After trial expiry, the number is held for at least 48 hours before release, with a successful expiry notice before release becomes eligible. A delayed notice extends the hold. Trial expiry and number retention are separate; stored configuration and results remain available. Upgrading during the hold preserves the number.";
|
|
7
|
+
readonly voice: "New accounts get 300 managed inbound AI seconds total within a one-time 72-hour live trial, with card verification before number allocation. Exhaustion or expiry stops new trial calls; it does not create paid overage or a monthly reset. Existing Free accounts keep their assigned monthly offer. Read get_plan or GET /v1/account before quoting limits.";
|
|
8
|
+
readonly sms: "New live trials include five SMS send attempts total to verified destinations during the trial. Failed or ambiguous sends consume an attempt. Existing Free accounts keep their assigned monthly SMS allowance; read get_plan or GET /v1/account. Pro outbound SMS is $0.015/message, subject to account and destination restrictions.";
|
|
9
|
+
readonly otp: "Live OTP extraction requires Pro for new live-trial accounts. Existing Free accounts retain any OTP allowance reported by their account. Use verification only for apps you control; number acceptance by third-party services is not guaranteed.";
|
|
10
|
+
readonly memory: "Caller memory is available on Free and Pro within the account's voice allowance. New trials have five inbound AI minutes total over 72 hours; existing Free accounts retain their assigned monthly offer. Stored memory remains available after a trial ends. Memory does not add a separate usage fee.";
|
|
11
|
+
readonly provision: "Read get_plan or GET /v1/account, then list existing numbers before provisioning. New live trials require a verified card and are limited to one eligible local number and one trial per eligible card. Number/SMS activation can take additional time after allocation. After an ambiguous failure, list numbers before retrying; do not buy a duplicate or retry quota/payment errors in a loop.";
|
|
12
|
+
readonly agentGuidance: "Before quoting allowances or taking a paid action, call get_plan (or GET /v1/account) and use the returned offerVersion, trial, limits, billingStatus and summary. New live_trial_72h_v1 accounts have a one-time 72-hour trial starting at successful number allocation, 300 managed inbound AI seconds total and five verified-destination SMS attempts; card verification is required first. No monthly reset, automatic upgrade or Free overage. Existing free_monthly_v1 accounts retain assigned monthly allowances. Live OTP extraction, outbound calls, BYOK and Premium Voice require Pro for new trial accounts. Explain payment_method_required, payment_recovery_required, trial expiry and quota errors; stop retrying them. Share the returned setup/upgrade link when the user wants to proceed, let the human complete card/payment steps, then reread get_plan before retrying. Do not assume saving a card upgrades the account, or promise a released number can be recovered. Pro is $19.99/month plus number rental and usage. Do not auto-run upgrade_to_pro just because another tool failed. Honor the user's authorization for any real-world action. Read https://api.agentcall.co/llms.txt for the current reference.";
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=offer-copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offer-copy.d.ts","sourceRoot":"","sources":["../src/offer-copy.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU;;;;;;;;;;;;CAYb,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Generated by scripts/sync-offer-policy.cjs from content/offer-policy.json.
|
|
2
|
+
export const OFFER_COPY = {
|
|
3
|
+
"version": "2026-09-08",
|
|
4
|
+
"trial": "New accounts receive a one-time 72-hour live trial with one US/Canada local number, 300 managed inbound AI seconds (five minutes) total, and five SMS send attempts to verified destinations. Card verification is required before number allocation; the clock starts when allocation succeeds. There is no monthly reset or automatic paid subscription. Live OTP extraction and outbound calls require Pro.",
|
|
5
|
+
"legacy": "Existing Free accounts retain their assigned monthly allowances. Read the account's offerVersion, trial and limits rather than assuming every Free account has the same offer. Only describe a monthly reset when the account response supplies a non-null resetsAt.",
|
|
6
|
+
"pricing": "Pro is $19.99/month plus number rental and usage: local/mobile numbers $2/month each, toll-free $2.50/month, outbound SMS $0.015/message, standard outbound voice $0.035/min, managed AI voice $0.40/min, BYOK voice $0.10/min plus your AI provider's charges, or Premium Voice $0.59/min. AI calls round up to whole minutes per call. New-account destination/business verification can still apply after upgrading.",
|
|
7
|
+
"retention": "After trial expiry, the number is held for at least 48 hours before release, with a successful expiry notice before release becomes eligible. A delayed notice extends the hold. Trial expiry and number retention are separate; stored configuration and results remain available. Upgrading during the hold preserves the number.",
|
|
8
|
+
"voice": "New accounts get 300 managed inbound AI seconds total within a one-time 72-hour live trial, with card verification before number allocation. Exhaustion or expiry stops new trial calls; it does not create paid overage or a monthly reset. Existing Free accounts keep their assigned monthly offer. Read get_plan or GET /v1/account before quoting limits.",
|
|
9
|
+
"sms": "New live trials include five SMS send attempts total to verified destinations during the trial. Failed or ambiguous sends consume an attempt. Existing Free accounts keep their assigned monthly SMS allowance; read get_plan or GET /v1/account. Pro outbound SMS is $0.015/message, subject to account and destination restrictions.",
|
|
10
|
+
"otp": "Live OTP extraction requires Pro for new live-trial accounts. Existing Free accounts retain any OTP allowance reported by their account. Use verification only for apps you control; number acceptance by third-party services is not guaranteed.",
|
|
11
|
+
"memory": "Caller memory is available on Free and Pro within the account's voice allowance. New trials have five inbound AI minutes total over 72 hours; existing Free accounts retain their assigned monthly offer. Stored memory remains available after a trial ends. Memory does not add a separate usage fee.",
|
|
12
|
+
"provision": "Read get_plan or GET /v1/account, then list existing numbers before provisioning. New live trials require a verified card and are limited to one eligible local number and one trial per eligible card. Number/SMS activation can take additional time after allocation. After an ambiguous failure, list numbers before retrying; do not buy a duplicate or retry quota/payment errors in a loop.",
|
|
13
|
+
"agentGuidance": "Before quoting allowances or taking a paid action, call get_plan (or GET /v1/account) and use the returned offerVersion, trial, limits, billingStatus and summary. New live_trial_72h_v1 accounts have a one-time 72-hour trial starting at successful number allocation, 300 managed inbound AI seconds total and five verified-destination SMS attempts; card verification is required first. No monthly reset, automatic upgrade or Free overage. Existing free_monthly_v1 accounts retain assigned monthly allowances. Live OTP extraction, outbound calls, BYOK and Premium Voice require Pro for new trial accounts. Explain payment_method_required, payment_recovery_required, trial expiry and quota errors; stop retrying them. Share the returned setup/upgrade link when the user wants to proceed, let the human complete card/payment steps, then reread get_plan before retrying. Do not assume saving a card upgrades the account, or promise a released number can be recovered. Pro is $19.99/month plus number rental and usage. Do not auto-run upgrade_to_pro just because another tool failed. Honor the user's authorization for any real-world action. Read https://api.agentcall.co/llms.txt for the current reference."
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=offer-copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offer-copy.js","sourceRoot":"","sources":["../src/offer-copy.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,gZAAgZ;IACzZ,QAAQ,EAAE,sQAAsQ;IAChR,SAAS,EAAE,yZAAyZ;IACpa,WAAW,EAAE,qUAAqU;IAClV,OAAO,EAAE,gWAAgW;IACzW,KAAK,EAAE,wUAAwU;IAC/U,KAAK,EAAE,mPAAmP;IAC1P,QAAQ,EAAE,ySAAyS;IACnT,WAAW,EAAE,oYAAoY;IACjZ,eAAe,EAAE,krCAAkrC;CAC3rC,CAAA"}
|
package/dist/schemas.d.ts
CHANGED
|
@@ -852,6 +852,26 @@ export declare const webhookListOutputSchema: {
|
|
|
852
852
|
hasMore: z.ZodOptional<z.ZodBoolean>;
|
|
853
853
|
nextCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
854
854
|
};
|
|
855
|
+
export declare const planOutputSchema: {
|
|
856
|
+
plan: z.ZodString;
|
|
857
|
+
summary: z.ZodString;
|
|
858
|
+
limits: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
859
|
+
usage: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
860
|
+
freeInboundAiVoice: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
861
|
+
freeInboundAiMinutesRemaining: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
862
|
+
freeInboundAiMinutesCap: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
863
|
+
freeInboundAiResetsAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
864
|
+
period: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
865
|
+
memoryEnabled: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
866
|
+
proPrice: z.ZodString;
|
|
867
|
+
upgradeUrl: z.ZodString;
|
|
868
|
+
upgradeToolName: z.ZodString;
|
|
869
|
+
};
|
|
870
|
+
export declare const upgradeToProOutputSchema: {
|
|
871
|
+
url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
872
|
+
alreadyPro: z.ZodOptional<z.ZodBoolean>;
|
|
873
|
+
message: z.ZodOptional<z.ZodString>;
|
|
874
|
+
};
|
|
855
875
|
export declare const usageOutputSchema: {
|
|
856
876
|
period: z.ZodString;
|
|
857
877
|
breakdown: z.ZodObject<{
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas.js
CHANGED
|
@@ -245,6 +245,52 @@ export const webhookListOutputSchema = {
|
|
|
245
245
|
hasMore: z.boolean().optional().describe("Whether more results exist"),
|
|
246
246
|
nextCursor: z.string().nullable().optional().describe("Pagination cursor, if any"),
|
|
247
247
|
};
|
|
248
|
+
// get_plan. Liberal on purpose: GET /v1/account grows fields over time and a
|
|
249
|
+
// stricter mirror here would turn every new API field into an MCP validation
|
|
250
|
+
// failure. Only `plan`, `summary`, and the upgrade pointers are guaranteed.
|
|
251
|
+
export const planOutputSchema = {
|
|
252
|
+
plan: z.string().describe("Current plan: 'free' or 'pro'"),
|
|
253
|
+
summary: z
|
|
254
|
+
.string()
|
|
255
|
+
.describe("One-sentence plan summary to read to the user (plan, remaining AI allowance and trial expiry or legacy reset, what Pro costs)."),
|
|
256
|
+
limits: z
|
|
257
|
+
.record(z.string(), z.unknown())
|
|
258
|
+
.nullable()
|
|
259
|
+
.optional()
|
|
260
|
+
.describe("Plan limits: maxNumbers, maxSmsPerMonth, maxCallMinutesPerMonth (null means unlimited), allowedNumberTypes."),
|
|
261
|
+
usage: z
|
|
262
|
+
.record(z.string(), z.unknown())
|
|
263
|
+
.nullable()
|
|
264
|
+
.optional()
|
|
265
|
+
.describe("Usage this period: activeNumbers, smsThisMonth, callMinutesThisMonth."),
|
|
266
|
+
freeInboundAiVoice: z
|
|
267
|
+
.record(z.string(), z.unknown())
|
|
268
|
+
.nullable()
|
|
269
|
+
.optional()
|
|
270
|
+
.describe("Free inbound AI trial state (capSeconds, usedSeconds, remainingSeconds, resetsAt). Null on Pro."),
|
|
271
|
+
freeInboundAiMinutesRemaining: z
|
|
272
|
+
.number()
|
|
273
|
+
.nullable()
|
|
274
|
+
.optional()
|
|
275
|
+
.describe("Remaining AI answering allowance for the assigned offer. Null on Pro (unlimited)."),
|
|
276
|
+
freeInboundAiMinutesCap: z.number().nullable().optional().describe("AI answering allowance for the assigned offer. Null on Pro."),
|
|
277
|
+
freeInboundAiResetsAt: z.string().nullable().optional().describe("Legacy monthly reset timestamp. Null for one-time trials and Pro."),
|
|
278
|
+
period: z.string().nullable().optional().describe("Billing period in YYYY-MM format"),
|
|
279
|
+
memoryEnabled: z.boolean().nullable().optional().describe("Whether Auditable Call Memory is on"),
|
|
280
|
+
proPrice: z.string().describe("How Pro is priced: '$19.99/mo plus usage'"),
|
|
281
|
+
upgradeUrl: z.string().describe("Absolute URL where a human can upgrade (https://agentcall.co/billing)"),
|
|
282
|
+
upgradeToolName: z.string().describe("The MCP tool that returns a checkout link: 'upgrade_to_pro'"),
|
|
283
|
+
};
|
|
284
|
+
// upgrade_to_pro
|
|
285
|
+
export const upgradeToProOutputSchema = {
|
|
286
|
+
url: z
|
|
287
|
+
.string()
|
|
288
|
+
.nullable()
|
|
289
|
+
.optional()
|
|
290
|
+
.describe("Secure checkout link for the human to open. Show it exactly as returned. Null when the account is already on Pro."),
|
|
291
|
+
alreadyPro: z.boolean().optional().describe("True when the account is already on Pro and no checkout link was minted."),
|
|
292
|
+
message: z.string().optional().describe("Human-readable note to relay when url is null."),
|
|
293
|
+
};
|
|
248
294
|
export const usageOutputSchema = {
|
|
249
295
|
period: z.string().describe("Billing period in YYYY-MM format"),
|
|
250
296
|
breakdown: z
|