Savage in a Suit MCP Server
# Savage in a Suit MCP server
Lets Claude manage the Savage in a Suit website directly. Once it is running
and connected to Claude, you can say things like "add a Savage Hour on July
24," "change the home page headline," or "show me this week's leads," and
Claude makes the change on the live site. Every change is logged.
It is a thin, safe layer over the site's own admin API: it can only do what
the admin panel can do, and it needs the site's API key to do anything.
## What Claude can manage (31 tools)
Pages (the words and photos on every page), events, members, testimonials,
podcast episodes, the monthly letter, apparel display, site content (stats,
announcement bar), and reading the leads that come in.
## Two ways to run it
### A. Hosted, so you can use it from Claude on the web or your phone (recommended)
Deploy it once to a host, then add the URL to Claude.
**1. Deploy (Render, free tier works)**
- Push this repo to GitHub (already done if you are reading this there).
- Go to render.com, sign in, click **New > Blueprint**, and pick this repo.
Render reads `render.yaml` and sets up the service.
- Set the three environment variables when prompted:
- `SIAS_BASE_URL` = `https://savage-in-a-suit-theta.vercel.app`
- `SIAS_API_KEY` = the site's admin API key (ask Ayush)
- `MCP_AUTH_TOKEN` = any long random string you make up (this is the
password for the connector; keep it private)
- Deploy. Render gives you a URL like `https://sias-mcp-server.onrender.com`.
- Check it is up: open `https://<your-url>/health`, it should say `{"status":"ok"}`.
**2. Connect it to Claude**
- Your connector URL is: `https://<your-url>/mcp?key=<your MCP_AUTH_TOKEN>`
- In Claude (claude.ai), go to **Settings > Connectors > Add custom connector**,
paste that URL, and save.
- Claude will list the tools. Done. Try: "list the pages on my site."
### B. Local, with the Claude Desktop app
For running it on your own computer instead of a host.
```
npm install
npm run build
```
Then in Claude Desktop, Settings > Developer > edit config, add:
```json
{
"mcpServers": {
"savage-in-a-suit": {
"command": "node",
"args": ["/ABSOLUTE/PATH/TO/mcp-server/dist/index.js"],
"env": {
"SIAS_BASE_URL": "https://savage-in-a-suit-theta.vercel.app",
"SIAS_API_KEY": "the site's admin API key"
}
}
}
}
```
Restart Claude Desktop. (Local mode does not need `MCP_AUTH_TOKEN`.)
## Environment variables
| Var | What it is | Needed by |
| --- | --- | --- |
| `SIAS_BASE_URL` | The live site URL | both |
| `SIAS_API_KEY` | The site's admin API key | both |
| `MCP_AUTH_TOKEN` | Secret guarding the hosted URL | hosted (HTTP) only |
| `PORT` | Port for the HTTP server (hosts set this) | hosted (HTTP) only |
## Security
Anyone who has both the connector URL and the `MCP_AUTH_TOKEN` can edit the
site. Keep the URL private. To rotate access, change `MCP_AUTH_TOKEN` on the
host and update the URL in Claude. The site's `SIAS_API_KEY` is never exposed
to Claude; it stays on the server.
## Scripts
- `npm run build` compiles TypeScript to `dist/`
- `npm start` runs the hosted HTTP server (`dist/http.js`)
- `npm run start:stdio` runs the local stdio server (`dist/index.js`)
TDQS
Scored across 31 tools
Each tool is scoped to a distinct resource and action (e.g., events, episodes, letters, testimonials, members, products, site content, pages, leads). Even where similar patterns exist, the resource is clear from the name and description, so an agent can confidently select the right tool.
Tool names overwhelmingly follow a consistent snake_case verb_noun pattern (list_*, get_*, create_*, update_*, delete_*). Minor deviations like 'add_podcast_episode' instead of 'create_episode' and 'update_product_display' for a product-specific action prevent a perfect score.
With 31 tools, the set exceeds the 25+ threshold and feels heavy. While each tool is purposeful, many could be consolidated (e.g., generic resource handlers) without losing clarity, making the overall count more than necessary.
The toolkit covers full CRUD for events, letters, and testimonials, and provides sensible read/update operations for site content and pages. Minor gaps include missing direct getters for episodes and members (list returns full records) and a read-only leads surface, but these are workable.