@vapi-ai/mcp-server 0.0.2 → 0.0.4

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 CHANGED
@@ -2,23 +2,17 @@
2
2
 
3
3
  The Vapi [Model Context Protocol](https://modelcontextprotocol.com/) server allows you to integrate with Vapi APIs through function calling.
4
4
 
5
- ## Setup
5
+ ## Claude Desktop Setup
6
6
 
7
- To run the Vapi MCP server using npx, use the following command:
8
-
9
- ```bash
10
- # To set up all available tools
11
- export VAPI_TOKEN=your_vapi_token
12
-
13
- npx -y @vapi-ai/mcp-server
14
- ```
15
-
16
- ### Usage with Claude Desktop
17
-
18
- Add the following to your `claude_desktop_config.json`. See [here](https://modelcontextprotocol.io/quickstart/user) for more details.
19
-
20
- ```
7
+ 1. Open `Claude Desktop` and press `CMD + ,` to go to `Settings`.
8
+ 2. Click on the `Developer` tab.
9
+ 3. Click on the `Edit Config` button.
10
+ 4. This will open the `claude_desktop_config.json` file in your file explorer.
11
+ 5. Get your Vapi API key from the Vapi dashboard (<https://dashboard.vapi.ai/org/api-keys>).
12
+ 6. Add the following to your `claude_desktop_config.json` file. See [here](https://modelcontextprotocol.io/quickstart/user) for more details.
13
+ 7. Restart the Claude Desktop after editing the config file.
21
14
 
15
+ ```json
22
16
  {
23
17
  "mcpServers": {
24
18
  "vapi-mcp-server": {
@@ -36,6 +30,27 @@ Add the following to your `claude_desktop_config.json`. See [here](https://model
36
30
 
37
31
  ```
38
32
 
33
+ ### Example Usage with Claude Desktop
34
+
35
+ 1. Create or import a phone number using the Vapi dashboard (<https://dashboard.vapi.ai/phone-numbers>).
36
+ 2. Create a new assistant using the existing 'Appointment Scheduler' template in the Vapi dashboard (<https://dashboard.vapi.ai/assistants>).
37
+ 3. Make sure to configure Claude Desktop to use the Vapi MCP server and restart the Claude Desktop app.
38
+ 4. Ask Claude with the following message:
39
+
40
+ ```md
41
+ I wanna schedule an appointment, can you connect me with Riley assistant using my phone number +1234567890?
42
+ ```
43
+
44
+ ## Remote SSE Connection
45
+
46
+ To connect to Vapi's MCP server via Server-Sent Events (SSE) Transport:
47
+
48
+ - Connect to `https://mcp.vapi.ai/sse` from any MCP client using SSE Transport
49
+ - Include your Vapi API key as a bearer token in the request headers
50
+ - Example header: `Authorization: Bearer your_vapi_api_key_here`
51
+
52
+ This connection allows you to access Vapi's functionality remotely without running a local server.
53
+
39
54
  ## Development
40
55
 
41
56
  ```bash
@@ -46,16 +61,29 @@ npm install
46
61
  npm run build
47
62
  ```
48
63
 
49
- ```bash
50
- # Run the server in development mode with hot reloading
51
- npm run dev
64
+ Update your `claude_desktop_config.json` to use the local server.
65
+
66
+ ```json
67
+ {
68
+ "mcpServers": {
69
+ "vapi-local": {
70
+ "command": "node",
71
+ "args": [
72
+ "<path_to_vapi_mcp_server>/dist/index.js"
73
+ ],
74
+ "env": {
75
+ "VAPI_TOKEN": "<your_vapi_token>"
76
+ }
77
+ },
78
+ }
79
+ }
52
80
  ```
53
81
 
54
- ## Testing
82
+ ### Testing
55
83
 
56
84
  The project has two types of tests:
57
85
 
58
- ### Unit Tests
86
+ #### Unit Tests
59
87
 
60
88
  Unit tests use mocks to test the MCP server without making actual API calls to Vapi.
61
89
 
@@ -64,7 +92,7 @@ Unit tests use mocks to test the MCP server without making actual API calls to V
64
92
  npm run test:unit
65
93
  ```
66
94
 
67
- ### End-to-End Tests
95
+ #### End-to-End Tests
68
96
 
69
97
  E2E tests run the full MCP server with actual API calls to Vapi.
70
98
 
@@ -78,10 +106,17 @@ npm run test:e2e
78
106
 
79
107
  Note: E2E tests require a valid Vapi API token to be set in the environment.
80
108
 
81
- ## Running All Tests
109
+ #### Running All Tests
82
110
 
83
111
  To run all tests at once:
84
112
 
85
113
  ```bash
86
114
  npm test
87
115
  ```
116
+
117
+ ## References
118
+
119
+ - [VAPI Remote MCP Server](https://mcp.vapi.ai/)
120
+ - [VAPI MCP Tool](https://docs.vapi.ai/tools/mcp)
121
+ - [Model Context Protocol](https://modelcontextprotocol.com/)
122
+ - [Claude Desktop](https://modelcontextprotocol.io/quickstart/user)
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-server-e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-e2e.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-server-e2e.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-server-mock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server-mock.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-server-mock.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare class MockVapiClient {
2
+ assistants: {
3
+ list: jest.Mock<any, any, any>;
4
+ get: jest.Mock<any, any, any>;
5
+ create: jest.Mock<any, any, any>;
6
+ };
7
+ }
8
+ export declare const createMockVapiClient: () => MockVapiClient;
9
+ //# sourceMappingURL=vapi-client.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vapi-client.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/vapi-client.mock.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc;IACzB,UAAU;;;;MAuCR;CACH;AAED,eAAO,MAAM,oBAAoB,sBAEhC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { VapiClient } from '@vapi-ai/server-sdk';
2
+ export declare const createVapiClient: (token: string) => VapiClient;
3
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,KAAG,UAKhD,CAAC"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ declare function createMcpServer(): McpServer;
4
+ export { createMcpServer };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,iBAAS,eAAe,cAiBvB;AA8BD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,378 @@
1
+ import { z } from 'zod';
2
+ export declare const ModelProvider: {
3
+ readonly OpenAI: "openai";
4
+ readonly Anthropic: "anthropic";
5
+ readonly GoogleAI: "google";
6
+ };
7
+ export declare const OpenAIModels: {
8
+ readonly GPT4o: "gpt-4o";
9
+ readonly GPT4oMini: "gpt-4o-mini";
10
+ };
11
+ export declare const AnthropicModels: {
12
+ readonly Claude3Sonnet: "claude-3-7-sonnet-20250219";
13
+ readonly Claude3Haiku: "claude-3-5-haiku-20241022";
14
+ };
15
+ export declare const GoogleModels: {
16
+ readonly GeminiPro: "gemini-1.5-pro";
17
+ readonly GeminiFlash: "gemini-1.5-flash";
18
+ readonly Gemini2Flash: "gemini-2.0-flash";
19
+ readonly Gemini2Pro: "gemini-2.0-pro";
20
+ };
21
+ export type ModelProviderType = (typeof ModelProvider)[keyof typeof ModelProvider];
22
+ export type OpenAIModelType = (typeof OpenAIModels)[keyof typeof OpenAIModels];
23
+ export type AnthropicModelType = (typeof AnthropicModels)[keyof typeof AnthropicModels];
24
+ export type GoogleModelType = (typeof GoogleModels)[keyof typeof GoogleModels];
25
+ export declare const DEFAULT_LLM: {
26
+ provider: "openai";
27
+ model: "gpt-4o";
28
+ };
29
+ declare const VoiceProviderSchema: z.ZodEnum<["vapi", "11labs", "azure", "cartesia", "custom-voice", "deepgram", "11labs", "hume", "lmnt", "neuphonic", "openai", "playht", "rime-ai", "smallest-ai", "tavus", "sesame"]>;
30
+ export type VoiceProviderType = z.infer<typeof VoiceProviderSchema>;
31
+ export declare const DEFAULT_VOICE: {
32
+ provider: VoiceProviderType;
33
+ voiceId: string;
34
+ };
35
+ export declare const DEFAULT_TRANSCRIBER: {
36
+ provider: string;
37
+ model: string;
38
+ };
39
+ export declare const ElevenLabsVoiceIds: {
40
+ readonly Sarah: "sarah";
41
+ readonly Phillip: "phillip";
42
+ readonly Steve: "steve";
43
+ readonly Joseph: "joseph";
44
+ readonly Myra: "myra";
45
+ };
46
+ export declare const BaseResponseSchema: z.ZodObject<{
47
+ id: z.ZodString;
48
+ createdAt: z.ZodString;
49
+ updatedAt: z.ZodString;
50
+ }, "strip", z.ZodTypeAny, {
51
+ id: string;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ }, {
55
+ id: string;
56
+ createdAt: string;
57
+ updatedAt: string;
58
+ }>;
59
+ export declare const CreateAssistantInputSchema: z.ZodObject<{
60
+ name: z.ZodString;
61
+ instructions: z.ZodDefault<z.ZodOptional<z.ZodString>>;
62
+ llm: z.ZodDefault<z.ZodUnion<[z.ZodUnion<[z.ZodObject<{
63
+ provider: z.ZodLiteral<"openai">;
64
+ model: z.ZodEnum<["gpt-4o", "gpt-4o-mini"]>;
65
+ }, "strip", z.ZodTypeAny, {
66
+ provider: "openai";
67
+ model: "gpt-4o" | "gpt-4o-mini";
68
+ }, {
69
+ provider: "openai";
70
+ model: "gpt-4o" | "gpt-4o-mini";
71
+ }>, z.ZodObject<{
72
+ provider: z.ZodLiteral<"anthropic">;
73
+ model: z.ZodEnum<["claude-3-7-sonnet-20250219", "claude-3-5-haiku-20241022"]>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ provider: "anthropic";
76
+ model: "claude-3-7-sonnet-20250219" | "claude-3-5-haiku-20241022";
77
+ }, {
78
+ provider: "anthropic";
79
+ model: "claude-3-7-sonnet-20250219" | "claude-3-5-haiku-20241022";
80
+ }>, z.ZodObject<{
81
+ provider: z.ZodLiteral<"google">;
82
+ model: z.ZodEnum<["gemini-1.5-pro", "gemini-1.5-flash", "gemini-2.0-flash", "gemini-2.0-pro"]>;
83
+ }, "strip", z.ZodTypeAny, {
84
+ provider: "google";
85
+ model: "gemini-1.5-pro" | "gemini-1.5-flash" | "gemini-2.0-flash" | "gemini-2.0-pro";
86
+ }, {
87
+ provider: "google";
88
+ model: "gemini-1.5-pro" | "gemini-1.5-flash" | "gemini-2.0-flash" | "gemini-2.0-pro";
89
+ }>, z.ZodObject<{
90
+ provider: z.ZodString;
91
+ model: z.ZodString;
92
+ }, "strip", z.ZodTypeAny, {
93
+ provider: string;
94
+ model: string;
95
+ }, {
96
+ provider: string;
97
+ model: string;
98
+ }>]>, z.ZodEffects<z.ZodString, any, string>]>>;
99
+ transcriber: z.ZodDefault<z.ZodObject<{
100
+ provider: z.ZodString;
101
+ model: z.ZodString;
102
+ }, "strip", z.ZodTypeAny, {
103
+ provider: string;
104
+ model: string;
105
+ }, {
106
+ provider: string;
107
+ model: string;
108
+ }>>;
109
+ voice: z.ZodDefault<z.ZodObject<{
110
+ provider: z.ZodEnum<["vapi", "11labs", "azure", "cartesia", "custom-voice", "deepgram", "11labs", "hume", "lmnt", "neuphonic", "openai", "playht", "rime-ai", "smallest-ai", "tavus", "sesame"]>;
111
+ voiceId: z.ZodString;
112
+ model: z.ZodOptional<z.ZodString>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ provider: "openai" | "vapi" | "11labs" | "azure" | "cartesia" | "custom-voice" | "deepgram" | "hume" | "lmnt" | "neuphonic" | "playht" | "rime-ai" | "smallest-ai" | "tavus" | "sesame";
115
+ voiceId: string;
116
+ model?: string | undefined;
117
+ }, {
118
+ provider: "openai" | "vapi" | "11labs" | "azure" | "cartesia" | "custom-voice" | "deepgram" | "hume" | "lmnt" | "neuphonic" | "playht" | "rime-ai" | "smallest-ai" | "tavus" | "sesame";
119
+ voiceId: string;
120
+ model?: string | undefined;
121
+ }>>;
122
+ firstMessage: z.ZodDefault<z.ZodOptional<z.ZodString>>;
123
+ firstMessageMode: z.ZodOptional<z.ZodDefault<z.ZodEnum<["assistant-speaks-first", "assistant-waits-for-user", "assistant-speaks-first-with-model-generated-message"]>>>;
124
+ }, "strip", z.ZodTypeAny, {
125
+ name: string;
126
+ instructions: string;
127
+ transcriber: {
128
+ provider: string;
129
+ model: string;
130
+ };
131
+ voice: {
132
+ provider: "openai" | "vapi" | "11labs" | "azure" | "cartesia" | "custom-voice" | "deepgram" | "hume" | "lmnt" | "neuphonic" | "playht" | "rime-ai" | "smallest-ai" | "tavus" | "sesame";
133
+ voiceId: string;
134
+ model?: string | undefined;
135
+ };
136
+ firstMessage: string;
137
+ llm?: any;
138
+ firstMessageMode?: "assistant-speaks-first" | "assistant-waits-for-user" | "assistant-speaks-first-with-model-generated-message" | undefined;
139
+ }, {
140
+ name: string;
141
+ instructions?: string | undefined;
142
+ llm?: string | {
143
+ provider: "openai";
144
+ model: "gpt-4o" | "gpt-4o-mini";
145
+ } | {
146
+ provider: "anthropic";
147
+ model: "claude-3-7-sonnet-20250219" | "claude-3-5-haiku-20241022";
148
+ } | {
149
+ provider: "google";
150
+ model: "gemini-1.5-pro" | "gemini-1.5-flash" | "gemini-2.0-flash" | "gemini-2.0-pro";
151
+ } | {
152
+ provider: string;
153
+ model: string;
154
+ } | undefined;
155
+ transcriber?: {
156
+ provider: string;
157
+ model: string;
158
+ } | undefined;
159
+ voice?: {
160
+ provider: "openai" | "vapi" | "11labs" | "azure" | "cartesia" | "custom-voice" | "deepgram" | "hume" | "lmnt" | "neuphonic" | "playht" | "rime-ai" | "smallest-ai" | "tavus" | "sesame";
161
+ voiceId: string;
162
+ model?: string | undefined;
163
+ } | undefined;
164
+ firstMessage?: string | undefined;
165
+ firstMessageMode?: "assistant-speaks-first" | "assistant-waits-for-user" | "assistant-speaks-first-with-model-generated-message" | undefined;
166
+ }>;
167
+ export declare const AssistantOutputSchema: z.ZodObject<z.objectUtil.extendShape<{
168
+ id: z.ZodString;
169
+ createdAt: z.ZodString;
170
+ updatedAt: z.ZodString;
171
+ }, {
172
+ name: z.ZodString;
173
+ llm: z.ZodObject<{
174
+ provider: z.ZodString;
175
+ model: z.ZodString;
176
+ }, "strip", z.ZodTypeAny, {
177
+ provider: string;
178
+ model: string;
179
+ }, {
180
+ provider: string;
181
+ model: string;
182
+ }>;
183
+ voice: z.ZodObject<{
184
+ provider: z.ZodString;
185
+ voiceId: z.ZodString;
186
+ model: z.ZodOptional<z.ZodString>;
187
+ }, "strip", z.ZodTypeAny, {
188
+ provider: string;
189
+ voiceId: string;
190
+ model?: string | undefined;
191
+ }, {
192
+ provider: string;
193
+ voiceId: string;
194
+ model?: string | undefined;
195
+ }>;
196
+ transcriber: z.ZodObject<{
197
+ provider: z.ZodString;
198
+ model: z.ZodString;
199
+ }, "strip", z.ZodTypeAny, {
200
+ provider: string;
201
+ model: string;
202
+ }, {
203
+ provider: string;
204
+ model: string;
205
+ }>;
206
+ }>, "strip", z.ZodTypeAny, {
207
+ id: string;
208
+ createdAt: string;
209
+ updatedAt: string;
210
+ name: string;
211
+ llm: {
212
+ provider: string;
213
+ model: string;
214
+ };
215
+ transcriber: {
216
+ provider: string;
217
+ model: string;
218
+ };
219
+ voice: {
220
+ provider: string;
221
+ voiceId: string;
222
+ model?: string | undefined;
223
+ };
224
+ }, {
225
+ id: string;
226
+ createdAt: string;
227
+ updatedAt: string;
228
+ name: string;
229
+ llm: {
230
+ provider: string;
231
+ model: string;
232
+ };
233
+ transcriber: {
234
+ provider: string;
235
+ model: string;
236
+ };
237
+ voice: {
238
+ provider: string;
239
+ voiceId: string;
240
+ model?: string | undefined;
241
+ };
242
+ }>;
243
+ export declare const GetAssistantInputSchema: z.ZodObject<{
244
+ assistantId: z.ZodString;
245
+ }, "strip", z.ZodTypeAny, {
246
+ assistantId: string;
247
+ }, {
248
+ assistantId: string;
249
+ }>;
250
+ export declare const CallInputSchema: z.ZodObject<{
251
+ assistantId: z.ZodOptional<z.ZodString>;
252
+ phoneNumberId: z.ZodOptional<z.ZodString>;
253
+ customer: z.ZodOptional<z.ZodObject<{
254
+ phoneNumber: z.ZodString;
255
+ }, "strip", z.ZodTypeAny, {
256
+ phoneNumber: string;
257
+ }, {
258
+ phoneNumber: string;
259
+ }>>;
260
+ scheduledAt: z.ZodOptional<z.ZodString>;
261
+ }, "strip", z.ZodTypeAny, {
262
+ assistantId?: string | undefined;
263
+ phoneNumberId?: string | undefined;
264
+ customer?: {
265
+ phoneNumber: string;
266
+ } | undefined;
267
+ scheduledAt?: string | undefined;
268
+ }, {
269
+ assistantId?: string | undefined;
270
+ phoneNumberId?: string | undefined;
271
+ customer?: {
272
+ phoneNumber: string;
273
+ } | undefined;
274
+ scheduledAt?: string | undefined;
275
+ }>;
276
+ export declare const CallOutputSchema: z.ZodObject<z.objectUtil.extendShape<{
277
+ id: z.ZodString;
278
+ createdAt: z.ZodString;
279
+ updatedAt: z.ZodString;
280
+ }, {
281
+ status: z.ZodString;
282
+ endedReason: z.ZodOptional<z.ZodString>;
283
+ assistantId: z.ZodOptional<z.ZodString>;
284
+ phoneNumberId: z.ZodOptional<z.ZodString>;
285
+ customer: z.ZodOptional<z.ZodObject<{
286
+ phoneNumber: z.ZodString;
287
+ }, "strip", z.ZodTypeAny, {
288
+ phoneNumber: string;
289
+ }, {
290
+ phoneNumber: string;
291
+ }>>;
292
+ scheduledAt: z.ZodOptional<z.ZodString>;
293
+ }>, "strip", z.ZodTypeAny, {
294
+ status: string;
295
+ id: string;
296
+ createdAt: string;
297
+ updatedAt: string;
298
+ assistantId?: string | undefined;
299
+ phoneNumberId?: string | undefined;
300
+ customer?: {
301
+ phoneNumber: string;
302
+ } | undefined;
303
+ scheduledAt?: string | undefined;
304
+ endedReason?: string | undefined;
305
+ }, {
306
+ status: string;
307
+ id: string;
308
+ createdAt: string;
309
+ updatedAt: string;
310
+ assistantId?: string | undefined;
311
+ phoneNumberId?: string | undefined;
312
+ customer?: {
313
+ phoneNumber: string;
314
+ } | undefined;
315
+ scheduledAt?: string | undefined;
316
+ endedReason?: string | undefined;
317
+ }>;
318
+ export declare const GetCallInputSchema: z.ZodObject<{
319
+ callId: z.ZodString;
320
+ }, "strip", z.ZodTypeAny, {
321
+ callId: string;
322
+ }, {
323
+ callId: string;
324
+ }>;
325
+ export declare const PhoneNumberInputSchema: z.ZodObject<{
326
+ areaCode: z.ZodString;
327
+ }, "strip", z.ZodTypeAny, {
328
+ areaCode: string;
329
+ }, {
330
+ areaCode: string;
331
+ }>;
332
+ export declare const PhoneNumberOutputSchema: z.ZodObject<z.objectUtil.extendShape<{
333
+ id: z.ZodString;
334
+ createdAt: z.ZodString;
335
+ updatedAt: z.ZodString;
336
+ }, {
337
+ phoneNumber: z.ZodString;
338
+ status: z.ZodString;
339
+ capabilities: z.ZodOptional<z.ZodObject<{
340
+ sms: z.ZodOptional<z.ZodBoolean>;
341
+ voice: z.ZodOptional<z.ZodBoolean>;
342
+ }, "strip", z.ZodTypeAny, {
343
+ voice?: boolean | undefined;
344
+ sms?: boolean | undefined;
345
+ }, {
346
+ voice?: boolean | undefined;
347
+ sms?: boolean | undefined;
348
+ }>>;
349
+ }>, "strip", z.ZodTypeAny, {
350
+ status: string;
351
+ id: string;
352
+ createdAt: string;
353
+ updatedAt: string;
354
+ phoneNumber: string;
355
+ capabilities?: {
356
+ voice?: boolean | undefined;
357
+ sms?: boolean | undefined;
358
+ } | undefined;
359
+ }, {
360
+ status: string;
361
+ id: string;
362
+ createdAt: string;
363
+ updatedAt: string;
364
+ phoneNumber: string;
365
+ capabilities?: {
366
+ voice?: boolean | undefined;
367
+ sms?: boolean | undefined;
368
+ } | undefined;
369
+ }>;
370
+ export declare const GetPhoneNumberInputSchema: z.ZodObject<{
371
+ phoneNumberId: z.ZodString;
372
+ }, "strip", z.ZodTypeAny, {
373
+ phoneNumberId: string;
374
+ }, {
375
+ phoneNumberId: string;
376
+ }>;
377
+ export {};
378
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAEX,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,eAAO,MAAM,eAAe;;;CAGlB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC/E,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AACzD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAqC/E,eAAO,MAAM,WAAW;;;CAGvB,CAAC;AAEF,QAAA,MAAM,mBAAmB,wLAiBvB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpE,eAAO,MAAM,aAAa;cACF,iBAAiB;;CAExC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;CAMrB,CAAC;AAIX,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAIH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDrC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAehC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;EAElC,CAAC;AAIH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;EAmB1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;EAE7B,CAAC;AAIH,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;EAEpC,CAAC"}
@@ -179,6 +179,10 @@ export const CallInputSchema = z.object({
179
179
  })
180
180
  .optional()
181
181
  .describe('Customer information'),
182
+ scheduledAt: z
183
+ .string()
184
+ .optional()
185
+ .describe('ISO datetime string for when the call should be scheduled (e.g. "2025-03-25T22:39:27.771Z")'),
182
186
  });
183
187
  export const CallOutputSchema = BaseResponseSchema.extend({
184
188
  status: z.string(),
@@ -190,6 +194,7 @@ export const CallOutputSchema = BaseResponseSchema.extend({
190
194
  phoneNumber: z.string(),
191
195
  })
192
196
  .optional(),
197
+ scheduledAt: z.string().optional(),
193
198
  });
194
199
  export const GetCallInputSchema = z.object({
195
200
  callId: z.string().describe('ID of the call to get'),
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { VapiClient } from '@vapi-ai/server-sdk';
3
+ export declare const registerAssistantTools: (server: McpServer, vapiClient: VapiClient) => void;
4
+ //# sourceMappingURL=assistant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant.d.ts","sourceRoot":"","sources":["../../src/tools/assistant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAQ,MAAM,qBAAqB,CAAC;AAWvD,eAAO,MAAM,sBAAsB,GACjC,QAAQ,SAAS,EACjB,YAAY,UAAU,SA6CvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { VapiClient } from '@vapi-ai/server-sdk';
3
+ export declare const registerCallTools: (server: McpServer, vapiClient: VapiClient) => void;
4
+ //# sourceMappingURL=call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/tools/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAQ,MAAM,qBAAqB,CAAC;AASvD,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,SAAS,EACjB,YAAY,UAAU,SAgCvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { VapiClient } from '@vapi-ai/server-sdk';
3
+ export declare const registerAllTools: (server: McpServer, vapiClient: VapiClient) => void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD,eAAO,MAAM,gBAAgB,GAAI,QAAQ,SAAS,EAAE,YAAY,UAAU,SAIzE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { VapiClient } from '@vapi-ai/server-sdk';
3
+ export declare const registerPhoneNumberTools: (server: McpServer, vapiClient: VapiClient) => void;
4
+ //# sourceMappingURL=phone-number.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-number.d.ts","sourceRoot":"","sources":["../../src/tools/phone-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD,eAAO,MAAM,wBAAwB,GACnC,QAAQ,SAAS,EACjB,YAAY,UAAU,SAsBvB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export type ToolResponse = {
3
+ content: Array<{
4
+ type: 'text';
5
+ text: string;
6
+ }>;
7
+ };
8
+ export declare function createSuccessResponse(data: any): ToolResponse;
9
+ export declare function createErrorResponse(error: any): ToolResponse;
10
+ export declare function createToolHandler<T>(handler: (params: T) => Promise<any>): (params: T) => Promise<ToolResponse>;
11
+ export declare function createParamsSchema<T>(schema: z.ZodType<T>): any;
12
+ export declare function createIdParamSchema(paramName: string, description: string): any;
13
+ export declare const withErrorHandling: <T>(handler: () => Promise<T>) => Promise<ToolResponse>;
14
+ export declare const filterResponseWithSchema: <T>(data: any, schema: z.ZodType<T>) => T;
15
+ export declare const withSchemaFiltering: <T>(handler: () => Promise<any>, schema: z.ZodType<T>) => Promise<ToolResponse>;
16
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,GAAG,YAAY,CAS7D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,YAAY,CAU5D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,GACnC,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAStC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAO/D;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,GAAG,CAOL;AAED,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,SAAS,MAAM,OAAO,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,YAAY,CAItB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,EACxC,MAAM,GAAG,EACT,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KACnB,CAKF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,CAAC,EACnC,SAAS,MAAM,OAAO,CAAC,GAAG,CAAC,EAC3B,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KACnB,OAAO,CAAC,YAAY,CAOtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Vapi } from '@vapi-ai/server-sdk';
2
+ import { z } from 'zod';
3
+ import { CreateAssistantInputSchema, CallInputSchema, AssistantOutputSchema, CallOutputSchema, PhoneNumberOutputSchema } from '../schemas/index.js';
4
+ export declare function transformAssistantInput(input: z.infer<typeof CreateAssistantInputSchema>): Vapi.CreateAssistantDto;
5
+ export declare function transformAssistantOutput(assistant: Vapi.Assistant): z.infer<typeof AssistantOutputSchema>;
6
+ export declare function transformCallInput(input: z.infer<typeof CallInputSchema>): Vapi.CreateCallDto;
7
+ export declare function transformCallOutput(call: Vapi.Call): z.infer<typeof CallOutputSchema>;
8
+ export declare function transformPhoneNumberOutput(phoneNumber: any): z.infer<typeof PhoneNumberOutputSchema>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transformers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAI7B,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,GAChD,IAAI,CAAC,kBAAkB,CAuCzB;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,IAAI,CAAC,SAAS,GACxB,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAoBvC;AA2BD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,GACrC,IAAI,CAAC,aAAa,CAmBpB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,CAAC,IAAI,GACd,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAgBlC;AAID,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,GAAG,GACf,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAQzC"}
@@ -83,6 +83,13 @@ export function transformCallInput(input) {
83
83
  },
84
84
  }
85
85
  : {}),
86
+ ...(input.scheduledAt
87
+ ? {
88
+ schedulePlan: {
89
+ earliestAt: input.scheduledAt,
90
+ },
91
+ }
92
+ : {}),
86
93
  };
87
94
  }
88
95
  export function transformCallOutput(call) {
@@ -99,6 +106,7 @@ export function transformCallOutput(call) {
99
106
  phoneNumber: call.customer.number || '',
100
107
  }
101
108
  : undefined,
109
+ scheduledAt: call.schedulePlan?.earliestAt,
102
110
  };
103
111
  }
104
112
  // ===== Phone Number Transformers =====
@@ -0,0 +1,2 @@
1
+ export declare function parseToolResponse(response: any): any;
2
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CA6BpD"}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@vapi-ai/mcp-server",
3
3
  "description": "Vapi MCP Server",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
6
7
  "type": "module",
7
8
  "author": {
8
9
  "name": "Vapi AI",
@@ -15,13 +16,20 @@
15
16
  }
16
17
  ],
17
18
  "homepage": "https://github.com/VapiAI/mcp-server#readme",
19
+ "repository": "https://github.com/VapiAI/mcp-server",
18
20
  "bugs": {
19
21
  "url": "https://github.com/VapiAI/mcp-server/issues"
20
22
  },
21
- "keywords": ["vapi", "mcp", "model-context-protocol", "ai", "claude", "voice-api", "tool-calling"],
22
- "repository": "https://github.com/VapiAI/mcp-server",
23
+ "keywords": [
24
+ "vapi",
25
+ "mcp",
26
+ "model-context-protocol",
27
+ "ai",
28
+ "claude",
29
+ "voice-api",
30
+ "tool-calling"
31
+ ],
23
32
  "bin": {
24
- "vapi-mcp-server": "dist/index.js",
25
33
  "@vapi-ai/mcp-server": "dist/index.js"
26
34
  },
27
35
  "scripts": {
@@ -36,7 +44,9 @@
36
44
  "test:e2e": "NODE_OPTIONS=--experimental-vm-modules jest src/tests/mcp-server-e2e.test.ts"
37
45
  },
38
46
  "files": [
39
- "dist"
47
+ "dist",
48
+ "dist/**/*.d.ts",
49
+ "dist/**/*.d.ts.map"
40
50
  ],
41
51
  "dependencies": {
42
52
  "@modelcontextprotocol/sdk": "^1.9.0",