@prampta/sdk 0.1.1 → 0.3.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 +284 -0
- package/dist/client.d.ts +44 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +181 -73
- package/dist/client.js.map +1 -1
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +273 -0
- package/dist/mcp.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +34 -7
package/README.md
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# @prampta/sdk
|
|
2
|
+
|
|
3
|
+
Official Node.js SDK for the PRAMPTA API — create, search, and manage AI prompts with automatic retry logic and TypeScript support.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **TypeScript-first** with full type definitions
|
|
8
|
+
- **Automatic retries** with exponential backoff
|
|
9
|
+
- **Request cancellation** via AbortSignal
|
|
10
|
+
- **Rate limit handling** with intelligent retry
|
|
11
|
+
- **Zero dependencies** (uses native fetch)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @prampta/sdk
|
|
17
|
+
# or
|
|
18
|
+
pnpm add @prampta/sdk
|
|
19
|
+
# or
|
|
20
|
+
yarn add @prampta/sdk
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { Prampta } from '@prampta/sdk';
|
|
27
|
+
|
|
28
|
+
const prampta = new Prampta({
|
|
29
|
+
apiKey: 'pk_xxxx-xx-xx-xx-xxxxxx', // Get at prampta.com/profile
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Create a prompt
|
|
33
|
+
const result = await prampta.create({
|
|
34
|
+
content: 'Write a TypeScript function that validates email addresses...',
|
|
35
|
+
title: 'Email Validator',
|
|
36
|
+
});
|
|
37
|
+
console.log('Created:', result.ppCode); // PP-3YGBM5V0HN-4
|
|
38
|
+
|
|
39
|
+
// Decode a prompt
|
|
40
|
+
const prompt = await prampta.decode('PP-3YGBM5V0HN-4');
|
|
41
|
+
console.log(prompt.content);
|
|
42
|
+
|
|
43
|
+
// Search prompts
|
|
44
|
+
const { prompts } = await prampta.search({
|
|
45
|
+
query: 'typescript',
|
|
46
|
+
category: 'development',
|
|
47
|
+
limit: 10,
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## API Reference
|
|
52
|
+
|
|
53
|
+
### Constructor
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
new Prampta(config: PramptaConfig)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Option | Type | Default | Description |
|
|
60
|
+
|--------|------|---------|-------------|
|
|
61
|
+
| `apiKey` | `string` | (required) | Your API key (starts with `pk_`) |
|
|
62
|
+
| `baseUrl` | `string` | `https://prampta.com` | API base URL |
|
|
63
|
+
| `timeoutMs` | `number` | `30000` | Request timeout in ms |
|
|
64
|
+
| `maxRetries` | `number` | `3` | Max retry attempts |
|
|
65
|
+
|
|
66
|
+
### Methods
|
|
67
|
+
|
|
68
|
+
#### `decode(code, options?)`
|
|
69
|
+
|
|
70
|
+
Get the full prompt content by PP code.
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const prompt = await prampta.decode('PP-3YGBM5V0HN-4');
|
|
74
|
+
// Returns: Prompt with content, media, metadata
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### `lookup(code, options?)`
|
|
78
|
+
|
|
79
|
+
Get prompt metadata without content (increments usage counter).
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
const metadata = await prampta.lookup('PP-3YGBM5V0HN-4');
|
|
83
|
+
// Returns: PromptMetadata (no content field)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
#### `search(searchOptions?, requestOptions?)`
|
|
87
|
+
|
|
88
|
+
Search the public prompt library.
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
const result = await prampta.search({
|
|
92
|
+
query: 'react hooks',
|
|
93
|
+
category: 'development', // development, design, marketing, data, writing, business
|
|
94
|
+
limit: 20,
|
|
95
|
+
page: 1,
|
|
96
|
+
});
|
|
97
|
+
// Returns: { prompts, total, page, totalPages }
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### `create(options, requestOptions?)`
|
|
101
|
+
|
|
102
|
+
Create a new prompt.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
const result = await prampta.create({
|
|
106
|
+
content: 'Your prompt content here (10-50,000 chars)',
|
|
107
|
+
title: 'Optional title',
|
|
108
|
+
media: {
|
|
109
|
+
'img1': 'data:image/png;base64,...', // Optional media attachments
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
// Returns: { ppCode, title, category, tags }
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### `myPrompts(options?)`
|
|
116
|
+
|
|
117
|
+
List your own prompts.
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const prompts = await prampta.myPrompts();
|
|
121
|
+
// Returns: Prompt[]
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### `register(ppCode, options?)`
|
|
125
|
+
|
|
126
|
+
Register an existing PP code to your account.
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
const { registered, prompt } = await prampta.register('PP-3YGBM5V0HN-4');
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### `healthCheck()`
|
|
133
|
+
|
|
134
|
+
Check API connectivity and authentication.
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
const health = await prampta.healthCheck();
|
|
138
|
+
// Returns: { healthy: boolean, latencyMs: number, authenticated: boolean }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Request Cancellation
|
|
142
|
+
|
|
143
|
+
All methods accept an optional `signal` for cancellation:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
const controller = new AbortController();
|
|
147
|
+
|
|
148
|
+
// Cancel after 5 seconds
|
|
149
|
+
setTimeout(() => controller.abort(), 5000);
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
const prompt = await prampta.decode('PP-xxx', {
|
|
153
|
+
signal: controller.signal,
|
|
154
|
+
});
|
|
155
|
+
} catch (err) {
|
|
156
|
+
if (err.message === 'Request was cancelled') {
|
|
157
|
+
console.log('Request cancelled');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Error Handling
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { Prampta, PramptaError } from '@prampta/sdk';
|
|
166
|
+
|
|
167
|
+
try {
|
|
168
|
+
const prompt = await prampta.decode('PP-invalid');
|
|
169
|
+
} catch (err) {
|
|
170
|
+
if (err instanceof PramptaError) {
|
|
171
|
+
console.error(`API error ${err.status}: ${err.message}`);
|
|
172
|
+
|
|
173
|
+
if (err.status === 404) {
|
|
174
|
+
console.log('Prompt not found');
|
|
175
|
+
} else if (err.status === 429) {
|
|
176
|
+
console.log('Rate limited, try again later');
|
|
177
|
+
} else if (err.status === 401) {
|
|
178
|
+
console.log('Invalid API key');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Types
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
interface Prompt {
|
|
188
|
+
id: string;
|
|
189
|
+
ppCode: string;
|
|
190
|
+
title: string;
|
|
191
|
+
content: string;
|
|
192
|
+
category: string;
|
|
193
|
+
tags: string[];
|
|
194
|
+
authorName: string | null;
|
|
195
|
+
uses: number;
|
|
196
|
+
likes: number;
|
|
197
|
+
visibility: 'public' | 'private';
|
|
198
|
+
createdAt: number;
|
|
199
|
+
media?: Record<string, string>;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
interface CreateOptions {
|
|
203
|
+
content: string; // 10-50,000 characters
|
|
204
|
+
title?: string; // Max 200 characters
|
|
205
|
+
media?: Record<string, string>; // Base64 data URLs
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
interface SearchOptions {
|
|
209
|
+
query?: string;
|
|
210
|
+
category?: 'development' | 'design' | 'marketing' | 'data' | 'writing' | 'business';
|
|
211
|
+
limit?: number; // 1-100
|
|
212
|
+
page?: number;
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Examples
|
|
217
|
+
|
|
218
|
+
### With Express.js
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
import express from 'express';
|
|
222
|
+
import { Prampta } from '@prampta/sdk';
|
|
223
|
+
|
|
224
|
+
const app = express();
|
|
225
|
+
const prampta = new Prampta({ apiKey: process.env.PRAMPTA_API_KEY! });
|
|
226
|
+
|
|
227
|
+
app.get('/prompt/:code', async (req, res) => {
|
|
228
|
+
try {
|
|
229
|
+
const prompt = await prampta.decode(req.params.code);
|
|
230
|
+
res.json(prompt);
|
|
231
|
+
} catch (err) {
|
|
232
|
+
res.status(err.status || 500).json({ error: err.message });
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### With Next.js API Routes
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
// app/api/prompts/route.ts
|
|
241
|
+
import { NextResponse } from 'next/server';
|
|
242
|
+
import { Prampta } from '@prampta/sdk';
|
|
243
|
+
|
|
244
|
+
const prampta = new Prampta({ apiKey: process.env.PRAMPTA_API_KEY! });
|
|
245
|
+
|
|
246
|
+
export async function GET(request: Request) {
|
|
247
|
+
const { searchParams } = new URL(request.url);
|
|
248
|
+
const query = searchParams.get('q') || '';
|
|
249
|
+
|
|
250
|
+
const result = await prampta.search({ query });
|
|
251
|
+
return NextResponse.json(result);
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Batch Operations
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
const codes = ['PP-xxx', 'PP-yyy', 'PP-zzz'];
|
|
259
|
+
|
|
260
|
+
// Parallel fetching with error handling
|
|
261
|
+
const results = await Promise.allSettled(
|
|
262
|
+
codes.map(code => prampta.decode(code))
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
const prompts = results
|
|
266
|
+
.filter((r): r is PromiseFulfilledResult<Prompt> => r.status === 'fulfilled')
|
|
267
|
+
.map(r => r.value);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Rate Limits
|
|
271
|
+
|
|
272
|
+
| Limit | Value |
|
|
273
|
+
|-------|-------|
|
|
274
|
+
| Requests per minute | 200 |
|
|
275
|
+
| Requests per day | 5,000 |
|
|
276
|
+
| Max prompt size | 50,000 chars |
|
|
277
|
+
| Max media per prompt | 8 files |
|
|
278
|
+
| Max media size | 2MB per file |
|
|
279
|
+
|
|
280
|
+
The SDK automatically handles rate limiting with retries.
|
|
281
|
+
|
|
282
|
+
## License
|
|
283
|
+
|
|
284
|
+
MIT
|
package/dist/client.d.ts
CHANGED
|
@@ -1,41 +1,75 @@
|
|
|
1
1
|
import type { PramptaConfig, Prompt, PromptMetadata, CreateResult, SearchResult, CreateOptions, SearchOptions } from './types.js';
|
|
2
|
+
export declare class PramptaError extends Error {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
constructor(message: string, status: number);
|
|
5
|
+
}
|
|
2
6
|
export declare class Prampta {
|
|
3
7
|
private readonly apiKey;
|
|
4
8
|
private readonly baseUrl;
|
|
5
9
|
private readonly timeoutMs;
|
|
10
|
+
private readonly maxRetries;
|
|
6
11
|
constructor(config: PramptaConfig);
|
|
12
|
+
private sleep;
|
|
7
13
|
private request;
|
|
8
14
|
/**
|
|
9
15
|
* Decode a PP code — returns the full prompt with content and media.
|
|
16
|
+
* @param code - The PP code to decode (e.g., "PP-3YGBM5V0HN-4")
|
|
17
|
+
* @param options - Optional request options including abort signal
|
|
10
18
|
*/
|
|
11
|
-
decode(code: string
|
|
19
|
+
decode(code: string, options?: {
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}): Promise<Prompt>;
|
|
12
22
|
/**
|
|
13
23
|
* Look up a PP code — returns metadata without content.
|
|
14
24
|
* Increments the prompt's usage counter.
|
|
25
|
+
* @param code - The PP code to look up
|
|
26
|
+
* @param options - Optional request options including abort signal
|
|
15
27
|
*/
|
|
16
|
-
lookup(code: string
|
|
28
|
+
lookup(code: string, options?: {
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
}): Promise<PromptMetadata>;
|
|
17
31
|
/**
|
|
18
32
|
* Search the public prompt library.
|
|
33
|
+
* @param searchOptions - Search filters and pagination
|
|
34
|
+
* @param requestOptions - Optional request options including abort signal
|
|
19
35
|
*/
|
|
20
|
-
search(
|
|
36
|
+
search(searchOptions?: SearchOptions, requestOptions?: {
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}): Promise<SearchResult>;
|
|
21
39
|
/**
|
|
22
40
|
* Create a new prompt and get its PP code.
|
|
41
|
+
* @param createOptions - Prompt content and optional metadata
|
|
42
|
+
* @param requestOptions - Optional request options including abort signal
|
|
23
43
|
*/
|
|
24
|
-
create(
|
|
44
|
+
create(createOptions: CreateOptions, requestOptions?: {
|
|
45
|
+
signal?: AbortSignal;
|
|
46
|
+
}): Promise<CreateResult>;
|
|
25
47
|
/**
|
|
26
48
|
* List your own prompts.
|
|
49
|
+
* @param options - Optional request options including abort signal
|
|
27
50
|
*/
|
|
28
|
-
myPrompts(
|
|
51
|
+
myPrompts(options?: {
|
|
52
|
+
signal?: AbortSignal;
|
|
53
|
+
}): Promise<Prompt[]>;
|
|
29
54
|
/**
|
|
30
55
|
* Register an existing PP code to your account (increments usage).
|
|
56
|
+
* @param ppCode - The PP code to register
|
|
57
|
+
* @param options - Optional request options including abort signal
|
|
31
58
|
*/
|
|
32
|
-
register(ppCode: string
|
|
59
|
+
register(ppCode: string, options?: {
|
|
60
|
+
signal?: AbortSignal;
|
|
61
|
+
}): Promise<{
|
|
33
62
|
registered: boolean;
|
|
34
63
|
prompt: Prompt;
|
|
35
64
|
}>;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Check API connectivity and authentication.
|
|
67
|
+
* Useful for testing your API key before making other requests.
|
|
68
|
+
*/
|
|
69
|
+
healthCheck(): Promise<{
|
|
70
|
+
healthy: boolean;
|
|
71
|
+
latencyMs: number;
|
|
72
|
+
authenticated: boolean;
|
|
73
|
+
}>;
|
|
40
74
|
}
|
|
41
75
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EACN,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,MAAM,EACN,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AAQpB,qBAAa,YAAa,SAAQ,KAAK;aACQ,MAAM,EAAE,MAAM;gBAA/C,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAI5D;AAOD,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,aAAa;YAenB,KAAK;YAIL,OAAO;IAwGrB;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAO/E;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAOvF;;;;OAIG;IACG,MAAM,CACV,aAAa,GAAE,aAAkB,EACjC,cAAc,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACxC,OAAO,CAAC,YAAY,CAAC;IAUxB;;;;OAIG;IACG,MAAM,CACV,aAAa,EAAE,aAAa,EAC5B,cAAc,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACxC,OAAO,CAAC,YAAY,CAAC;IAUxB;;;OAGG;IACG,SAAS,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAItE;;;;OAIG;IACG,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAOnD;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;CAwB9F"}
|
package/dist/client.js
CHANGED
|
@@ -1,114 +1,222 @@
|
|
|
1
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
2
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
3
|
+
const RETRY_DELAY_MS = 1000;
|
|
4
|
+
const SDK_VERSION = '0.2.0';
|
|
5
|
+
// Defined first so it can be used in the Prampta class below
|
|
6
|
+
export class PramptaError extends Error {
|
|
7
|
+
status;
|
|
8
|
+
constructor(message, status) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.status = status;
|
|
11
|
+
this.name = 'PramptaError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
1
14
|
export class Prampta {
|
|
2
15
|
apiKey;
|
|
3
16
|
baseUrl;
|
|
4
17
|
timeoutMs;
|
|
18
|
+
maxRetries;
|
|
5
19
|
constructor(config) {
|
|
6
|
-
if (!config.apiKey)
|
|
7
|
-
throw new
|
|
20
|
+
if (!config.apiKey) {
|
|
21
|
+
throw new PramptaError('apiKey is required', 0);
|
|
22
|
+
}
|
|
23
|
+
if (!config.apiKey.startsWith('pk_')) {
|
|
24
|
+
throw new PramptaError('apiKey must start with "pk_"', 0);
|
|
25
|
+
}
|
|
8
26
|
this.apiKey = config.apiKey;
|
|
9
27
|
this.baseUrl = (config.baseUrl || 'https://prampta.com').replace(/\/$/, '');
|
|
10
|
-
this.timeoutMs = config.timeoutMs ??
|
|
28
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
29
|
+
this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
11
30
|
}
|
|
12
|
-
async
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
async sleep(ms) {
|
|
32
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
33
|
+
}
|
|
34
|
+
async request(method, path, body, options) {
|
|
35
|
+
const maxRetries = options?.retries ?? this.maxRetries;
|
|
36
|
+
let lastError = null;
|
|
37
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
38
|
+
const headers = {
|
|
39
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
40
|
+
'Accept': 'application/json',
|
|
41
|
+
'User-Agent': `prampta-sdk/${SDK_VERSION}`,
|
|
42
|
+
};
|
|
43
|
+
if (body)
|
|
44
|
+
headers['Content-Type'] = 'application/json';
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
47
|
+
// Allow external abort signal to cancel request
|
|
48
|
+
if (options?.signal) {
|
|
49
|
+
options.signal.addEventListener('abort', () => controller.abort());
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
53
|
+
method,
|
|
54
|
+
headers,
|
|
55
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
56
|
+
signal: controller.signal,
|
|
57
|
+
});
|
|
58
|
+
clearTimeout(timeout);
|
|
59
|
+
if (res.status === 204)
|
|
60
|
+
return undefined;
|
|
61
|
+
// Handle rate limiting with retry
|
|
62
|
+
if (res.status === 429) {
|
|
63
|
+
const retryAfter = res.headers.get('Retry-After');
|
|
64
|
+
const waitMs = retryAfter
|
|
65
|
+
? parseInt(retryAfter, 10) * 1000
|
|
66
|
+
: RETRY_DELAY_MS * Math.pow(2, attempt);
|
|
67
|
+
if (attempt < maxRetries) {
|
|
68
|
+
await this.sleep(waitMs);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
throw new PramptaError('Rate limit exceeded. Try again later.', 429);
|
|
72
|
+
}
|
|
73
|
+
// Retry on server errors
|
|
74
|
+
if (res.status >= 500 && attempt < maxRetries) {
|
|
75
|
+
lastError = new PramptaError(`Server error (${res.status})`, res.status);
|
|
76
|
+
await this.sleep(RETRY_DELAY_MS * Math.pow(2, attempt));
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
let data;
|
|
80
|
+
try {
|
|
81
|
+
data = await res.json();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
throw new PramptaError(`API returned non-JSON response (${res.status})`, res.status);
|
|
85
|
+
}
|
|
86
|
+
if (!res.ok) {
|
|
87
|
+
const message = (data && typeof data === 'object' && 'error' in data)
|
|
88
|
+
? String(data.error)
|
|
89
|
+
: `API error ${res.status}`;
|
|
90
|
+
throw new PramptaError(message, res.status);
|
|
91
|
+
}
|
|
92
|
+
return data;
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
clearTimeout(timeout);
|
|
96
|
+
if (e instanceof PramptaError) {
|
|
97
|
+
throw e;
|
|
98
|
+
}
|
|
99
|
+
if (e instanceof Error) {
|
|
100
|
+
if (e.name === 'AbortError') {
|
|
101
|
+
// Check if it was an external abort
|
|
102
|
+
if (options?.signal?.aborted) {
|
|
103
|
+
throw new PramptaError('Request was cancelled', 0);
|
|
104
|
+
}
|
|
105
|
+
throw new PramptaError(`Request timed out after ${this.timeoutMs}ms`, 0);
|
|
106
|
+
}
|
|
107
|
+
// Network errors are retryable
|
|
108
|
+
lastError = new PramptaError(`Network error: ${e.message}`, 0);
|
|
109
|
+
if (attempt < maxRetries) {
|
|
110
|
+
await this.sleep(RETRY_DELAY_MS * Math.pow(2, attempt));
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
throw lastError ?? new PramptaError('Unknown error occurred', 0);
|
|
32
115
|
}
|
|
33
|
-
throw new PramptaError(e instanceof Error ? e.message : 'Network error', 0);
|
|
34
|
-
}
|
|
35
|
-
finally {
|
|
36
|
-
clearTimeout(timeout);
|
|
37
|
-
}
|
|
38
|
-
if (res.status === 204)
|
|
39
|
-
return undefined;
|
|
40
|
-
if (res.status === 429) {
|
|
41
|
-
throw new PramptaError('Rate limit exceeded. Try again later.', 429);
|
|
42
|
-
}
|
|
43
|
-
let data;
|
|
44
|
-
try {
|
|
45
|
-
data = await res.json();
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
throw new PramptaError(`API returned non-JSON response (${res.status})`, res.status);
|
|
49
|
-
}
|
|
50
|
-
if (!res.ok) {
|
|
51
|
-
const message = (data && typeof data === 'object' && 'error' in data)
|
|
52
|
-
? String(data.error)
|
|
53
|
-
: `API error ${res.status}`;
|
|
54
|
-
throw new PramptaError(message, res.status);
|
|
55
116
|
}
|
|
56
|
-
|
|
117
|
+
throw lastError ?? new PramptaError('Request failed after retries', 0);
|
|
57
118
|
}
|
|
58
119
|
/**
|
|
59
120
|
* Decode a PP code — returns the full prompt with content and media.
|
|
121
|
+
* @param code - The PP code to decode (e.g., "PP-3YGBM5V0HN-4")
|
|
122
|
+
* @param options - Optional request options including abort signal
|
|
60
123
|
*/
|
|
61
|
-
async decode(code) {
|
|
62
|
-
|
|
124
|
+
async decode(code, options) {
|
|
125
|
+
if (!code || typeof code !== 'string') {
|
|
126
|
+
throw new PramptaError('PP code is required', 0);
|
|
127
|
+
}
|
|
128
|
+
return this.request('GET', `/api/decode?code=${encodeURIComponent(code.trim())}`, undefined, options);
|
|
63
129
|
}
|
|
64
130
|
/**
|
|
65
131
|
* Look up a PP code — returns metadata without content.
|
|
66
132
|
* Increments the prompt's usage counter.
|
|
133
|
+
* @param code - The PP code to look up
|
|
134
|
+
* @param options - Optional request options including abort signal
|
|
67
135
|
*/
|
|
68
|
-
async lookup(code) {
|
|
69
|
-
|
|
136
|
+
async lookup(code, options) {
|
|
137
|
+
if (!code || typeof code !== 'string') {
|
|
138
|
+
throw new PramptaError('PP code is required', 0);
|
|
139
|
+
}
|
|
140
|
+
return this.request('GET', `/api/lookup?code=${encodeURIComponent(code.trim())}`, undefined, options);
|
|
70
141
|
}
|
|
71
142
|
/**
|
|
72
143
|
* Search the public prompt library.
|
|
144
|
+
* @param searchOptions - Search filters and pagination
|
|
145
|
+
* @param requestOptions - Optional request options including abort signal
|
|
73
146
|
*/
|
|
74
|
-
async search(
|
|
147
|
+
async search(searchOptions = {}, requestOptions) {
|
|
75
148
|
const params = new URLSearchParams();
|
|
76
|
-
if (
|
|
77
|
-
params.set('search',
|
|
78
|
-
if (
|
|
79
|
-
params.set('category',
|
|
80
|
-
if (
|
|
81
|
-
params.set('limit', String(
|
|
82
|
-
if (
|
|
83
|
-
params.set('page', String(
|
|
149
|
+
if (searchOptions.query)
|
|
150
|
+
params.set('search', searchOptions.query.slice(0, 200));
|
|
151
|
+
if (searchOptions.category)
|
|
152
|
+
params.set('category', searchOptions.category);
|
|
153
|
+
if (searchOptions.limit)
|
|
154
|
+
params.set('limit', String(Math.min(100, Math.max(1, searchOptions.limit))));
|
|
155
|
+
if (searchOptions.page)
|
|
156
|
+
params.set('page', String(Math.max(1, searchOptions.page)));
|
|
84
157
|
const qs = params.toString();
|
|
85
|
-
return this.request('GET', `/api/
|
|
158
|
+
return this.request('GET', `/api/search${qs ? `?${qs}` : ''}`, undefined, requestOptions);
|
|
86
159
|
}
|
|
87
160
|
/**
|
|
88
161
|
* Create a new prompt and get its PP code.
|
|
162
|
+
* @param createOptions - Prompt content and optional metadata
|
|
163
|
+
* @param requestOptions - Optional request options including abort signal
|
|
89
164
|
*/
|
|
90
|
-
async create(
|
|
91
|
-
|
|
165
|
+
async create(createOptions, requestOptions) {
|
|
166
|
+
if (!createOptions.content || createOptions.content.length < 10) {
|
|
167
|
+
throw new PramptaError('Prompt content must be at least 10 characters', 0);
|
|
168
|
+
}
|
|
169
|
+
if (createOptions.content.length > 50_000) {
|
|
170
|
+
throw new PramptaError('Prompt content must be at most 50,000 characters', 0);
|
|
171
|
+
}
|
|
172
|
+
return this.request('POST', '/api/create', createOptions, requestOptions);
|
|
92
173
|
}
|
|
93
174
|
/**
|
|
94
175
|
* List your own prompts.
|
|
176
|
+
* @param options - Optional request options including abort signal
|
|
95
177
|
*/
|
|
96
|
-
async myPrompts() {
|
|
97
|
-
return this.request('GET', '/api/mine');
|
|
178
|
+
async myPrompts(options) {
|
|
179
|
+
return this.request('GET', '/api/mine', undefined, options);
|
|
98
180
|
}
|
|
99
181
|
/**
|
|
100
182
|
* Register an existing PP code to your account (increments usage).
|
|
183
|
+
* @param ppCode - The PP code to register
|
|
184
|
+
* @param options - Optional request options including abort signal
|
|
101
185
|
*/
|
|
102
|
-
async register(ppCode) {
|
|
103
|
-
|
|
186
|
+
async register(ppCode, options) {
|
|
187
|
+
if (!ppCode || typeof ppCode !== 'string') {
|
|
188
|
+
throw new PramptaError('PP code is required', 0);
|
|
189
|
+
}
|
|
190
|
+
return this.request('POST', '/api/register', { ppCode: ppCode.trim() }, options);
|
|
104
191
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
192
|
+
/**
|
|
193
|
+
* Check API connectivity and authentication.
|
|
194
|
+
* Useful for testing your API key before making other requests.
|
|
195
|
+
*/
|
|
196
|
+
async healthCheck() {
|
|
197
|
+
const start = Date.now();
|
|
198
|
+
try {
|
|
199
|
+
await this.myPrompts({ signal: AbortSignal.timeout(5000) });
|
|
200
|
+
return {
|
|
201
|
+
healthy: true,
|
|
202
|
+
latencyMs: Date.now() - start,
|
|
203
|
+
authenticated: true,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
if (err instanceof PramptaError && err.status === 401) {
|
|
208
|
+
return {
|
|
209
|
+
healthy: true,
|
|
210
|
+
latencyMs: Date.now() - start,
|
|
211
|
+
authenticated: false,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
healthy: false,
|
|
216
|
+
latencyMs: Date.now() - start,
|
|
217
|
+
authenticated: false,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
112
220
|
}
|
|
113
221
|
}
|
|
114
222
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,OAAO;IACD,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,SAAS,CAAS;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":""}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
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 { z } from 'zod';
|
|
5
|
+
// --- Config ---
|
|
6
|
+
const API_URL = (process.env.PRAMPTA_API_URL || 'https://prampta.com').replace(/\/+$/, '');
|
|
7
|
+
const API_KEY = process.env.PRAMPTA_API_KEY || '';
|
|
8
|
+
const TIMEOUT_MS = 30_000;
|
|
9
|
+
const MAX_RETRIES = 3;
|
|
10
|
+
const RETRY_DELAY_MS = 1000;
|
|
11
|
+
const VERSION = '0.3.0';
|
|
12
|
+
function validateConfig() {
|
|
13
|
+
if (!API_KEY) {
|
|
14
|
+
process.stderr.write('Error: PRAMPTA_API_KEY environment variable is required.\n' +
|
|
15
|
+
'Get your key at https://prampta.com (Profile → API Keys).\n');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
if (!API_KEY.startsWith('pk_')) {
|
|
19
|
+
process.stderr.write('Error: PRAMPTA_API_KEY must start with "pk_".\n' +
|
|
20
|
+
'Get a valid key at https://prampta.com (Profile → API Keys).\n');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
validateConfig();
|
|
25
|
+
// --- Logging ---
|
|
26
|
+
function log(level, message, data) {
|
|
27
|
+
const entry = { timestamp: new Date().toISOString(), level, message, ...data };
|
|
28
|
+
process.stderr.write(JSON.stringify(entry) + '\n');
|
|
29
|
+
}
|
|
30
|
+
// --- API client ---
|
|
31
|
+
function sanitizeErrorMessage(msg) {
|
|
32
|
+
return msg
|
|
33
|
+
.replace(/pk_[a-zA-Z0-9_-]+/g, 'pk_***')
|
|
34
|
+
.replace(/Bearer\s+\S+/gi, 'Bearer ***');
|
|
35
|
+
}
|
|
36
|
+
async function sleep(ms) {
|
|
37
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
38
|
+
}
|
|
39
|
+
async function api(method, path, body, options) {
|
|
40
|
+
const retries = options?.retries ?? MAX_RETRIES;
|
|
41
|
+
let lastError = null;
|
|
42
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
43
|
+
const headers = {
|
|
44
|
+
'User-Agent': `prampta-sdk/${VERSION}`,
|
|
45
|
+
'Accept': 'application/json',
|
|
46
|
+
};
|
|
47
|
+
if (!options?.noAuth)
|
|
48
|
+
headers['Authorization'] = `Bearer ${API_KEY}`;
|
|
49
|
+
if (body)
|
|
50
|
+
headers['Content-Type'] = 'application/json';
|
|
51
|
+
const controller = new AbortController();
|
|
52
|
+
const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
53
|
+
try {
|
|
54
|
+
const res = await fetch(`${API_URL}${path}`, {
|
|
55
|
+
method,
|
|
56
|
+
headers,
|
|
57
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
58
|
+
signal: controller.signal,
|
|
59
|
+
});
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
if (res.status === 204)
|
|
62
|
+
return {};
|
|
63
|
+
if (res.status === 429) {
|
|
64
|
+
const retryAfter = res.headers.get('Retry-After');
|
|
65
|
+
const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : RETRY_DELAY_MS * (attempt + 1);
|
|
66
|
+
if (attempt < retries) {
|
|
67
|
+
log('warn', 'Rate limited, retrying', { attempt, waitMs });
|
|
68
|
+
await sleep(waitMs);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
throw new Error('Rate limit exceeded. Try again later.');
|
|
72
|
+
}
|
|
73
|
+
if (res.status >= 500 && attempt < retries) {
|
|
74
|
+
log('warn', 'Server error, retrying', { status: res.status, attempt });
|
|
75
|
+
await sleep(RETRY_DELAY_MS * (attempt + 1));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
let data;
|
|
79
|
+
try {
|
|
80
|
+
data = await res.json();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
throw new Error(`API returned non-JSON response (${res.status})`);
|
|
84
|
+
}
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
const errMsg = (data && typeof data === 'object' && 'error' in data)
|
|
87
|
+
? String(data.error)
|
|
88
|
+
: `API error ${res.status}`;
|
|
89
|
+
throw new Error(sanitizeErrorMessage(errMsg));
|
|
90
|
+
}
|
|
91
|
+
return data;
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
clearTimeout(timeout);
|
|
95
|
+
if (e instanceof Error) {
|
|
96
|
+
if (e.name === 'AbortError' || e.message.includes('fetch')) {
|
|
97
|
+
lastError = new Error(sanitizeErrorMessage(`Request failed: ${e.message}`));
|
|
98
|
+
if (attempt < retries) {
|
|
99
|
+
log('warn', 'Network error, retrying', { error: e.message, attempt });
|
|
100
|
+
await sleep(RETRY_DELAY_MS * (attempt + 1));
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
throw e;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
lastError = new Error('Unknown error occurred');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
throw lastError ?? new Error('Request failed after retries');
|
|
114
|
+
}
|
|
115
|
+
function formatPromptText(p, includeContent = true) {
|
|
116
|
+
const lines = [
|
|
117
|
+
`${p.ppCode} ${p.title}`,
|
|
118
|
+
`${p.category} · ${(p.tags || []).join(', ')}`,
|
|
119
|
+
`${p.uses} uses · ${p.likes} likes${p.authorName ? ` · by ${p.authorName}` : ''}`,
|
|
120
|
+
];
|
|
121
|
+
if (p.version && p.version > 1)
|
|
122
|
+
lines[0] += ` (V${p.version})`;
|
|
123
|
+
if (p.branch)
|
|
124
|
+
lines[0] += ` (B:${p.branch})`;
|
|
125
|
+
if (includeContent && p.content)
|
|
126
|
+
lines.push('', p.content);
|
|
127
|
+
if (p.media && Object.keys(p.media).length > 0)
|
|
128
|
+
lines.push('', `[${Object.keys(p.media).length} media attachment(s)]`);
|
|
129
|
+
return lines.join('\n');
|
|
130
|
+
}
|
|
131
|
+
function buildContentBlocks(p, includeContent = true) {
|
|
132
|
+
const blocks = [{ type: 'text', text: formatPromptText(p, includeContent) }];
|
|
133
|
+
if (p.media) {
|
|
134
|
+
for (const [hash, dataUrl] of Object.entries(p.media)) {
|
|
135
|
+
const match = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
|
|
136
|
+
if (match && match[1].startsWith('image/')) {
|
|
137
|
+
blocks.push({ type: 'image', data: match[2], mimeType: match[1] });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
blocks.push({ type: 'text', text: `[Attachment ${hash}: non-image file]` });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return blocks;
|
|
145
|
+
}
|
|
146
|
+
const ok = (text) => ({ content: [{ type: 'text', text }] });
|
|
147
|
+
const okB = (blocks) => ({ content: blocks });
|
|
148
|
+
const err = (text) => ({ content: [{ type: 'text', text }], isError: true });
|
|
149
|
+
// --- MCP Server ---
|
|
150
|
+
const server = new McpServer({ name: 'prampta', version: VERSION });
|
|
151
|
+
server.tool('prampta_decode', "Get a prompt's full content from PRAMPTA by its PP code. Returns images inline if attached.", { code: z.string().min(5).max(80).describe('PP code (e.g. PP-3YGBM5V0HN-4)') }, async ({ code }) => {
|
|
152
|
+
try {
|
|
153
|
+
const data = await api('GET', `/api/decode?code=${encodeURIComponent(code)}`);
|
|
154
|
+
return okB(buildContentBlocks(data));
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
return err(`Could not decode ${code}: ${e.message}`);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
server.tool('prampta_lookup', 'Get prompt metadata from PRAMPTA without the full content', { code: z.string().min(5).max(80).describe('PP code to look up') }, async ({ code }) => {
|
|
161
|
+
try {
|
|
162
|
+
const data = await api('GET', `/api/lookup?code=${encodeURIComponent(code)}`);
|
|
163
|
+
return ok(formatPromptText(data, false));
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
return err(`Could not look up ${code}: ${e.message}`);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
server.tool('prampta_search', 'Search the PRAMPTA prompt library', {
|
|
170
|
+
query: z.string().optional().describe('Search text'),
|
|
171
|
+
category: z.enum(['development', 'design', 'marketing', 'data', 'writing', 'business']).optional().describe('Filter by category'),
|
|
172
|
+
limit: z.number().min(1).max(50).optional().describe('Max results (default 10)'),
|
|
173
|
+
}, async ({ query, category, limit }) => {
|
|
174
|
+
try {
|
|
175
|
+
const params = new URLSearchParams();
|
|
176
|
+
if (query)
|
|
177
|
+
params.set('search', query);
|
|
178
|
+
if (category)
|
|
179
|
+
params.set('category', category);
|
|
180
|
+
params.set('limit', String(limit || 10));
|
|
181
|
+
const qs = params.toString();
|
|
182
|
+
const data = await api('GET', `/api/search${qs ? `?${qs}` : ''}`);
|
|
183
|
+
const prompts = Array.isArray(data) ? data : (data.prompts ?? []);
|
|
184
|
+
const total = Array.isArray(data) ? data.length : (data.total ?? prompts.length);
|
|
185
|
+
if (prompts.length === 0)
|
|
186
|
+
return ok('No prompts found.');
|
|
187
|
+
const lines = prompts.map((p, i) => `${i + 1}. ${formatPromptText(p, false)}`);
|
|
188
|
+
lines.push('', `${total} total results`);
|
|
189
|
+
return ok(lines.join('\n\n'));
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
return err(`Search failed: ${e.message}`);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
server.tool('prampta_create', 'Create a new prompt on PRAMPTA and get its PP code. Supports text and media attachments.', {
|
|
196
|
+
content: z.string().min(10).max(50000).describe('Prompt text (10-50,000 chars)'),
|
|
197
|
+
title: z.string().max(200).optional().describe('Optional title'),
|
|
198
|
+
media: z.record(z.string(), z.string()).optional().describe('Media attachments: { "img1": "data:image/png;base64,..." }'),
|
|
199
|
+
}, async ({ content, title, media }) => {
|
|
200
|
+
try {
|
|
201
|
+
const body = { content, title };
|
|
202
|
+
if (media && Object.keys(media).length > 0)
|
|
203
|
+
body.media = media;
|
|
204
|
+
const data = await api('POST', '/api/create', body);
|
|
205
|
+
const lines = [`Created: ${data.ppCode}`, `Title: ${data.title}`, `Category: ${data.category}`, `Tags: ${(data.tags ?? []).join(', ')}`];
|
|
206
|
+
if (media && Object.keys(media).length > 0)
|
|
207
|
+
lines.push(`Media: ${Object.keys(media).length} attachment(s) included`);
|
|
208
|
+
return ok(lines.join('\n'));
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
return err(`Failed to create prompt: ${e.message}`);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
server.tool('prampta_my_prompts', 'List your own prompts on PRAMPTA (first 20 shown)', {}, async () => {
|
|
215
|
+
try {
|
|
216
|
+
const data = await api('GET', '/api/mine');
|
|
217
|
+
const prompts = Array.isArray(data) ? data : [];
|
|
218
|
+
if (prompts.length === 0)
|
|
219
|
+
return ok('No prompts yet.');
|
|
220
|
+
const lines = prompts.slice(0, 20).map((p, i) => `${i + 1}. ${formatPromptText(p, false)}`);
|
|
221
|
+
if (prompts.length > 20)
|
|
222
|
+
lines.push(`\n... and ${prompts.length - 20} more`);
|
|
223
|
+
return ok(lines.join('\n\n'));
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
return err(`Failed to list prompts: ${e.message}`);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
server.tool('prampta_health', 'Check PRAMPTA API connectivity and authentication status', {}, async () => {
|
|
230
|
+
try {
|
|
231
|
+
const start = Date.now();
|
|
232
|
+
await api('GET', '/health', undefined, { noAuth: true, retries: 1 });
|
|
233
|
+
const latency = Date.now() - start;
|
|
234
|
+
try {
|
|
235
|
+
await api('GET', '/api/mine', undefined, { retries: 1 });
|
|
236
|
+
return ok(`PRAMPTA API is healthy\nLatency: ${latency}ms\nAuthentication: Valid`);
|
|
237
|
+
}
|
|
238
|
+
catch (authErr) {
|
|
239
|
+
return ok(`PRAMPTA API is reachable\nLatency: ${latency}ms\nAuthentication: Failed - ${authErr.message}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (e) {
|
|
243
|
+
return err(`PRAMPTA API unreachable: ${e.message}`);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
// --- Graceful shutdown ---
|
|
247
|
+
let isShuttingDown = false;
|
|
248
|
+
function shutdown(signal) {
|
|
249
|
+
if (isShuttingDown)
|
|
250
|
+
return;
|
|
251
|
+
isShuttingDown = true;
|
|
252
|
+
log('info', 'Shutting down', { signal });
|
|
253
|
+
process.exit(0);
|
|
254
|
+
}
|
|
255
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
256
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
257
|
+
process.on('uncaughtException', (e) => { log('error', 'Uncaught exception', { error: e.message, stack: e.stack }); process.exit(1); });
|
|
258
|
+
process.on('unhandledRejection', (r) => { log('error', 'Unhandled rejection', { reason: String(r) }); });
|
|
259
|
+
// --- Start ---
|
|
260
|
+
async function main() {
|
|
261
|
+
try {
|
|
262
|
+
log('info', 'Starting PRAMPTA MCP server', { version: VERSION, apiUrl: API_URL });
|
|
263
|
+
const transport = new StdioServerTransport();
|
|
264
|
+
await server.connect(transport);
|
|
265
|
+
log('info', 'PRAMPTA MCP server connected');
|
|
266
|
+
}
|
|
267
|
+
catch (e) {
|
|
268
|
+
log('error', 'Failed to start server', { error: e instanceof Error ? e.message : String(e) });
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
main();
|
|
273
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -48,8 +48,13 @@ export interface SearchOptions {
|
|
|
48
48
|
page?: number;
|
|
49
49
|
}
|
|
50
50
|
export interface PramptaConfig {
|
|
51
|
+
/** Your PRAMPTA API key (starts with "pk_") */
|
|
51
52
|
apiKey: string;
|
|
53
|
+
/** Base URL for the API (default: "https://prampta.com") */
|
|
52
54
|
baseUrl?: string;
|
|
55
|
+
/** Request timeout in milliseconds (default: 30000) */
|
|
53
56
|
timeoutMs?: number;
|
|
57
|
+
/** Maximum number of retries for failed requests (default: 3) */
|
|
58
|
+
maxRetries?: number;
|
|
54
59
|
}
|
|
55
60
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;CAAG;AAElE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;CAAG;AAElE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
package/package.json
CHANGED
|
@@ -1,42 +1,69 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prampta/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Official Node.js
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Official Node.js SDK for PRAMPTA — create, search, and manage AI prompts. Includes built-in MCP server for Claude, Cursor and other AI assistants.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"prampta-mcp": "./dist/mcp.js"
|
|
10
|
+
},
|
|
8
11
|
"exports": {
|
|
9
12
|
".": {
|
|
10
13
|
"import": "./dist/index.js",
|
|
11
|
-
"types": "./dist/index.d.ts"
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
},
|
|
17
|
+
"./mcp": {
|
|
18
|
+
"import": "./dist/mcp.js",
|
|
19
|
+
"types": "./dist/mcp.d.ts"
|
|
12
20
|
}
|
|
13
21
|
},
|
|
14
22
|
"files": [
|
|
15
|
-
"dist"
|
|
23
|
+
"dist",
|
|
24
|
+
"README.md"
|
|
16
25
|
],
|
|
17
26
|
"scripts": {
|
|
18
27
|
"build": "tsc",
|
|
19
28
|
"test": "node --import tsx --test src/client.test.ts",
|
|
20
|
-
"prepublishOnly": "npm run build"
|
|
29
|
+
"prepublishOnly": "npm run build",
|
|
30
|
+
"typecheck": "tsc --noEmit"
|
|
21
31
|
},
|
|
22
32
|
"keywords": [
|
|
23
33
|
"prampta",
|
|
24
34
|
"prompt",
|
|
25
35
|
"pp-code",
|
|
26
36
|
"ai",
|
|
27
|
-
"llm"
|
|
37
|
+
"llm",
|
|
38
|
+
"mcp",
|
|
39
|
+
"model-context-protocol",
|
|
40
|
+
"claude",
|
|
41
|
+
"cursor",
|
|
42
|
+
"prompt-engineering",
|
|
43
|
+
"ai-prompts",
|
|
44
|
+
"sdk"
|
|
28
45
|
],
|
|
46
|
+
"author": "PRAMPTA Team",
|
|
29
47
|
"license": "MIT",
|
|
30
48
|
"repository": {
|
|
31
49
|
"type": "git",
|
|
32
50
|
"url": "https://github.com/prampta/prampta"
|
|
33
51
|
},
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/prampta/prampta/issues"
|
|
54
|
+
},
|
|
34
55
|
"homepage": "https://prampta.com",
|
|
35
56
|
"engines": {
|
|
36
57
|
"node": ">=18"
|
|
37
58
|
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
61
|
+
"zod": "^3.24.2"
|
|
62
|
+
},
|
|
38
63
|
"devDependencies": {
|
|
39
64
|
"tsx": "^4.21.0",
|
|
40
65
|
"typescript": "^5.7.0"
|
|
41
|
-
}
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {},
|
|
68
|
+
"sideEffects": false
|
|
42
69
|
}
|