@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 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): Promise<Prompt>;
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): Promise<PromptMetadata>;
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(options?: SearchOptions): Promise<SearchResult>;
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(options: CreateOptions): Promise<CreateResult>;
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(): Promise<Prompt[]>;
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): Promise<{
59
+ register(ppCode: string, options?: {
60
+ signal?: AbortSignal;
61
+ }): Promise<{
33
62
  registered: boolean;
34
63
  prompt: Prompt;
35
64
  }>;
36
- }
37
- export declare class PramptaError extends Error {
38
- readonly status: number;
39
- constructor(message: string, status: number);
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
@@ -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;AAEpB,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,EAAE,aAAa;YAOnB,OAAO;IAgDrB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAInD;;OAEG;IACG,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAUhE;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAI3D;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAGjF;AAED,qBAAa,YAAa,SAAQ,KAAK;aACQ,MAAM,EAAE,MAAM;gBAA/C,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAI5D"}
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 Error('apiKey is required');
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 ?? 30_000;
28
+ this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
29
+ this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;
11
30
  }
12
- async request(method, path, body) {
13
- const headers = {
14
- 'Authorization': `Bearer ${this.apiKey}`,
15
- };
16
- if (body)
17
- headers['Content-Type'] = 'application/json';
18
- const controller = new AbortController();
19
- const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
20
- let res;
21
- try {
22
- res = await fetch(`${this.baseUrl}${path}`, {
23
- method,
24
- headers,
25
- body: body ? JSON.stringify(body) : undefined,
26
- signal: controller.signal,
27
- });
28
- }
29
- catch (e) {
30
- if (e instanceof Error && e.name === 'AbortError') {
31
- throw new PramptaError(`Request timed out after ${this.timeoutMs}ms`, 0);
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
- return data;
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
- return this.request('GET', `/api/decode?code=${encodeURIComponent(code)}`);
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
- return this.request('GET', `/api/lookup?code=${encodeURIComponent(code)}`);
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(options = {}) {
147
+ async search(searchOptions = {}, requestOptions) {
75
148
  const params = new URLSearchParams();
76
- if (options.query)
77
- params.set('search', options.query);
78
- if (options.category)
79
- params.set('category', options.category);
80
- if (options.limit)
81
- params.set('limit', String(options.limit));
82
- if (options.page)
83
- params.set('page', String(options.page));
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/library${qs ? `?${qs}` : ''}`);
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(options) {
91
- return this.request('POST', '/api/create', options);
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
- return this.request('POST', '/api/register', { ppCode });
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
- export class PramptaError extends Error {
107
- status;
108
- constructor(message, status) {
109
- super(message);
110
- this.status = status;
111
- this.name = 'PramptaError';
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
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -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
@@ -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
@@ -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;CACpB"}
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.1.1",
4
- "description": "Official Node.js client for the PRAMPTA API — create, search, and manage prompts",
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
  }