One command is all it takes. You write one TypeScript file with defineMcp, add a four-field denkops.json, run denkops deploy, and your MCP server is live at https://mcp-starter.denkops.host/mcp, ready to be installed in any assistant that supports remote MCP servers. This post walks the official starter from empty directory to live URL, first with the CLI, then with the Claude Code plugin.
What does a minimal MCP server look like?
Two files. The first is index.ts, which defines the server and exports it as the module default:
import { defineMcp } from "@denkopsai/sdk/mcp";
import { z } from "zod";
export default defineMcp({
name: "mcp-starter",
version: "1.0.0",
tools: {
add: {
description: "Add two numbers.",
input: z.object({ a: z.number(), b: z.number() }),
handler: ({ a, b }) => ({ sum: a + b }),
},
},
});That is the whole server. defineMcp takes a name, a version, and a map of tools, each with a description, a Zod input schema, and a handler. The full starter also ships a resource and a prompt, but one tool is enough to go live. You never write HTTP routing or protocol code: the platform serves the exported app and speaks MCP at /mcp for you.
The second file is denkops.json:
{ "name": "mcp-starter", "slug": "mcp-starter", "runtime": "bun", "connector": true }The slug becomes your URL. "connector": true turns on the hosted OAuth flow, so assistants can install your server with a login and consent screen you never build. Everything else about what a connector is stays the same.
How do I deploy it from the CLI?
Two commands:
denkops login
denkops deploydenkops login uses the GitHub device flow: it shows a code, you confirm it in the browser once, and the CLI is authenticated. denkops deploy builds the project and ships it into an always-on slot. When it returns, your server is live at https://mcp-starter.denkops.host with the MCP endpoint at /mcp. The process stays up between calls, so there are no cold starts.
Can I deploy from Claude Code instead?
Yes, and you can skip the CLI entirely. Install the DenkOps plugin:
/plugin marketplace add DenkOpsAI/denkops-mcp
/plugin install denkopsThen say "log in to DenkOps" and click Approve in the browser tab that opens, once. From then on, saying "deploy on DenkOps" in your project directory ships it, and Claude hands you back the live URL and an API key in the conversation. The Claude Code flow is the same deploy, phrased as a sentence.
What do you have when it finishes?
A public MCP server at a stable HTTPS URL. The transport is stateless streamable HTTP: clients POST JSON-RPC to /mcp, and every MCP client that supports remote servers can connect. Paste the URL into your assistant of choice as a remote MCP server, complete the OAuth consent your connector: true flag enabled, and ask it to add two numbers. Your tool runs in an always-on slot, so the next call finds the same warm process.
From here, the interesting work is your tools, not your infrastructure. The next post covers typing tool inputs with Zod so agents call them correctly.