@talkspresso/mcp-server 1.0.0
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 +130 -0
- package/dist/client.d.ts +9 -0
- package/dist/client.js +61 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/tools/appointments.d.ts +3 -0
- package/dist/tools/appointments.js +95 -0
- package/dist/tools/clients.d.ts +3 -0
- package/dist/tools/clients.js +21 -0
- package/dist/tools/earnings.d.ts +3 -0
- package/dist/tools/earnings.js +13 -0
- package/dist/tools/profile.d.ts +3 -0
- package/dist/tools/profile.js +26 -0
- package/dist/tools/services.d.ts +3 -0
- package/dist/tools/services.js +35 -0
- package/package.json +30 -0
package/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# @talkspresso/mcp-server
|
|
2
|
+
|
|
3
|
+
Manage your Talkspresso business through Claude, ChatGPT, or any MCP-compatible AI assistant.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
This MCP server lets Talkspresso providers control their business through conversational AI. Check your schedule, manage bookings, update services, view earnings, and more without leaving your AI chat.
|
|
8
|
+
|
|
9
|
+
Perfect for creators, coaches, and consultants who want to manage their Talkspresso business hands-free.
|
|
10
|
+
|
|
11
|
+
## Quick setup
|
|
12
|
+
|
|
13
|
+
### 1. Get your API key
|
|
14
|
+
|
|
15
|
+
Go to [app.talkspresso.com/settings/api-keys](https://app.talkspresso.com/settings/api-keys) and generate a new API key.
|
|
16
|
+
|
|
17
|
+
### 2. Install the package
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g @talkspresso/mcp-server
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Or use it directly with npx (no install needed):
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx @talkspresso/mcp-server
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. Configure your AI assistant
|
|
30
|
+
|
|
31
|
+
#### For Claude Desktop
|
|
32
|
+
|
|
33
|
+
Add this to your Claude Desktop config file:
|
|
34
|
+
|
|
35
|
+
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
36
|
+
**Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"mcpServers": {
|
|
41
|
+
"talkspresso": {
|
|
42
|
+
"command": "npx",
|
|
43
|
+
"args": ["-y", "@talkspresso/mcp-server"],
|
|
44
|
+
"env": {
|
|
45
|
+
"TALKSPRESSO_API_KEY": "tsp_your_key_here"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Then restart Claude Desktop.
|
|
53
|
+
|
|
54
|
+
#### For Claude Code
|
|
55
|
+
|
|
56
|
+
Add this to your Claude Code settings (`.claude/settings.json` in your project):
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"talkspresso": {
|
|
62
|
+
"command": "npx",
|
|
63
|
+
"args": ["-y", "@talkspresso/mcp-server"],
|
|
64
|
+
"env": {
|
|
65
|
+
"TALKSPRESSO_API_KEY": "tsp_your_key_here"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Available tools
|
|
73
|
+
|
|
74
|
+
### Appointments
|
|
75
|
+
- **list-appointments** - View your upcoming or completed appointments with filters
|
|
76
|
+
- **get-appointment** - Get details about a specific appointment
|
|
77
|
+
- **get-pending-bookings** - See all bookings waiting for your approval
|
|
78
|
+
- **approve-appointment** - Approve a pending booking
|
|
79
|
+
- **decline-appointment** - Decline a booking with optional reason
|
|
80
|
+
|
|
81
|
+
### Clients
|
|
82
|
+
- **list-clients** - View all your clients with search
|
|
83
|
+
- **get-client** - Get client details and booking history
|
|
84
|
+
|
|
85
|
+
### Services
|
|
86
|
+
- **list-services** - View all your service offerings
|
|
87
|
+
- **create-service** - Create a new service (video call, workshop, webinar, etc.)
|
|
88
|
+
- **update-service** - Update pricing, description, or status
|
|
89
|
+
|
|
90
|
+
### Earnings
|
|
91
|
+
- **get-earnings** - View your transaction history and earnings
|
|
92
|
+
|
|
93
|
+
### Profile
|
|
94
|
+
- **get-profile** - View your profile information
|
|
95
|
+
- **update-profile** - Update your title, bio, categories, etc.
|
|
96
|
+
- **get-schedule** - Quick view of your next 50 appointments
|
|
97
|
+
|
|
98
|
+
## Environment variables
|
|
99
|
+
|
|
100
|
+
| Variable | Required | Default | Description |
|
|
101
|
+
|----------|----------|---------|-------------|
|
|
102
|
+
| `TALKSPRESSO_API_KEY` | Yes | - | Your API key from app.talkspresso.com |
|
|
103
|
+
| `TALKSPRESSO_API_URL` | No | `https://api.talkspresso.com` | API base URL (use for staging/testing) |
|
|
104
|
+
|
|
105
|
+
## Example conversations
|
|
106
|
+
|
|
107
|
+
"Show me my appointments for today"
|
|
108
|
+
"Who are my top clients?"
|
|
109
|
+
"Create a new 30-minute coaching call for $100"
|
|
110
|
+
"What are my total earnings this month?"
|
|
111
|
+
"Approve all pending bookings"
|
|
112
|
+
|
|
113
|
+
## Troubleshooting
|
|
114
|
+
|
|
115
|
+
**"TALKSPRESSO_API_KEY environment variable is required"**
|
|
116
|
+
You need to add your API key to the config file. Get one at [app.talkspresso.com/settings/api-keys](https://app.talkspresso.com/settings/api-keys).
|
|
117
|
+
|
|
118
|
+
**"API request failed"**
|
|
119
|
+
Check that your API key is valid and hasn't been revoked. You can generate a new one in your settings.
|
|
120
|
+
|
|
121
|
+
**Tools not showing up in Claude**
|
|
122
|
+
Restart Claude Desktop after adding the config. Make sure the JSON is valid (no trailing commas).
|
|
123
|
+
|
|
124
|
+
## Support
|
|
125
|
+
|
|
126
|
+
Questions? Email [support@talkspresso.com](mailto:support@talkspresso.com) or visit [help.talkspresso.com](https://help.talkspresso.com).
|
|
127
|
+
|
|
128
|
+
## License
|
|
129
|
+
|
|
130
|
+
MIT
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class TalkspressoClient {
|
|
2
|
+
private http;
|
|
3
|
+
constructor();
|
|
4
|
+
get<T = any>(path: string, params?: Record<string, any>): Promise<T>;
|
|
5
|
+
post<T = any>(path: string, data?: any): Promise<T>;
|
|
6
|
+
put<T = any>(path: string, data?: any): Promise<T>;
|
|
7
|
+
delete<T = any>(path: string): Promise<T>;
|
|
8
|
+
private formatError;
|
|
9
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
export class TalkspressoClient {
|
|
3
|
+
http;
|
|
4
|
+
constructor() {
|
|
5
|
+
const apiKey = process.env.TALKSPRESSO_API_KEY;
|
|
6
|
+
if (!apiKey) {
|
|
7
|
+
throw new Error('TALKSPRESSO_API_KEY environment variable is required. Generate one at https://app.talkspresso.com/settings/api-keys');
|
|
8
|
+
}
|
|
9
|
+
const baseURL = process.env.TALKSPRESSO_API_URL || 'https://api.talkspresso.com';
|
|
10
|
+
this.http = axios.create({
|
|
11
|
+
baseURL,
|
|
12
|
+
headers: {
|
|
13
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
},
|
|
16
|
+
timeout: 30000,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async get(path, params) {
|
|
20
|
+
try {
|
|
21
|
+
const response = await this.http.get(path, { params });
|
|
22
|
+
return response.data?.data ?? response.data;
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
throw this.formatError(err);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async post(path, data) {
|
|
29
|
+
try {
|
|
30
|
+
const response = await this.http.post(path, data);
|
|
31
|
+
return response.data?.data ?? response.data;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
throw this.formatError(err);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async put(path, data) {
|
|
38
|
+
try {
|
|
39
|
+
const response = await this.http.put(path, data);
|
|
40
|
+
return response.data?.data ?? response.data;
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw this.formatError(err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async delete(path) {
|
|
47
|
+
try {
|
|
48
|
+
const response = await this.http.delete(path);
|
|
49
|
+
return response.data?.data ?? response.data;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
throw this.formatError(err);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
formatError(err) {
|
|
56
|
+
const data = err.response?.data;
|
|
57
|
+
const status = err.response?.status;
|
|
58
|
+
const message = data?.error || err.message || 'API request failed';
|
|
59
|
+
return new Error(`Talkspresso API error (${status}): ${message}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { TalkspressoClient } from './client.js';
|
|
5
|
+
import { registerAppointmentTools } from './tools/appointments.js';
|
|
6
|
+
import { registerClientTools } from './tools/clients.js';
|
|
7
|
+
import { registerServiceTools } from './tools/services.js';
|
|
8
|
+
import { registerEarningsTools } from './tools/earnings.js';
|
|
9
|
+
import { registerProfileTools } from './tools/profile.js';
|
|
10
|
+
const server = new McpServer({
|
|
11
|
+
name: 'talkspresso',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
});
|
|
14
|
+
const apiClient = new TalkspressoClient();
|
|
15
|
+
registerAppointmentTools(server, apiClient);
|
|
16
|
+
registerClientTools(server, apiClient);
|
|
17
|
+
registerServiceTools(server, apiClient);
|
|
18
|
+
registerEarningsTools(server, apiClient);
|
|
19
|
+
registerProfileTools(server, apiClient);
|
|
20
|
+
const transport = new StdioServerTransport();
|
|
21
|
+
await server.connect(transport);
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerAppointmentTools(server, client) {
|
|
3
|
+
server.tool('list-appointments', 'Get your appointments with optional filters. Returns upcoming appointments by default.', {
|
|
4
|
+
status: z.enum(['upcoming', 'completed', 'all']).optional().describe('Filter by appointment status (default: upcoming)'),
|
|
5
|
+
page: z.number().optional().describe('Page number for pagination'),
|
|
6
|
+
limit: z.number().optional().describe('Number of results per page'),
|
|
7
|
+
}, async (params) => {
|
|
8
|
+
const data = await client.get('/appointments/me', params);
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
server.tool('get-appointment', 'Get detailed information about a specific appointment', {
|
|
14
|
+
id: z.string().describe('The appointment ID'),
|
|
15
|
+
}, async (params) => {
|
|
16
|
+
const data = await client.get(`/appointments/${params.id}`);
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
server.tool('get-pending-bookings', 'Get all pending bookings that need your approval', {}, async () => {
|
|
22
|
+
const data = await client.get('/appointments/pending');
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
server.tool('approve-appointment', 'Approve a pending booking request', {
|
|
28
|
+
id: z.string().describe('The appointment ID to approve'),
|
|
29
|
+
}, async (params) => {
|
|
30
|
+
const data = await client.post(`/appointments/${params.id}/approve`);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
server.tool('decline-appointment', 'Decline a pending booking request', {
|
|
36
|
+
id: z.string().describe('The appointment ID to decline'),
|
|
37
|
+
decline_reason: z.string().optional().describe('Optional reason for declining'),
|
|
38
|
+
}, async (params) => {
|
|
39
|
+
const data = await client.post(`/appointments/${params.id}/decline`, {
|
|
40
|
+
decline_reason: params.decline_reason,
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
server.tool('create-appointment', 'Create an appointment and send an invitation to the client. Use list-clients first to find the client by name if needed. Use list-services to find a service_id if linking to a specific service.', {
|
|
47
|
+
client_name: z.string().describe('Client full name'),
|
|
48
|
+
client_email: z.string().optional().describe('Client email address (invitation sent here)'),
|
|
49
|
+
scheduled_date: z.string().describe('Date in YYYY-MM-DD format'),
|
|
50
|
+
scheduled_time: z.string().describe('Time in HH:mm format (24-hour, provider timezone)'),
|
|
51
|
+
service_id: z.string().optional().describe('Service ID to use (determines duration and price). Use list-services to find this.'),
|
|
52
|
+
duration: z.number().optional().describe('Duration in minutes (required if no service_id, default 30)'),
|
|
53
|
+
custom_title: z.string().optional().describe('Custom session title (overrides service title)'),
|
|
54
|
+
custom_price: z.number().optional().describe('Price in dollars (required if no service_id and not complimentary)'),
|
|
55
|
+
is_complimentary: z.boolean().optional().describe('If true, session is free (default: true)'),
|
|
56
|
+
invitation_message: z.string().optional().describe('Personal message included in the invitation email'),
|
|
57
|
+
}, async (params) => {
|
|
58
|
+
const data = await client.post('/appointments/invite', {
|
|
59
|
+
client_name: params.client_name,
|
|
60
|
+
client_email: params.client_email,
|
|
61
|
+
service_id: params.service_id,
|
|
62
|
+
scheduled_date: params.scheduled_date,
|
|
63
|
+
scheduled_time: params.scheduled_time,
|
|
64
|
+
duration: params.duration,
|
|
65
|
+
custom_title: params.custom_title,
|
|
66
|
+
custom_price: params.custom_price,
|
|
67
|
+
is_complimentary: params.is_complimentary ?? true,
|
|
68
|
+
invitation_message: params.invitation_message,
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
server.tool('cancel-appointment', 'Cancel an appointment', {
|
|
75
|
+
id: z.string().describe('The appointment ID to cancel'),
|
|
76
|
+
}, async (params) => {
|
|
77
|
+
const data = await client.post(`/appointments/${params.id}/cancel`);
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
server.tool('reschedule-appointment', 'Reschedule an appointment to a new date and time', {
|
|
83
|
+
id: z.string().describe('The appointment ID to reschedule'),
|
|
84
|
+
start_time: z.string().describe('New start time as ISO 8601 string (e.g. 2026-02-20T10:00:00-06:00)'),
|
|
85
|
+
end_time: z.string().describe('New end time as ISO 8601 string (e.g. 2026-02-20T11:00:00-06:00)'),
|
|
86
|
+
}, async (params) => {
|
|
87
|
+
const data = await client.post(`/appointments/${params.id}/reschedule`, {
|
|
88
|
+
start_time: params.start_time,
|
|
89
|
+
end_time: params.end_time,
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerClientTools(server, client) {
|
|
3
|
+
server.tool('list-clients', 'Get your list of clients with optional search', {
|
|
4
|
+
search: z.string().optional().describe('Search clients by name or email'),
|
|
5
|
+
page: z.number().optional().describe('Page number for pagination'),
|
|
6
|
+
limit: z.number().optional().describe('Number of results per page'),
|
|
7
|
+
}, async (params) => {
|
|
8
|
+
const data = await client.get('/client/my', params);
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
server.tool('get-client', 'Get detailed information about a client including their booking history', {
|
|
14
|
+
id: z.string().describe('The client ID'),
|
|
15
|
+
}, async (params) => {
|
|
16
|
+
const data = await client.get(`/client/${params.id}/appointments`);
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerEarningsTools(server, client) {
|
|
3
|
+
server.tool('get-earnings', 'Get your earnings and transaction history', {
|
|
4
|
+
transaction_type: z.string().optional().describe('Filter by transaction type (e.g., payment, refund)'),
|
|
5
|
+
page: z.number().optional().describe('Page number for pagination'),
|
|
6
|
+
limit: z.number().optional().describe('Number of results per page'),
|
|
7
|
+
}, async (params) => {
|
|
8
|
+
const data = await client.get('/transaction/my', params);
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerProfileTools(server, client) {
|
|
3
|
+
server.tool('get-profile', 'Get your Talkspresso profile information', {}, async () => {
|
|
4
|
+
const data = await client.get('/profile/me');
|
|
5
|
+
return {
|
|
6
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
7
|
+
};
|
|
8
|
+
});
|
|
9
|
+
server.tool('update-profile', 'Update your Talkspresso profile', {
|
|
10
|
+
expert_title: z.string().optional().describe('Your professional title (e.g., "Executive Coach")'),
|
|
11
|
+
about: z.string().optional().describe('Short about text'),
|
|
12
|
+
bio: z.string().optional().describe('Full bio'),
|
|
13
|
+
categories: z.array(z.string()).optional().describe('Array of category strings (e.g., ["coaching", "consulting"])'),
|
|
14
|
+
}, async (params) => {
|
|
15
|
+
const data = await client.put('/profile', params);
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
server.tool('get-schedule', 'Get your upcoming schedule (next 50 appointments)', {}, async () => {
|
|
21
|
+
const data = await client.get('/appointments/me', { status: 'upcoming', limit: 50 });
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerServiceTools(server, client) {
|
|
3
|
+
server.tool('list-services', 'Get all your services (video calls, workshops, etc.)', {}, async () => {
|
|
4
|
+
const data = await client.get('/service/me');
|
|
5
|
+
return {
|
|
6
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
7
|
+
};
|
|
8
|
+
});
|
|
9
|
+
server.tool('create-service', 'Create a new service offering', {
|
|
10
|
+
title: z.string().describe('Service title'),
|
|
11
|
+
description: z.string().describe('Service description'),
|
|
12
|
+
price: z.number().describe('Price in dollars (e.g., 100 for $100)'),
|
|
13
|
+
duration: z.number().describe('Duration in minutes'),
|
|
14
|
+
type: z.enum(['video_call', 'group_session', 'workshop', 'webinar']).describe('Type of service'),
|
|
15
|
+
}, async (params) => {
|
|
16
|
+
const data = await client.post('/service', params);
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
server.tool('update-service', 'Update an existing service', {
|
|
22
|
+
id: z.string().describe('Service ID to update'),
|
|
23
|
+
title: z.string().optional().describe('New title'),
|
|
24
|
+
description: z.string().optional().describe('New description'),
|
|
25
|
+
price: z.number().optional().describe('New price in dollars'),
|
|
26
|
+
duration: z.number().optional().describe('New duration in minutes'),
|
|
27
|
+
status: z.enum(['active', 'inactive']).optional().describe('Service status'),
|
|
28
|
+
}, async (params) => {
|
|
29
|
+
const { id, ...updateData } = params;
|
|
30
|
+
const data = await client.put(`/service/${id}`, updateData);
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@talkspresso/mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Manage your Talkspresso business through Claude, ChatGPT, or any MCP-compatible AI",
|
|
5
|
+
"bin": {
|
|
6
|
+
"talkspresso-mcp": "./dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": ["mcp", "talkspresso", "ai", "claude", "chatgpt"],
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
19
|
+
"axios": "^1.7.0",
|
|
20
|
+
"zod": "^3.23.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"typescript": "^5.5.0",
|
|
24
|
+
"tsx": "^4.0.0",
|
|
25
|
+
"@types/node": "^22.0.0"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist/**/*"
|
|
29
|
+
]
|
|
30
|
+
}
|