Skip to content

Commit a7ce0f8

Browse files
copeusclaude
andcommitted
feat: Add free server support in deploy wizard
When user declines monetization, offer to mark server as free. Free servers don't need pricing plans - just SEO content to publish. - Add markServerAsFree() API function - Update post-deploy wizard to offer free option - Set is_free=true instead of creating $0 plan 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent ad6b84b commit a7ce0f8

3 files changed

Lines changed: 42 additions & 1 deletion

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mcpize",
3-
"version": "1.0.34",
3+
"version": "1.0.35",
44
"description": "Deploy and monetize MCP servers in the cloud",
55
"type": "module",
66
"bin": {

src/lib/api.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,23 @@ export async function saveSEO(
735735
);
736736
}
737737

738+
export async function markServerAsFree(
739+
serverId: string,
740+
): Promise<{ success: boolean }> {
741+
return edgeFunctionRequest<{ success: boolean }>(
742+
"hosting-deploy",
743+
"update-server",
744+
{
745+
method: "POST",
746+
headers: { "Content-Type": "application/json" },
747+
body: JSON.stringify({
748+
server_id: serverId,
749+
is_free: true,
750+
}),
751+
},
752+
);
753+
}
754+
738755
export interface ServerSetupStatus {
739756
hasPlans: boolean;
740757
hasSEO: boolean;

src/lib/post-deploy-wizard.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
savePlans,
88
saveSEO,
99
getServerSetupStatus,
10+
markServerAsFree,
1011
type GeneratedPlan,
1112
type GeneratedSEO,
1213
} from "./api.js";
@@ -98,6 +99,29 @@ async function setupMonetization(
9899
});
99100

100101
if (!setupMoney) {
102+
// Offer to mark server as free instead
103+
const { makeFree } = await prompt<{ makeFree: boolean }>({
104+
type: "confirm",
105+
name: "makeFree",
106+
message: "Make this server free for everyone?",
107+
initial: true,
108+
});
109+
110+
if (makeFree) {
111+
const spinner = ora("Marking server as free...").start();
112+
try {
113+
await markServerAsFree(serverId);
114+
spinner.succeed("Server marked as free!");
115+
console.log(chalk.dim(" Free community servers don't require pricing plans\n"));
116+
return true;
117+
} catch (error) {
118+
spinner.fail("Failed to mark server as free");
119+
console.error(
120+
chalk.red(error instanceof Error ? error.message : String(error)),
121+
);
122+
}
123+
}
124+
101125
console.log(chalk.dim("Skipped monetization setup.\n"));
102126
return false;
103127
}

0 commit comments

Comments
 (0)