@prompt-ot/mcp 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.
@@ -0,0 +1,103 @@
1
+ import { z } from 'zod';
2
+ import { isPromptOTError } from '../lib/errors.js';
3
+ import { jsonContent, textContent } from '../lib/format.js';
4
+ /**
5
+ * MCP tool registrations for the /api/v1/variables endpoints.
6
+ *
7
+ * Each tool maps 1:1 to a public-api endpoint and uses inline Zod schemas
8
+ * (the MCP SDK 1.29 expects a ZodRawShapeCompat — a record of Zod schemas,
9
+ * not a wrapped ZodObject).
10
+ *
11
+ * All errors from PromptOTClient are caught and surfaced to the LLM as
12
+ * `isError: true` content blocks with human-readable hints from PromptOTError.
13
+ */
14
+ export function registerVariableTools(server, client) {
15
+ // ---------------------------------------------------------------------------
16
+ // list_variables
17
+ // ---------------------------------------------------------------------------
18
+ server.registerTool('list_variables', {
19
+ title: 'List variables for a prompt',
20
+ description: 'List all variables defined on a prompt. Returns each variable\'s id, key, default_value, and description. Variables are referenced as {{key}} in block content and substituted at compile time.',
21
+ inputSchema: {
22
+ prompt_id: z.string().uuid().describe('The UUID of the prompt whose variables to list.'),
23
+ },
24
+ }, async (args) => {
25
+ try {
26
+ const data = await client.get('/api/v1/variables', {
27
+ tool: 'list_variables',
28
+ query: { prompt_id: args.prompt_id },
29
+ });
30
+ return jsonContent({ count: data.length, variables: data });
31
+ }
32
+ catch (err) {
33
+ if (isPromptOTError(err))
34
+ return { content: err.toMcpContent(), isError: true };
35
+ throw err;
36
+ }
37
+ });
38
+ // ---------------------------------------------------------------------------
39
+ // upsert_variable
40
+ // ---------------------------------------------------------------------------
41
+ server.registerTool('upsert_variable', {
42
+ title: 'Create or update a variable',
43
+ description: 'Create or update a variable on a prompt. This endpoint upserts on (prompt_id, key) — calling it twice with the same key updates the existing variable instead of erroring. Returns the resulting variable.',
44
+ inputSchema: {
45
+ prompt_id: z.string().uuid().describe('The UUID of the prompt to attach the variable to.'),
46
+ key: z
47
+ .string()
48
+ .min(1)
49
+ .max(100)
50
+ .regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/)
51
+ .describe('Variable identifier — must match ^[a-zA-Z_][a-zA-Z0-9_]*$ (letters, digits, underscores; cannot start with a digit). Referenced as {{key}} in block content.'),
52
+ default_value: z
53
+ .string()
54
+ .optional()
55
+ .describe('Default value substituted when the variable is not overridden at compile time.'),
56
+ description: z
57
+ .string()
58
+ .max(500)
59
+ .optional()
60
+ .describe('Human-readable description of what the variable represents.'),
61
+ },
62
+ }, async (args) => {
63
+ try {
64
+ const data = await client.post('/api/v1/variables', args, { tool: 'upsert_variable' });
65
+ return {
66
+ content: [
67
+ {
68
+ type: 'text',
69
+ text: `Set variable "${data.key}" (id: ${data.id})\n\n${JSON.stringify(data, null, 2)}`,
70
+ },
71
+ ],
72
+ };
73
+ }
74
+ catch (err) {
75
+ if (isPromptOTError(err))
76
+ return { content: err.toMcpContent(), isError: true };
77
+ throw err;
78
+ }
79
+ });
80
+ // ---------------------------------------------------------------------------
81
+ // delete_variable
82
+ // ---------------------------------------------------------------------------
83
+ server.registerTool('delete_variable', {
84
+ title: 'Delete a variable',
85
+ description: 'Delete a variable definition from a prompt. Removes the variable definition but does NOT strip {{key}} references from block content — any unresolved {{key}} placeholders will remain in the compiled output until the blocks are edited. Always confirm with the user before calling this tool.',
86
+ inputSchema: {
87
+ variable_id: z.string().uuid().describe('The UUID of the variable to delete.'),
88
+ },
89
+ }, async (args) => {
90
+ try {
91
+ await client.delete(`/api/v1/variables/${args.variable_id}`, {
92
+ tool: 'delete_variable',
93
+ });
94
+ return textContent(`Variable ${args.variable_id} deleted.`);
95
+ }
96
+ catch (err) {
97
+ if (isPromptOTError(err))
98
+ return { content: err.toMcpContent(), isError: true };
99
+ throw err;
100
+ }
101
+ });
102
+ }
103
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/tools/variables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ import { z } from 'zod';
2
+ import { isPromptOTError } from '../lib/errors.js';
3
+ import { jsonContent, truncateText } from '../lib/format.js';
4
+ /**
5
+ * MCP tool registrations for the /api/v1/versions endpoints.
6
+ *
7
+ * Versions snapshot a prompt's blocks/variables/model_config at a point in
8
+ * time. Drafts can be promoted to `published` (which fires the
9
+ * `prompt.published` webhook and becomes the live one for production API key
10
+ * callers), and archived versions can be rolled back into a new draft.
11
+ *
12
+ * Compiled prompts on a version can be very long, so we run them through
13
+ * `truncateText` aggressively before returning them to the LLM.
14
+ */
15
+ export function registerVersionTools(server, client) {
16
+ // ---------------------------------------------------------------------------
17
+ // list_versions
18
+ // ---------------------------------------------------------------------------
19
+ server.registerTool('list_versions', {
20
+ title: 'List versions for a prompt',
21
+ description: 'List all versions (drafts, published, archived) for a prompt, ordered newest first. Each entry includes id, version_number, status, changelog_note, token_count, and created_at. Use diff_versions to compare two specific versions.',
22
+ inputSchema: {
23
+ prompt_id: z.string().uuid().describe('The UUID of the prompt to list versions for.'),
24
+ },
25
+ }, async (args) => {
26
+ try {
27
+ const data = await client.get('/api/v1/versions', {
28
+ tool: 'list_versions',
29
+ query: { prompt_id: args.prompt_id },
30
+ });
31
+ return jsonContent({ count: data.length, versions: data });
32
+ }
33
+ catch (err) {
34
+ if (isPromptOTError(err))
35
+ return { content: err.toMcpContent(), isError: true };
36
+ throw err;
37
+ }
38
+ });
39
+ // ---------------------------------------------------------------------------
40
+ // save_draft_version
41
+ // ---------------------------------------------------------------------------
42
+ server.registerTool('save_draft_version', {
43
+ title: 'Save a new draft version',
44
+ description: "Snapshot the prompt's current blocks, variables, and model config into a new draft version. Drafts are NOT live until published. Use this to checkpoint progress during prompt iteration so you can roll back later. Returns the new version with version_number and the compiled output.",
45
+ inputSchema: {
46
+ prompt_id: z.string().uuid().describe('The UUID of the prompt to snapshot.'),
47
+ changelog_note: z
48
+ .string()
49
+ .max(1000)
50
+ .optional()
51
+ .describe('Optional human-readable note describing what changed in this draft.'),
52
+ },
53
+ }, async (args) => {
54
+ try {
55
+ const data = await client.post('/api/v1/versions', { prompt_id: args.prompt_id, changelog_note: args.changelog_note }, { tool: 'save_draft_version' });
56
+ const truncated = truncateText(data.compiled_prompt, {
57
+ maxTokens: 1000,
58
+ fullTextHint: `Use the resource promptot://prompts/${data.prompt_id}/markdown for the full text.`,
59
+ });
60
+ const payload = {
61
+ id: data.id,
62
+ prompt_id: data.prompt_id,
63
+ version_number: data.version_number,
64
+ status: data.status,
65
+ changelog_note: data.changelog_note,
66
+ compiled_prompt: truncated,
67
+ token_count: data.token_count,
68
+ created_at: data.created_at,
69
+ };
70
+ return {
71
+ content: [
72
+ {
73
+ type: 'text',
74
+ text: `Saved draft v${data.version_number}\n\n${JSON.stringify(payload, null, 2)}`,
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ catch (err) {
80
+ if (isPromptOTError(err))
81
+ return { content: err.toMcpContent(), isError: true };
82
+ throw err;
83
+ }
84
+ });
85
+ // ---------------------------------------------------------------------------
86
+ // publish_version
87
+ // ---------------------------------------------------------------------------
88
+ server.registerTool('publish_version', {
89
+ title: 'Publish a draft version',
90
+ description: 'Promote a draft version to published status. Archives any previously published version. Fires the `prompt.published` webhook to all registered webhook endpoints. This makes the new version the live one for production API key callers. Always confirm with the user before publishing.',
91
+ inputSchema: {
92
+ version_id: z.string().uuid().describe('The UUID of the draft version to publish.'),
93
+ changelog_note: z
94
+ .string()
95
+ .max(1000)
96
+ .optional()
97
+ .describe('Optional changelog note for the published version (overwrites any existing note).'),
98
+ },
99
+ }, async (args) => {
100
+ try {
101
+ const data = await client.post(`/api/v1/versions/${args.version_id}/publish`, { changelog_note: args.changelog_note }, { tool: 'publish_version' });
102
+ const truncated = truncateText(data.compiled_prompt, {
103
+ maxTokens: 1000,
104
+ fullTextHint: `Use the resource promptot://prompts/${data.prompt_id}/markdown for the full text.`,
105
+ });
106
+ const payload = {
107
+ id: data.id,
108
+ prompt_id: data.prompt_id,
109
+ version_number: data.version_number,
110
+ status: data.status,
111
+ changelog_note: data.changelog_note,
112
+ compiled_prompt: truncated,
113
+ token_count: data.token_count,
114
+ created_at: data.created_at,
115
+ };
116
+ return {
117
+ content: [
118
+ {
119
+ type: 'text',
120
+ text: `Published v${data.version_number}\n\n${JSON.stringify(payload, null, 2)}`,
121
+ },
122
+ ],
123
+ };
124
+ }
125
+ catch (err) {
126
+ if (isPromptOTError(err))
127
+ return { content: err.toMcpContent(), isError: true };
128
+ throw err;
129
+ }
130
+ });
131
+ // ---------------------------------------------------------------------------
132
+ // rollback_to_version
133
+ // ---------------------------------------------------------------------------
134
+ server.registerTool('rollback_to_version', {
135
+ title: 'Roll back to an archived version',
136
+ description: "Restore an archived version's blocks and variables as a new draft. Does NOT publish — call publish_version on the resulting draft if you want to make it live. Cannot roll back to the currently published version.",
137
+ inputSchema: {
138
+ version_id: z.string().uuid().describe('The UUID of the archived version to roll back to.'),
139
+ },
140
+ }, async (args) => {
141
+ try {
142
+ const data = await client.post('/api/v1/versions/rollback', { version_id: args.version_id }, { tool: 'rollback_to_version' });
143
+ const truncated = truncateText(data.compiled_prompt, {
144
+ maxTokens: 1000,
145
+ fullTextHint: `Use the resource promptot://prompts/${data.prompt_id}/markdown for the full text.`,
146
+ });
147
+ const payload = {
148
+ id: data.id,
149
+ prompt_id: data.prompt_id,
150
+ version_number: data.version_number,
151
+ status: data.status,
152
+ changelog_note: data.changelog_note,
153
+ compiled_prompt: truncated,
154
+ token_count: data.token_count,
155
+ created_at: data.created_at,
156
+ };
157
+ return {
158
+ content: [
159
+ {
160
+ type: 'text',
161
+ text: `Rolled back to a new draft v${data.version_number}\n\n${JSON.stringify(payload, null, 2)}`,
162
+ },
163
+ ],
164
+ };
165
+ }
166
+ catch (err) {
167
+ if (isPromptOTError(err))
168
+ return { content: err.toMcpContent(), isError: true };
169
+ throw err;
170
+ }
171
+ });
172
+ // ---------------------------------------------------------------------------
173
+ // diff_versions
174
+ // ---------------------------------------------------------------------------
175
+ server.registerTool('diff_versions', {
176
+ title: 'Diff two versions of a prompt',
177
+ description: "Fetch the snapshots of two versions side-by-side so the LLM can compute a diff. Returns each version's blocks, variables, and model_config. Both versions must belong to the same project as the API key.",
178
+ inputSchema: {
179
+ version_a_id: z.string().uuid().describe('The UUID of the first version (the "before").'),
180
+ version_b_id: z.string().uuid().describe('The UUID of the second version (the "after").'),
181
+ },
182
+ }, async (args) => {
183
+ try {
184
+ const data = await client.get('/api/v1/versions/diff', {
185
+ tool: 'diff_versions',
186
+ query: { a: args.version_a_id, b: args.version_b_id },
187
+ });
188
+ return jsonContent(data);
189
+ }
190
+ catch (err) {
191
+ if (isPromptOTError(err))
192
+ return { content: err.toMcpContent(), isError: true };
193
+ throw err;
194
+ }
195
+ });
196
+ }
197
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/tools/versions.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@prompt-ot/mcp",
3
+ "version": "0.1.0",
4
+ "description": "Model Context Protocol server for PromptOT — manage, edit, and publish prompts from Claude Desktop, Cursor, Codex, ChatGPT, and any other MCP-compatible AI tool.",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcp": "./dist/stdio.js"
8
+ },
9
+ "main": "./dist/stdio.js",
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "dependencies": {
15
+ "@modelcontextprotocol/sdk": "^1.29.0",
16
+ "express": "^4.21.2",
17
+ "zod": "^3.23.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/express": "^5.0.0",
21
+ "@types/node": "^22.0.0",
22
+ "tsx": "^4.19.0",
23
+ "typescript": "^5.9.0",
24
+ "vitest": "^2.1.0"
25
+ },
26
+ "engines": {
27
+ "node": ">=20"
28
+ },
29
+ "keywords": [
30
+ "mcp",
31
+ "model-context-protocol",
32
+ "promptot",
33
+ "prompt-management",
34
+ "llm",
35
+ "claude",
36
+ "cursor",
37
+ "codex"
38
+ ],
39
+ "homepage": "https://www.promptot.com/mcp",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/appdevexpert/prompt-ot.git",
43
+ "directory": "apps/mcp"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/appdevexpert/prompt-ot/issues"
47
+ },
48
+ "author": "PromptOT",
49
+ "license": "MIT",
50
+ "publishConfig": {
51
+ "access": "public"
52
+ },
53
+ "scripts": {
54
+ "dev:stdio": "tsx watch src/stdio.ts",
55
+ "dev:http": "tsx watch src/http.ts",
56
+ "build": "tsc",
57
+ "typecheck": "tsc --noEmit",
58
+ "test": "vitest run",
59
+ "clean": "rm -rf dist"
60
+ }
61
+ }