makeslates-mcp-server 0.1.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 +151 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# MakeSlates MCP Server
|
|
2
|
+
|
|
3
|
+
AI-powered slide deck creation for Cursor, Claude Code, and other MCP clients.
|
|
4
|
+
|
|
5
|
+
Create beautiful presentations with natural language - just describe what you want, and the AI builds it for you.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
### 1. Get Your API Key
|
|
10
|
+
|
|
11
|
+
1. Go to [makeslates.com/settings](https://makeslates.com/settings)
|
|
12
|
+
2. Sign in and generate an API key
|
|
13
|
+
3. Copy your `sk_live_...` key
|
|
14
|
+
|
|
15
|
+
### 2. Configure Your MCP Client
|
|
16
|
+
|
|
17
|
+
#### For Cursor
|
|
18
|
+
|
|
19
|
+
Add to your Cursor MCP settings (`~/.cursor/mcp.json`):
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"makeslates": {
|
|
25
|
+
"command": "npx",
|
|
26
|
+
"args": ["-y", "makeslates-mcp-server"],
|
|
27
|
+
"env": {
|
|
28
|
+
"MAKESLATES_API_KEY": "sk_live_your_key_here"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
#### For Claude Code
|
|
36
|
+
|
|
37
|
+
Add to `~/.claude/claude_desktop_config.json`:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"makeslates": {
|
|
43
|
+
"command": "npx",
|
|
44
|
+
"args": ["-y", "makeslates-mcp-server"],
|
|
45
|
+
"env": {
|
|
46
|
+
"MAKESLATES_API_KEY": "sk_live_your_key_here"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### For Claude Desktop
|
|
54
|
+
|
|
55
|
+
Add to your Claude Desktop config:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"mcpServers": {
|
|
60
|
+
"makeslates": {
|
|
61
|
+
"command": "npx",
|
|
62
|
+
"args": ["-y", "makeslates-mcp-server"],
|
|
63
|
+
"env": {
|
|
64
|
+
"MAKESLATES_API_KEY": "sk_live_your_key_here"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 3. Start Creating!
|
|
72
|
+
|
|
73
|
+
Once configured, you can ask your AI assistant things like:
|
|
74
|
+
|
|
75
|
+
- "Create a pitch deck for my AI startup"
|
|
76
|
+
- "Make a presentation about Q4 results with charts"
|
|
77
|
+
- "Build slides explaining our new product features"
|
|
78
|
+
|
|
79
|
+
## Available Tools
|
|
80
|
+
|
|
81
|
+
| Tool | Description |
|
|
82
|
+
|------|-------------|
|
|
83
|
+
| `list_templates` | List all slide templates (call this first!) |
|
|
84
|
+
| `create_presentation_with_slides` | Create a full presentation in one call |
|
|
85
|
+
| `list_presentations` | List your presentations |
|
|
86
|
+
| `get_presentation` | Get a presentation with all slides |
|
|
87
|
+
| `add_slide_from_template` | Add a slide using a template |
|
|
88
|
+
| `update_slide` | Update slide content |
|
|
89
|
+
| `delete_slide` | Remove a slide |
|
|
90
|
+
| `get_upload_url` | Get URL for image uploads |
|
|
91
|
+
|
|
92
|
+
## Slide Templates
|
|
93
|
+
|
|
94
|
+
### Opening Slides
|
|
95
|
+
- `image-full` - Full-bleed image with title (best for first slide)
|
|
96
|
+
- `title` - Title and subtitle
|
|
97
|
+
- `section` - Section divider
|
|
98
|
+
|
|
99
|
+
### Content Slides
|
|
100
|
+
- `title-content` - Header with bullet points
|
|
101
|
+
- `two-column` - Side-by-side comparison
|
|
102
|
+
- `three-column` - Three parallel points
|
|
103
|
+
- `image-left` / `image-right` - Image with text
|
|
104
|
+
|
|
105
|
+
### Impact Slides
|
|
106
|
+
- `big-number` - Single impressive metric
|
|
107
|
+
- `quote` - Featured quotation
|
|
108
|
+
- `statement` - Bold claim with visual
|
|
109
|
+
|
|
110
|
+
### Data Slides
|
|
111
|
+
- `chart-bar` - Bar chart
|
|
112
|
+
- `chart-pie` - Pie chart
|
|
113
|
+
- `chart-line` - Line chart
|
|
114
|
+
|
|
115
|
+
## Example Usage
|
|
116
|
+
|
|
117
|
+
```javascript
|
|
118
|
+
// The AI will call these tools for you based on natural language
|
|
119
|
+
|
|
120
|
+
// 1. List available templates
|
|
121
|
+
list_templates()
|
|
122
|
+
|
|
123
|
+
// 2. Create a presentation
|
|
124
|
+
create_presentation_with_slides({
|
|
125
|
+
title: "Q4 Results",
|
|
126
|
+
darkMode: true,
|
|
127
|
+
slides: [
|
|
128
|
+
{ template: "image-full", title: "Q4 2024 Results" },
|
|
129
|
+
{ template: "big-number", number: "+34%", label: "Revenue Growth" },
|
|
130
|
+
{ template: "chart-bar", title: "Revenue by Region", data: [...] },
|
|
131
|
+
{ template: "two-column", title: "Key Wins", leftContent: "...", rightContent: "..." }
|
|
132
|
+
]
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Environment Variables
|
|
137
|
+
|
|
138
|
+
| Variable | Description | Required |
|
|
139
|
+
|----------|-------------|----------|
|
|
140
|
+
| `MAKESLATES_API_KEY` | Your API key from makeslates.com | Yes |
|
|
141
|
+
| `MAKESLATES_API_URL` | Custom API URL (default: https://makeslates.com/api/mcp) | No |
|
|
142
|
+
|
|
143
|
+
## Links
|
|
144
|
+
|
|
145
|
+
- **Website**: [makeslates.com](https://makeslates.com)
|
|
146
|
+
- **Documentation**: [makeslates.com/docs](https://makeslates.com/docs)
|
|
147
|
+
- **Issues**: [GitHub Issues](https://github.com/offscriptpontus/makeslates-mcp-server/issues)
|
|
148
|
+
|
|
149
|
+
## License
|
|
150
|
+
|
|
151
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MakeSlates MCP Server
|
|
4
|
+
*
|
|
5
|
+
* A stdio-based MCP server that bridges to the MakeSlates HTTP API.
|
|
6
|
+
* This allows Cursor, Claude Code, and other MCP clients to interact
|
|
7
|
+
* with MakeSlates presentations.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* MAKESLATES_API_KEY=sk_live_xxx npx @makeslates/mcp-server
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MakeSlates MCP Server
|
|
4
|
+
*
|
|
5
|
+
* A stdio-based MCP server that bridges to the MakeSlates HTTP API.
|
|
6
|
+
* This allows Cursor, Claude Code, and other MCP clients to interact
|
|
7
|
+
* with MakeSlates presentations.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* MAKESLATES_API_KEY=sk_live_xxx npx @makeslates/mcp-server
|
|
11
|
+
*/
|
|
12
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
13
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
14
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Configuration
|
|
17
|
+
// ============================================================================
|
|
18
|
+
const API_URL = process.env.MAKESLATES_API_URL || "https://makeslates.com/api/mcp";
|
|
19
|
+
const API_KEY = process.env.MAKESLATES_API_KEY;
|
|
20
|
+
const SERVER_INFO = {
|
|
21
|
+
name: "makeslates-mcp",
|
|
22
|
+
version: "0.1.0",
|
|
23
|
+
};
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Tool Definitions (matches the HTTP API)
|
|
26
|
+
// ============================================================================
|
|
27
|
+
const TOOLS = [
|
|
28
|
+
{
|
|
29
|
+
name: "list_workspaces",
|
|
30
|
+
description: "List workspaces the user is a member of. Returns workspace id, name, slug, and role.",
|
|
31
|
+
inputSchema: {
|
|
32
|
+
type: "object",
|
|
33
|
+
properties: {},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "list_presentations",
|
|
38
|
+
description: "List presentations. Use workspaceId to filter by workspace, or omit for personal presentations.",
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: "object",
|
|
41
|
+
properties: {
|
|
42
|
+
workspaceId: { type: "string", description: "Workspace ID to filter by (omit for personal presentations)" },
|
|
43
|
+
limit: { type: "number", description: "Maximum number of presentations to return" },
|
|
44
|
+
search: { type: "string", description: "Search term to filter presentations by title" },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "get_presentation",
|
|
50
|
+
description: "Get a presentation by ID with all its slides and content",
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
id: { type: "string", description: "The presentation ID" },
|
|
55
|
+
},
|
|
56
|
+
required: ["id"],
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "create_presentation",
|
|
61
|
+
description: "Create a new empty presentation. Use create_presentation_with_slides for efficiency.",
|
|
62
|
+
inputSchema: {
|
|
63
|
+
type: "object",
|
|
64
|
+
properties: {
|
|
65
|
+
title: { type: "string", description: "Title of the presentation" },
|
|
66
|
+
workspaceId: { type: "string", description: "Workspace ID to create in (omit for personal)" },
|
|
67
|
+
darkMode: { type: "boolean", description: "Set to true for dark theme, false for light theme" },
|
|
68
|
+
},
|
|
69
|
+
required: ["title"],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "create_presentation_with_slides",
|
|
74
|
+
description: `Create a presentation with slides in one call.
|
|
75
|
+
|
|
76
|
+
Each slide needs a template ID and content fields. Use list_templates to see all templates and their contentFields.
|
|
77
|
+
|
|
78
|
+
Content fields map to element roles - pass them directly: { template: "big-number", number: "42%", label: "Growth" }`,
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: "object",
|
|
81
|
+
properties: {
|
|
82
|
+
title: { type: "string", description: "Title of the presentation" },
|
|
83
|
+
workspaceId: { type: "string", description: "Workspace ID to create in (omit for personal)" },
|
|
84
|
+
darkMode: { type: "boolean", description: "Set to true for dark theme" },
|
|
85
|
+
slides: {
|
|
86
|
+
type: "array",
|
|
87
|
+
items: {
|
|
88
|
+
type: "object",
|
|
89
|
+
properties: {
|
|
90
|
+
template: { type: "string", description: "Template ID" },
|
|
91
|
+
},
|
|
92
|
+
required: ["template"],
|
|
93
|
+
},
|
|
94
|
+
description: "Array of slides with template and content",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
required: ["title", "slides"],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: "update_presentation",
|
|
102
|
+
description: "Update a presentation's metadata. Use update_slide for slide content.",
|
|
103
|
+
inputSchema: {
|
|
104
|
+
type: "object",
|
|
105
|
+
properties: {
|
|
106
|
+
id: { type: "string", description: "The presentation ID" },
|
|
107
|
+
title: { type: "string", description: "New title" },
|
|
108
|
+
darkMode: { type: "boolean", description: "Set to true for dark theme, false for light theme" },
|
|
109
|
+
},
|
|
110
|
+
required: ["id"],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "delete_presentation",
|
|
115
|
+
description: "Soft-delete a presentation",
|
|
116
|
+
inputSchema: {
|
|
117
|
+
type: "object",
|
|
118
|
+
properties: {
|
|
119
|
+
id: { type: "string", description: "The presentation ID to delete" },
|
|
120
|
+
},
|
|
121
|
+
required: ["id"],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "move_presentation",
|
|
126
|
+
description: "Move a presentation to a different workspace, or to personal (no workspace). Only the presentation creator can move it.",
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: {
|
|
130
|
+
id: { type: "string", description: "The presentation ID to move" },
|
|
131
|
+
workspaceId: { type: "string", description: "Target workspace ID, or omit/null to move to personal" },
|
|
132
|
+
},
|
|
133
|
+
required: ["id"],
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "add_slide_from_template",
|
|
138
|
+
description: `THE ONLY WAY TO ADD SLIDES - Uses pre-designed templates.
|
|
139
|
+
|
|
140
|
+
ALWAYS use this tool. NEVER use add_slide.
|
|
141
|
+
Templates: title, section, image-full, two-column, quote, big-number, chart-bar, etc.
|
|
142
|
+
|
|
143
|
+
1. Call list_templates first
|
|
144
|
+
2. Pick the best template
|
|
145
|
+
3. Use this tool to add the slide
|
|
146
|
+
4. Use update_slide only to change text content`,
|
|
147
|
+
inputSchema: {
|
|
148
|
+
type: "object",
|
|
149
|
+
properties: {
|
|
150
|
+
presentationId: { type: "string", description: "The presentation ID" },
|
|
151
|
+
template: {
|
|
152
|
+
type: "string",
|
|
153
|
+
description: 'Template ID from list_templates (e.g. "title", "image-full", "two-column")',
|
|
154
|
+
},
|
|
155
|
+
position: { type: "number", description: "Position to insert (0-indexed). Omit to append." },
|
|
156
|
+
},
|
|
157
|
+
required: ["presentationId", "template"],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: "update_slide",
|
|
162
|
+
description: `Update a slide's content. Replaces elements array entirely.
|
|
163
|
+
|
|
164
|
+
Design rules:
|
|
165
|
+
- backgroundColor: ALWAYS "default"
|
|
166
|
+
- font: ALWAYS "default"
|
|
167
|
+
- Text color: ALWAYS "default"`,
|
|
168
|
+
inputSchema: {
|
|
169
|
+
type: "object",
|
|
170
|
+
properties: {
|
|
171
|
+
presentationId: { type: "string", description: "The presentation ID" },
|
|
172
|
+
slideIndex: { type: "number", description: "Index of the slide to update (0-indexed)" },
|
|
173
|
+
backgroundColor: { type: "string", description: 'ALWAYS "default"' },
|
|
174
|
+
elements: {
|
|
175
|
+
type: "array",
|
|
176
|
+
description: "Array of elements. Each MUST have id, type, and position {x,y,width,height}",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
required: ["presentationId", "slideIndex"],
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "delete_slide",
|
|
184
|
+
description: "Delete a slide from a presentation",
|
|
185
|
+
inputSchema: {
|
|
186
|
+
type: "object",
|
|
187
|
+
properties: {
|
|
188
|
+
presentationId: { type: "string", description: "The presentation ID" },
|
|
189
|
+
slideIndex: { type: "number", description: "Index of the slide to delete (0-indexed)" },
|
|
190
|
+
},
|
|
191
|
+
required: ["presentationId", "slideIndex"],
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "list_templates",
|
|
196
|
+
description: `MANDATORY FIRST STEP - List all available slide templates.
|
|
197
|
+
|
|
198
|
+
YOU MUST call this before adding any slides. Templates are the ONLY way to create good-looking slides.
|
|
199
|
+
Each template has perfect spacing, typography, and layout built-in.`,
|
|
200
|
+
inputSchema: {
|
|
201
|
+
type: "object",
|
|
202
|
+
properties: {},
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "get_schema",
|
|
207
|
+
description: "Get schema reference. Usually not needed - just use templates.",
|
|
208
|
+
inputSchema: {
|
|
209
|
+
type: "object",
|
|
210
|
+
properties: {},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: "get_upload_url",
|
|
215
|
+
description: `Get a presigned URL for fast direct image uploads.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
- uploadUrl: POST your image file here directly
|
|
219
|
+
- publicUrl: Use this URL in your slides after upload
|
|
220
|
+
|
|
221
|
+
This is MUCH faster than base64 encoding. Upload directly to storage.`,
|
|
222
|
+
inputSchema: {
|
|
223
|
+
type: "object",
|
|
224
|
+
properties: {
|
|
225
|
+
filename: { type: "string", description: 'Image filename (e.g. "hero.jpg", "chart.png")' },
|
|
226
|
+
contentType: { type: "string", description: 'MIME type (e.g. "image/jpeg", "image/png"). Defaults to image/jpeg' },
|
|
227
|
+
},
|
|
228
|
+
required: ["filename"],
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
async function callHttpApi(method, params) {
|
|
233
|
+
if (!API_KEY) {
|
|
234
|
+
return {
|
|
235
|
+
jsonrpc: "2.0",
|
|
236
|
+
id: null,
|
|
237
|
+
error: {
|
|
238
|
+
code: -32000,
|
|
239
|
+
message: "MAKESLATES_API_KEY environment variable is not set. Get your API key at https://makeslates.com/settings",
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const request = {
|
|
244
|
+
jsonrpc: "2.0",
|
|
245
|
+
id: Date.now(),
|
|
246
|
+
method,
|
|
247
|
+
params,
|
|
248
|
+
};
|
|
249
|
+
try {
|
|
250
|
+
const response = await fetch(API_URL, {
|
|
251
|
+
method: "POST",
|
|
252
|
+
headers: {
|
|
253
|
+
"Content-Type": "application/json",
|
|
254
|
+
Authorization: `Bearer ${API_KEY}`,
|
|
255
|
+
},
|
|
256
|
+
body: JSON.stringify(request),
|
|
257
|
+
});
|
|
258
|
+
if (!response.ok) {
|
|
259
|
+
const text = await response.text();
|
|
260
|
+
return {
|
|
261
|
+
jsonrpc: "2.0",
|
|
262
|
+
id: request.id,
|
|
263
|
+
error: {
|
|
264
|
+
code: -32000,
|
|
265
|
+
message: `HTTP ${response.status}: ${text}`,
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
return (await response.json());
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
return {
|
|
273
|
+
jsonrpc: "2.0",
|
|
274
|
+
id: request.id,
|
|
275
|
+
error: {
|
|
276
|
+
code: -32000,
|
|
277
|
+
message: `Network error: ${error instanceof Error ? error.message : String(error)}`,
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// ============================================================================
|
|
283
|
+
// MCP Server
|
|
284
|
+
// ============================================================================
|
|
285
|
+
async function main() {
|
|
286
|
+
// Check for API key early
|
|
287
|
+
if (!API_KEY) {
|
|
288
|
+
console.error("Error: MAKESLATES_API_KEY environment variable is required.");
|
|
289
|
+
console.error("");
|
|
290
|
+
console.error("To get an API key:");
|
|
291
|
+
console.error(" 1. Go to https://makeslates.com/settings");
|
|
292
|
+
console.error(" 2. Generate an API key");
|
|
293
|
+
console.error(" 3. Set it in your environment or MCP config");
|
|
294
|
+
console.error("");
|
|
295
|
+
console.error("Example:");
|
|
296
|
+
console.error(' MAKESLATES_API_KEY=sk_live_xxx npx @makeslates/mcp-server');
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
const server = new Server(SERVER_INFO, {
|
|
300
|
+
capabilities: {
|
|
301
|
+
tools: {},
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
// Handle tools/list
|
|
305
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
306
|
+
return { tools: TOOLS };
|
|
307
|
+
});
|
|
308
|
+
// Handle tools/call
|
|
309
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
310
|
+
const { name, arguments: args } = request.params;
|
|
311
|
+
// Forward to HTTP API
|
|
312
|
+
const response = await callHttpApi("tools/call", {
|
|
313
|
+
name,
|
|
314
|
+
arguments: args,
|
|
315
|
+
});
|
|
316
|
+
if (response.error) {
|
|
317
|
+
return {
|
|
318
|
+
content: [
|
|
319
|
+
{
|
|
320
|
+
type: "text",
|
|
321
|
+
text: `Error: ${response.error.message}`,
|
|
322
|
+
},
|
|
323
|
+
],
|
|
324
|
+
isError: true,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// The HTTP API returns { content: [{ type: "text", text: "..." }] }
|
|
328
|
+
const result = response.result;
|
|
329
|
+
return {
|
|
330
|
+
content: result?.content || [{ type: "text", text: JSON.stringify(result) }],
|
|
331
|
+
isError: result?.isError,
|
|
332
|
+
};
|
|
333
|
+
});
|
|
334
|
+
// Connect via stdio
|
|
335
|
+
const transport = new StdioServerTransport();
|
|
336
|
+
await server.connect(transport);
|
|
337
|
+
// Log to stderr (stdio is used for MCP communication)
|
|
338
|
+
console.error(`MakeSlates MCP server started (API: ${API_URL})`);
|
|
339
|
+
}
|
|
340
|
+
main().catch((error) => {
|
|
341
|
+
console.error("Fatal error:", error);
|
|
342
|
+
process.exit(1);
|
|
343
|
+
});
|
|
344
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "makeslates-mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for MakeSlates - AI-powered slide deck creation",
|
|
5
|
+
"author": "MakeSlates",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"bin": {
|
|
10
|
+
"makeslates-mcp": "dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"prepare": "npm run build",
|
|
19
|
+
"start": "node dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.25.2"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^20.0.0",
|
|
26
|
+
"typescript": "^5.0.0"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"model-context-protocol",
|
|
34
|
+
"cursor",
|
|
35
|
+
"claude",
|
|
36
|
+
"ai",
|
|
37
|
+
"slides",
|
|
38
|
+
"presentations",
|
|
39
|
+
"makeslates"
|
|
40
|
+
],
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/offscriptpontus/makeslates-mcp-server.git"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://makeslates.com",
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/offscriptpontus/makeslates-mcp-server/issues"
|
|
48
|
+
}
|
|
49
|
+
}
|