Site-Forge-MCP
Provides tools for deploying sites to Netlify, checking deployment status, and generating signed claim URLs to transfer site ownership to the customer's Netlify account.
Provides tools for creating and managing Stripe checkout sessions, checking payment status, and verifying payments to enforce paywall before publishing a site.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Site-Forge-MCPCreate a checkout session for a new website costing $50"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
siteforge-mcp
An MCP server that takes payment for a website and publishes it — but only after Stripe confirms the money arrived.
Standalone. No shared code, imports, or infrastructure with any other project.
Tools
Tool | In | Out |
| — | which halves are configured (no secrets echoed) |
|
|
|
|
|
|
|
|
|
|
|
|
Related MCP server: MCP Billing Gateway SDK
The one rule this server exists to enforce
publish_site is the paywall. The caller is a browser artifact — it can be
edited by anyone with devtools, so it is never believed. The only thing it can
send is a session_id, and the server asks Stripe directly whether that session
is paid. There is no parameter that lets a caller assert payment.
Second-order protections:
A paid session maps to exactly one Netlify site, recorded in that session's Stripe metadata. Republishing with the same session updates the same site, so one payment cannot mint unlimited sites. Metadata also means no database.
No card number ever touches this server. Customers pay on Stripe's hosted page, which keeps the whole thing out of PCI scope.
Secrets live only in this process's environment.
Site ownership
Sites are created under your umbrella Netlify team, then handed over. Each
response includes a claim_url — a signed link that transfers the site into the
customer's own Netlify account. You keep deploy access afterward, so paid edits
still work, but their hosting is on their account. Set the OAuth vars below to
enable it; without them claim_url is null and sites stay yours.
Setup
Stripe key — dashboard.stripe.com/apikeys. Start with
sk_test_.Netlify token — app.netlify.com/user/applications → personal access tokens.
Team slug — Netlify team settings → general. Use a team dedicated to customer sites, not your personal one.
OAuth app (for claiming) — app.netlify.com/user/applications → OAuth applications → Create new. No redirect URI needed for deploy-and-claim. Copy the client ID and secret.
Copy .env.example to .env for local runs. On Render, set the same keys under
Environment. render.yaml is included — deploy from repo, free plan is fine.
pip install -r requirements.txt
python server.py # serves on http://localhost:8000/mcpTests
pip install -r requirements-dev.txt
pytest -q # 66 tests, no network or credentials neededStripe and Netlify are both stubbed. Stripe responses are built with
construct_from, so tests see the same object types a live call returns —
that is what catches the version issue described below.
Verified
Server boots;
initialize,tools/listandtools/callanswer correctly over streamable HTTP.publish_siterefuses every non-paidpayment status and never touches Netlify for one. It takes no argument through which a caller could assert payment — the artifact can only hand over asession_id.One paid session maps to one site: republishing redeploys the recorded
site_idinstead of creating a second site.Once a deploy succeeds the URL always comes back. No Stripe failure on the bookkeeping write afterward can turn a live, paid-for site into a failed call; it degrades to a
warningfield.Every Stripe and Netlify failure returns
{ok, error, how_to_fix}rather than a raw exception, and Stripe's partially-masked API key is never echoed back.Misconfiguration names the missing variable.
HTML fragments and oversized documents are rejected before Stripe is called.
Claim link JWT signs and verifies with the expected
client_id/session_id, and a broken OAuth secret yieldsclaim_url: nullinstead of failing a publish.
Not yet verified
A real payment moving
unpaid→paid, and a real Netlify deploy. Both need live credentials. That is the first thing to run once this is on Render.Subscription (
recurring=true) checkout has not been exercised end to end; the session is constructed correctly but no real subscription has been billed.
A note on the Stripe version
stripe-python 12 stopped making StripeObject a dict subclass. On 12+,
session.metadata is not a mapping: .get() raises AttributeError, {**...}
raises TypeError, and an empty one is truthy so or {} never falls back. Since
this server keeps its payment→site mapping in Stripe metadata, every read goes
through _stripe_dict(), which normalizes all of those shapes — plus absent and
null fields — to a plain dict. It works on 11 and 12+ alike. Don't reach for
session.metadata directly when adding code.
v1 scope
No refunds, no webhooks, no custom domains, no multi-page sites. Add them when a customer asks, not before.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceA comprehensive framework for building and deploying commercial MCP servers with integrated billing, usage metering, and Stripe payment processing. It enables developers to monetize AI tools through a complete ecosystem including API key management, affiliate tracking, and automated deployment scripts.Last updated
- AlicenseBqualityCmaintenanceUniversal billing gateway for MCP servers. Add Stripe subscription billing to any MCP server with one line of code. Supports tiered plans, usage tracking, and automatic access control.Last updated11MIT
- Alicense-qualityCmaintenanceA template for MCP servers that enforces a paywall gate, offering free local execution and monetizing premium features via Stripe or x402 payments.Last updatedMIT
- Alicense-qualityCmaintenanceMCP server that gates premium features behind a combined x402 (USDC per call) and Stripe API key paywall, ensuring only paying users access deep functionality while free tier runs locally.Last updatedMIT
Related MCP Connectors
A paid remote MCP for AI SDK MCP gateway registry, built to return verdicts, receipts, usage logs, a
MCP server for OpenAI Sora AI video generation
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/holeyfield33-art/Site-Forge-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server