pulsar-deploy-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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pulsar Deploy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # Pulsar Deploy MCP Server
2
+
3
+ An MCP (Model Context Protocol) server that lets AI agents — Claude Desktop,
4
+ Cline, Continue, Cursor — drive a Pulsar Deploy account directly. Ask Claude
5
+ "deploy my-app" or "spin up a Postgres for the api project" and it just works.
6
+
7
+ ## Setup
8
+
9
+ 1. **Get a token.** Sign in to https://pulsardeploy.com → Settings → Tokens →
10
+ Create. Copy the `pulsar_xxxxxxxx` value.
11
+
12
+ 2. **Add to your MCP client config.** Example for Claude Desktop
13
+ (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS
14
+ or `%APPDATA%\Claude\claude_desktop_config.json` on Windows):
15
+
16
+ ```json
17
+ {
18
+ "mcpServers": {
19
+ "pulsar-deploy": {
20
+ "command": "npx",
21
+ "args": ["-y", "pulsar-deploy-mcp"],
22
+ "env": {
23
+ "PULSAR_API_TOKEN": "pulsar_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
24
+ "PULSAR_API_URL": "https://api.pulsardeploy.com"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ 3. **Restart your MCP client.** Open a new chat and try:
32
+ - "what projects do I have on pulsar?"
33
+ - "deploy `my-app`"
34
+ - "tail the logs for that deployment"
35
+ - "create a postgres database called `api-db` and attach it to `my-app`"
36
+
37
+ `PULSAR_API_URL` is optional — defaults to the hosted Pulsar Deploy. Self-hosted
38
+ users set it to their own API origin.
39
+
40
+ ## What's exposed
41
+
42
+ The server intentionally surfaces high-level intent rather than every REST
43
+ route. 22 tools cover the day-to-day:
44
+
45
+ | Tool | What it does |
46
+ | ---------------------------- | ------------------------------------------------------------------- |
47
+ | `list_projects` | All your projects with live URL + last deploy status |
48
+ | `get_project` | One project, full config + last 10 deploys |
49
+ | `create_project_from_github` | Paste a GitHub URL — framework auto-detected, build config inferred |
50
+ | `delete_project` | Destructive; confirm with user |
51
+ | `deploy` | Trigger production deploy at HEAD |
52
+ | `get_deployment` | Status, URL, duration, error |
53
+ | `tail_logs` | Last N build log lines for a deployment |
54
+ | `search_logs` | Substring-match across all stored build/deploy logs |
55
+ | `rollback` | Roll back to previous live deploy |
56
+ | `list_env_vars` | Masked — safe to show user |
57
+ | `set_env_var` / `delete_env_var` | Encrypted server-side; effect on next deploy |
58
+ | `list_databases` | Managed Postgres / MySQL / Redis / Mongo / PocketBase |
59
+ | `create_database` | Auto-links `DATABASE_URL` (or equivalent) to a named project |
60
+ | `get_connection_string` | Owner-only |
61
+ | `run_sql` | Against a managed Postgres/MySQL — DROP DATABASE/ROLE blocked |
62
+ | `restart_database` | Stop + start a managed instance |
63
+ | `list_domains` / `add_domain` | Custom domains + DNS instructions |
64
+ | `wake_project` | Wake the most recent sleeping deployment |
65
+ | `get_resource_stats` | CPU / memory / network for a project's live container |
66
+ | `health_summary` | One-shot status across every project |
67
+
68
+ The handler accepts project / database arguments as either UUIDs or names, so
69
+ the AI doesn't need to round-trip via `list_projects` every time.
70
+
71
+ ## Self-hosting / development
72
+
73
+ ```bash
74
+ cd packages/mcp-server
75
+ npm install
76
+ npm run dev # tsx watch
77
+ # or
78
+ npm run build && node dist/index.js
79
+ ```
80
+
81
+ ## Security
82
+
83
+ - Auth is your Personal Access Token. Treat it like a password — anyone with
84
+ it can deploy / delete / read env vars in your account.
85
+ - The server runs locally in your MCP client's process. The token never leaves
86
+ your machine except in the `Authorization: Bearer ...` header to your
87
+ configured `PULSAR_API_URL`.
88
+ - `delete_project` and `delete_env_var` are flagged "destructive" in the tool
89
+ descriptions — well-behaved AI clients will confirm with you first.
package/dist/api.js ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Thin fetch wrapper around the Pulsar Deploy REST API. Bearer auth via
3
+ * PULSAR_API_TOKEN; base URL from PULSAR_API_URL (defaults to the hosted
4
+ * Pulsar Deploy API). Errors are normalized to throw with a useful message.
5
+ */
6
+ const DEFAULT_BASE = "https://api.pulsardeploy.com";
7
+ export function ctxFromEnv() {
8
+ const token = process.env.PULSAR_API_TOKEN || "";
9
+ if (!token) {
10
+ throw new Error("PULSAR_API_TOKEN is not set. Create a Personal Access Token at " +
11
+ "https://pulsardeploy.com/settings → Tokens and add it to your MCP " +
12
+ "client config as the `PULSAR_API_TOKEN` env var.");
13
+ }
14
+ const baseUrl = (process.env.PULSAR_API_URL || DEFAULT_BASE).replace(/\/+$/, "");
15
+ return { baseUrl, token };
16
+ }
17
+ export async function api(ctx, path, opts = {}) {
18
+ const url = new URL(ctx.baseUrl + path);
19
+ if (opts.query) {
20
+ for (const [k, v] of Object.entries(opts.query)) {
21
+ if (v !== undefined && v !== null)
22
+ url.searchParams.set(k, String(v));
23
+ }
24
+ }
25
+ const headers = {
26
+ Authorization: `Bearer ${ctx.token}`,
27
+ Accept: "application/json",
28
+ "User-Agent": "pulsar-deploy-mcp/0.1",
29
+ };
30
+ if (opts.body !== undefined)
31
+ headers["Content-Type"] = "application/json";
32
+ const r = await fetch(url.toString(), {
33
+ method: opts.method ?? "GET",
34
+ headers,
35
+ body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
36
+ });
37
+ const text = await r.text();
38
+ let parsed;
39
+ try {
40
+ parsed = text ? JSON.parse(text) : undefined;
41
+ }
42
+ catch {
43
+ parsed = text;
44
+ }
45
+ if (!r.ok) {
46
+ const msg = parsed?.error ||
47
+ (typeof parsed === "string" ? parsed : `HTTP ${r.status}`);
48
+ throw new Error(`${path}: ${msg}`);
49
+ }
50
+ // Pulsar's convention is { ok: true, data: ... }. Unwrap when present.
51
+ if (parsed && typeof parsed === "object" && "ok" in parsed && "data" in parsed) {
52
+ return parsed.data;
53
+ }
54
+ return parsed;
55
+ }
56
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAOpD,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,iEAAiE;YAC/D,oEAAoE;YACpE,kDAAkD,CACrD,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,GAAe,EACf,IAAY,EACZ,OAAoB,EAAE;IAEtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,GAAG,CAAC,KAAK,EAAE;QACpC,MAAM,EAAE,kBAAkB;QAC1B,YAAY,EAAE,uBAAuB;KACtC,CAAC;IACF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAE1E,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACpC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAC5B,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACtE,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,GAAG,GACN,MAAc,EAAE,KAAK;YACtB,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,uEAAuE;IACvE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,IAAI,IAAK,MAAc,IAAI,MAAM,IAAK,MAAc,EAAE,CAAC;QACjG,OAAQ,MAAc,CAAC,IAAS,CAAC;IACnC,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Pulsar Deploy MCP server (stdio transport).
4
+ *
5
+ * $ PULSAR_API_TOKEN=pulsar_... pulsar-mcp
6
+ *
7
+ * Wire it into your MCP client (Claude Desktop, Cline, Continue, etc.) by
8
+ * adding to the client's config:
9
+ *
10
+ * {
11
+ * "mcpServers": {
12
+ * "pulsar-deploy": {
13
+ * "command": "npx",
14
+ * "args": ["-y", "pulsar-deploy-mcp"],
15
+ * "env": {
16
+ * "PULSAR_API_TOKEN": "pulsar_xxxxxxxxxxxx",
17
+ * "PULSAR_API_URL": "https://api.pulsardeploy.com"
18
+ * }
19
+ * }
20
+ * }
21
+ * }
22
+ */
23
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
24
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
25
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
26
+ import { ctxFromEnv } from "./api.js";
27
+ import { tools, findTool } from "./tools.js";
28
+ async function main() {
29
+ // Resolve credentials early so we fail fast if the token is missing.
30
+ const ctx = ctxFromEnv();
31
+ const server = new Server({ name: "pulsar-deploy", version: "0.1.0" }, { capabilities: { tools: {} } });
32
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
33
+ tools: tools.map((t) => ({
34
+ name: t.name,
35
+ description: t.description,
36
+ inputSchema: t.inputSchema,
37
+ })),
38
+ }));
39
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
40
+ const tool = findTool(req.params.name);
41
+ if (!tool) {
42
+ return {
43
+ isError: true,
44
+ content: [{ type: "text", text: `Unknown tool: ${req.params.name}` }],
45
+ };
46
+ }
47
+ const parse = tool.zod.safeParse(req.params.arguments ?? {});
48
+ if (!parse.success) {
49
+ return {
50
+ isError: true,
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: `Invalid arguments: ${parse.error.errors.map((e) => `${e.path.join(".")} ${e.message}`).join("; ")}`,
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ try {
60
+ const result = await tool.handler(ctx, parse.data);
61
+ return {
62
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
63
+ };
64
+ }
65
+ catch (err) {
66
+ const msg = err instanceof Error ? err.message : String(err);
67
+ return { isError: true, content: [{ type: "text", text: msg }] };
68
+ }
69
+ });
70
+ const transport = new StdioServerTransport();
71
+ await server.connect(transport);
72
+ // The transport keeps the process alive on stdin; nothing more to do.
73
+ }
74
+ main().catch((err) => {
75
+ process.stderr.write(`pulsar-mcp fatal: ${err?.message ?? err}\n`);
76
+ process.exit(1);
77
+ });
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/tools.js ADDED
@@ -0,0 +1,437 @@
1
+ /**
2
+ * Tool definitions exposed to MCP clients. High-level, intent-oriented.
3
+ * Each tool has:
4
+ * - name : kebab-case identifier the AI invokes
5
+ * - description : 1-2 sentences in the AI's voice — when and why to use this
6
+ * - inputSchema : JSON Schema for arguments (also enforced via Zod in handler)
7
+ * - handler : async fn taking (ctx, args) → arbitrary JSON-serializable result
8
+ *
9
+ * Keep the surface small and obvious. Adding a tool for every REST route would
10
+ * overwhelm the model; instead we wrap common workflows.
11
+ */
12
+ import { z } from "zod";
13
+ import { api } from "./api.js";
14
+ // ── Helpers ──────────────────────────────────────────────────────────────────
15
+ async function resolveProjectId(ctx, idOrName) {
16
+ // Accept either a UUID or a project name.
17
+ if (/^[0-9a-f-]{36}$/i.test(idOrName))
18
+ return idOrName;
19
+ const projects = await api(ctx, "/api/projects");
20
+ const match = projects.find((p) => p.name === idOrName);
21
+ if (!match)
22
+ throw new Error(`No project named "${idOrName}". Use list_projects to see names.`);
23
+ return match.id;
24
+ }
25
+ async function resolveInstanceId(ctx, idOrName) {
26
+ if (/^[0-9a-f-]{36}$/i.test(idOrName))
27
+ return idOrName;
28
+ const insts = await api(ctx, "/api/instances");
29
+ const match = insts.find((i) => i.name === idOrName);
30
+ if (!match)
31
+ throw new Error(`No database named "${idOrName}". Use list_databases to see names.`);
32
+ return match.id;
33
+ }
34
+ const projectRef = z.string().describe("Project UUID or unique project name");
35
+ const dbRef = z.string().describe("Database/instance UUID or unique name");
36
+ // ── Tools ────────────────────────────────────────────────────────────────────
37
+ export const tools = [
38
+ // Projects
39
+ {
40
+ name: "list_projects",
41
+ description: "List the user's projects with current status (live URL, last deploy status, deploy count). Call this first when the user mentions a project by name and you need to find its ID.",
42
+ inputSchema: { type: "object", properties: {} },
43
+ zod: z.object({}),
44
+ handler: async (ctx) => api(ctx, "/api/projects"),
45
+ },
46
+ {
47
+ name: "get_project",
48
+ description: "Get full details for one project: build config, framework, branch, last 10 deploys, live URL.",
49
+ inputSchema: {
50
+ type: "object",
51
+ properties: { project: { type: "string", description: "Project UUID or name" } },
52
+ required: ["project"],
53
+ },
54
+ zod: z.object({ project: projectRef }),
55
+ handler: async (ctx, { project }) => {
56
+ const id = await resolveProjectId(ctx, project);
57
+ const [proj, deploys] = await Promise.all([
58
+ api(ctx, `/api/projects/${id}`),
59
+ api(ctx, `/api/projects/${id}/deployments`, { query: { limit: 10 } }),
60
+ ]);
61
+ return { project: proj, recent_deploys: deploys };
62
+ },
63
+ },
64
+ {
65
+ name: "create_project_from_github",
66
+ description: "Create a new project from a public GitHub repo URL. The server auto-detects the framework (Next.js, Vite, etc.) and fills in build cmd / install cmd / output dir. Returns the new project — the user can then call `deploy` to ship it.",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {
70
+ url: { type: "string", description: "GitHub repo URL, e.g. https://github.com/owner/repo" },
71
+ name: { type: "string", description: "Optional project name (defaults to repo name)" },
72
+ branch: { type: "string", description: "Optional branch (defaults to main)" },
73
+ },
74
+ required: ["url"],
75
+ },
76
+ zod: z.object({
77
+ url: z.string().url(),
78
+ name: z.string().min(1).max(60).regex(/^[a-z0-9-]+$/).optional(),
79
+ branch: z.string().optional(),
80
+ }),
81
+ handler: async (ctx, { url, name, branch }) => api(ctx, "/api/projects/from-url", { method: "POST", body: { url, name, branch } }),
82
+ },
83
+ {
84
+ name: "delete_project",
85
+ description: "Permanently delete a project and stop its live container. Destructive — confirm with the user before calling.",
86
+ inputSchema: {
87
+ type: "object",
88
+ properties: { project: { type: "string" } },
89
+ required: ["project"],
90
+ },
91
+ zod: z.object({ project: projectRef }),
92
+ handler: async (ctx, { project }) => {
93
+ const id = await resolveProjectId(ctx, project);
94
+ return api(ctx, `/api/projects/${id}`, { method: "DELETE" });
95
+ },
96
+ },
97
+ // Deploys
98
+ {
99
+ name: "deploy",
100
+ description: "Trigger a production deploy of the project at HEAD of its default branch. Returns the new deployment ID — pass it to `get_deployment` or `tail_logs` to watch progress.",
101
+ inputSchema: {
102
+ type: "object",
103
+ properties: {
104
+ project: { type: "string" },
105
+ commit_sha: { type: "string", description: "Optional specific SHA; defaults to HEAD" },
106
+ },
107
+ required: ["project"],
108
+ },
109
+ zod: z.object({ project: projectRef, commit_sha: z.string().optional() }),
110
+ handler: async (ctx, { project, commit_sha }) => {
111
+ const id = await resolveProjectId(ctx, project);
112
+ return api(ctx, `/api/projects/${id}/deploy`, {
113
+ method: "POST",
114
+ body: commit_sha ? { commit_sha } : {},
115
+ });
116
+ },
117
+ },
118
+ {
119
+ name: "get_deployment",
120
+ description: "Get deployment status (queued → building → deploying → live / failed / rolled_back), URL when live, duration, error message if failed.",
121
+ inputSchema: {
122
+ type: "object",
123
+ properties: { project: { type: "string" }, deployment_id: { type: "string" } },
124
+ required: ["project", "deployment_id"],
125
+ },
126
+ zod: z.object({ project: projectRef, deployment_id: z.string().uuid() }),
127
+ handler: async (ctx, { project, deployment_id }) => {
128
+ const id = await resolveProjectId(ctx, project);
129
+ return api(ctx, `/api/projects/${id}/deployments/${deployment_id}`);
130
+ },
131
+ },
132
+ {
133
+ name: "tail_logs",
134
+ description: "Return the last N build/runtime log lines for a deployment. Use limit=200 for a quick scan, up to 1000 for deeper debugging.",
135
+ inputSchema: {
136
+ type: "object",
137
+ properties: {
138
+ project: { type: "string" },
139
+ deployment_id: { type: "string" },
140
+ limit: { type: "number", description: "Lines to return, 1–1000 (default 200)" },
141
+ },
142
+ required: ["project", "deployment_id"],
143
+ },
144
+ zod: z.object({
145
+ project: projectRef,
146
+ deployment_id: z.string().uuid(),
147
+ limit: z.number().int().min(1).max(1000).default(200),
148
+ }),
149
+ handler: async (ctx, { project, deployment_id, limit }) => {
150
+ const id = await resolveProjectId(ctx, project);
151
+ return api(ctx, `/api/projects/${id}/deployments/${deployment_id}/logs`, {
152
+ query: { limit },
153
+ });
154
+ },
155
+ },
156
+ {
157
+ name: "rollback",
158
+ description: "Roll back a project to its previous live deployment (or a specific target). Triggers a rebuild from that commit.",
159
+ inputSchema: {
160
+ type: "object",
161
+ properties: {
162
+ project: { type: "string" },
163
+ target_deployment_id: {
164
+ type: "string",
165
+ description: "Optional — defaults to the most recent rolled_back deploy",
166
+ },
167
+ },
168
+ required: ["project"],
169
+ },
170
+ zod: z.object({ project: projectRef, target_deployment_id: z.string().uuid().optional() }),
171
+ handler: async (ctx, { project, target_deployment_id }) => {
172
+ const id = await resolveProjectId(ctx, project);
173
+ let targetId = target_deployment_id;
174
+ if (!targetId) {
175
+ const deploys = await api(ctx, `/api/projects/${id}/deployments`, { query: { limit: 20 } });
176
+ const prev = deploys.find((d) => d.status === "rolled_back");
177
+ if (!prev)
178
+ throw new Error("No previous deploy to roll back to.");
179
+ targetId = prev.id;
180
+ }
181
+ return api(ctx, `/api/projects/${id}/deployments/${targetId}/rollback`, { method: "POST" });
182
+ },
183
+ },
184
+ // Env vars
185
+ {
186
+ name: "list_env_vars",
187
+ description: "List env vars for a project. Values are masked (first 2 + last 2 chars only) so this is safe to show the user.",
188
+ inputSchema: {
189
+ type: "object",
190
+ properties: {
191
+ project: { type: "string" },
192
+ environment: {
193
+ type: "string",
194
+ enum: ["production", "preview", "all"],
195
+ description: "Which environment scope (default: production)",
196
+ },
197
+ },
198
+ required: ["project"],
199
+ },
200
+ zod: z.object({
201
+ project: projectRef,
202
+ environment: z.enum(["production", "preview", "all"]).default("production"),
203
+ }),
204
+ handler: async (ctx, { project, environment }) => {
205
+ const id = await resolveProjectId(ctx, project);
206
+ return api(ctx, `/api/projects/${id}/env`, { query: { environment } });
207
+ },
208
+ },
209
+ {
210
+ name: "set_env_var",
211
+ description: "Create or update an env var on a project. The value is encrypted server-side. Setting takes effect on the NEXT deploy — call `deploy` after to apply.",
212
+ inputSchema: {
213
+ type: "object",
214
+ properties: {
215
+ project: { type: "string" },
216
+ key: { type: "string", description: "Env var name, e.g. STRIPE_KEY" },
217
+ value: { type: "string" },
218
+ environment: { type: "string", enum: ["production", "preview", "all"] },
219
+ },
220
+ required: ["project", "key", "value"],
221
+ },
222
+ zod: z.object({
223
+ project: projectRef,
224
+ key: z.string().regex(/^[A-Z_][A-Z0-9_]*$/, "Env var keys must be UPPER_SNAKE_CASE"),
225
+ value: z.string(),
226
+ environment: z.enum(["production", "preview", "all"]).default("production"),
227
+ }),
228
+ handler: async (ctx, { project, key, value, environment }) => {
229
+ const id = await resolveProjectId(ctx, project);
230
+ return api(ctx, `/api/projects/${id}/env`, {
231
+ method: "POST",
232
+ body: { key, value, environment },
233
+ });
234
+ },
235
+ },
236
+ {
237
+ name: "delete_env_var",
238
+ description: "Remove an env var from a project. Takes effect on the next deploy.",
239
+ inputSchema: {
240
+ type: "object",
241
+ properties: { project: { type: "string" }, key: { type: "string" } },
242
+ required: ["project", "key"],
243
+ },
244
+ zod: z.object({ project: projectRef, key: z.string() }),
245
+ handler: async (ctx, { project, key }) => {
246
+ const id = await resolveProjectId(ctx, project);
247
+ return api(ctx, `/api/projects/${id}/env/${encodeURIComponent(key)}`, { method: "DELETE" });
248
+ },
249
+ },
250
+ // Databases
251
+ {
252
+ name: "list_databases",
253
+ description: "List managed database/backend instances (Postgres, MySQL, Redis, Mongo, PocketBase) the user owns.",
254
+ inputSchema: { type: "object", properties: {} },
255
+ zod: z.object({}),
256
+ handler: async (ctx) => api(ctx, "/api/instances"),
257
+ },
258
+ {
259
+ name: "create_database",
260
+ description: "Provision a new managed database. Type one of: postgres, mysql, redis, mongodb, pocketbase. Size one of: nano, micro, small, medium. If a project is named, the connection string is auto-injected into that project's env vars on the matching key (DATABASE_URL for postgres, REDIS_URL for redis, etc.).",
261
+ inputSchema: {
262
+ type: "object",
263
+ properties: {
264
+ name: { type: "string" },
265
+ type: { type: "string", enum: ["postgres", "mysql", "redis", "mongodb", "pocketbase"] },
266
+ size: { type: "string", enum: ["nano", "micro", "small", "medium"] },
267
+ project: { type: "string", description: "Optional project to auto-link" },
268
+ },
269
+ required: ["name", "type"],
270
+ },
271
+ zod: z.object({
272
+ name: z.string().min(1).max(60),
273
+ type: z.enum(["postgres", "mysql", "redis", "mongodb", "pocketbase"]),
274
+ size: z.enum(["nano", "micro", "small", "medium"]).default("nano"),
275
+ project: projectRef.optional(),
276
+ }),
277
+ handler: async (ctx, { name, type, size, project }) => {
278
+ const project_id = project ? await resolveProjectId(ctx, project) : undefined;
279
+ return api(ctx, "/api/instances", {
280
+ method: "POST",
281
+ body: { name, type, size, project_id },
282
+ });
283
+ },
284
+ },
285
+ {
286
+ name: "get_connection_string",
287
+ description: "Get the connection string for a managed database instance. Owner-only; do not leak in shared contexts.",
288
+ inputSchema: {
289
+ type: "object",
290
+ properties: { database: { type: "string" } },
291
+ required: ["database"],
292
+ },
293
+ zod: z.object({ database: dbRef }),
294
+ handler: async (ctx, { database }) => {
295
+ const id = await resolveInstanceId(ctx, database);
296
+ return api(ctx, `/api/instances/${id}/connection-string`);
297
+ },
298
+ },
299
+ {
300
+ name: "run_sql",
301
+ description: "Run a SQL query against a managed Postgres or MySQL instance. The connection is the owner-level role — RLS is bypassed. Returns rows and execution time. Dangerous statements like DROP DATABASE / DROP ROLE are blocked.",
302
+ inputSchema: {
303
+ type: "object",
304
+ properties: {
305
+ database: { type: "string" },
306
+ sql: { type: "string", description: "SQL query (single statement or batch)" },
307
+ },
308
+ required: ["database", "sql"],
309
+ },
310
+ zod: z.object({ database: dbRef, sql: z.string().min(1) }),
311
+ handler: async (ctx, { database, sql }) => {
312
+ const id = await resolveInstanceId(ctx, database);
313
+ return api(ctx, `/api/instances/${id}/sql`, { method: "POST", body: { sql } });
314
+ },
315
+ },
316
+ // Domains
317
+ {
318
+ name: "list_domains",
319
+ description: "List custom domains attached to a project, with SSL status.",
320
+ inputSchema: {
321
+ type: "object",
322
+ properties: { project: { type: "string" } },
323
+ required: ["project"],
324
+ },
325
+ zod: z.object({ project: projectRef }),
326
+ handler: async (ctx, { project }) => {
327
+ const id = await resolveProjectId(ctx, project);
328
+ return api(ctx, `/api/projects/${id}/domains`);
329
+ },
330
+ },
331
+ {
332
+ name: "add_domain",
333
+ description: "Attach a custom domain to a project. The user must point DNS at the Pulsar IP first (give them the CNAME/A record from the response).",
334
+ inputSchema: {
335
+ type: "object",
336
+ properties: {
337
+ project: { type: "string" },
338
+ domain: { type: "string", description: "Bare hostname, e.g. app.example.com" },
339
+ },
340
+ required: ["project", "domain"],
341
+ },
342
+ zod: z.object({
343
+ project: projectRef,
344
+ domain: z.string().regex(/^[a-z0-9.-]+\.[a-z]{2,}$/i, "Invalid domain"),
345
+ }),
346
+ handler: async (ctx, { project, domain }) => {
347
+ const id = await resolveProjectId(ctx, project);
348
+ return api(ctx, `/api/projects/${id}/domains`, { method: "POST", body: { domain } });
349
+ },
350
+ },
351
+ // Lifecycle
352
+ {
353
+ name: "restart_database",
354
+ description: "Restart a managed database/backend instance. Useful after running a long migration, or to recover an instance whose container has crashed.",
355
+ inputSchema: {
356
+ type: "object",
357
+ properties: { database: { type: "string" } },
358
+ required: ["database"],
359
+ },
360
+ zod: z.object({ database: dbRef }),
361
+ handler: async (ctx, { database }) => {
362
+ const id = await resolveInstanceId(ctx, database);
363
+ return api(ctx, `/api/instances/${id}/restart`, { method: "POST" });
364
+ },
365
+ },
366
+ {
367
+ name: "wake_project",
368
+ description: "Wake the most recent sleeping deployment of a project. Pulsar auto-sleeps idle containers to save resources; this brings them back online.",
369
+ inputSchema: {
370
+ type: "object",
371
+ properties: { project: { type: "string" } },
372
+ required: ["project"],
373
+ },
374
+ zod: z.object({ project: projectRef }),
375
+ handler: async (ctx, { project }) => {
376
+ const id = await resolveProjectId(ctx, project);
377
+ return api(ctx, `/api/projects/${id}/resources/wake`, { method: "POST" });
378
+ },
379
+ },
380
+ {
381
+ name: "get_resource_stats",
382
+ description: "Get CPU, memory, and network stats for a project's live container. Includes whether it's currently sleeping.",
383
+ inputSchema: {
384
+ type: "object",
385
+ properties: { project: { type: "string" } },
386
+ required: ["project"],
387
+ },
388
+ zod: z.object({ project: projectRef }),
389
+ handler: async (ctx, { project }) => {
390
+ const id = await resolveProjectId(ctx, project);
391
+ return api(ctx, `/api/projects/${id}/resources`);
392
+ },
393
+ },
394
+ {
395
+ name: "search_logs",
396
+ description: "Search across all of a project's stored build/deploy logs by keyword. Use this for 'when did this error first appear' style questions.",
397
+ inputSchema: {
398
+ type: "object",
399
+ properties: {
400
+ project: { type: "string" },
401
+ q: { type: "string", description: "Search term (case-insensitive substring match)" },
402
+ limit: { type: "number", description: "Max matches to return, 1–500 (default 50)" },
403
+ },
404
+ required: ["project", "q"],
405
+ },
406
+ zod: z.object({
407
+ project: projectRef,
408
+ q: z.string().min(1),
409
+ limit: z.number().int().min(1).max(500).default(50),
410
+ }),
411
+ handler: async (ctx, { project, q, limit }) => {
412
+ const id = await resolveProjectId(ctx, project);
413
+ return api(ctx, `/api/projects/${id}/logs/search`, { query: { q, limit } });
414
+ },
415
+ },
416
+ // Status
417
+ {
418
+ name: "health_summary",
419
+ description: "Quick health overview: all projects with their live URL, last deploy status, and most recent health check result. Use this when the user asks 'what's the state of everything?'",
420
+ inputSchema: { type: "object", properties: {} },
421
+ zod: z.object({}),
422
+ handler: async (ctx) => {
423
+ const projects = await api(ctx, "/api/projects");
424
+ return projects.map((p) => ({
425
+ name: p.name,
426
+ id: p.id,
427
+ live_url: p.live_url || null,
428
+ last_deploy_status: p.last_status || null,
429
+ deploy_count: p.deploy_count || 0,
430
+ }));
431
+ },
432
+ },
433
+ ];
434
+ export function findTool(name) {
435
+ return tools.find((t) => t.name === name);
436
+ }
437
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "pulsar-deploy-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Pulsar Deploy — lets AI agents (Claude Desktop, Cline, Continue, etc.) drive your Pulsar Deploy account: list/create/deploy projects, manage env vars, query managed databases, tail logs, and more.",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "pulsar-deploy",
9
+ "claude",
10
+ "ai-agent"
11
+ ],
12
+ "homepage": "https://pulsardeploy.com",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/Sumit-Sheokand-ai/Pulsar-Deploy.git",
16
+ "directory": "packages/mcp-server"
17
+ },
18
+ "license": "MIT",
19
+ "author": "Pulsar Deploy",
20
+ "bin": {
21
+ "pulsar-mcp": "dist/index.js"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js',0o755);\"",
29
+ "dev": "tsx src/index.ts",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.0.0",
34
+ "zod": "^3.23.8"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^20.14.2",
38
+ "tsx": "^4.15.7",
39
+ "typescript": "^5.4.5"
40
+ },
41
+ "engines": { "node": ">=18" },
42
+ "type": "module"
43
+ }