Create your own custom MCP Servers.
bl create-mcp-server
. This will create a pre-scaffolded local repo where your entire code can be added.
bl create-mcp-server my-mcp
pnpm inspect
bl serve --hotreload
.
Develop in TypeScript
src/server.ts
file, you’ll see the complete server implementation. It follows the MCP server standard, with the only difference being our use of Blaxel transport that leverages WebSockets for efficient platform serving.The main component you’ll need to modify is the tool definition:
import { BlaxelMcpServerTransport } from "@blaxel/core";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "mymcp",
version: "1.0.0",
description: ""
});
server.tool(
"hello_world",
"Say hello to a person",
{
firstname: z.string()
},
async ({firstname}) => {
console.info(`Hello world called`);
return {
content: [{ type: "text", text: `Hello ${firstname}` }]
}
}
);
function main() {
let transport;
if (process.env.BL_SERVER_PORT) {
transport = new BlaxelMcpServerTransport();
} else {
transport = new StdioServerTransport();
}
server.connect(transport);
console.info("Server started");
}
main();
name
, description
, and parameters are crucial—they help your agent understand how your tool functions.Develop in Python
src/server.py
file, you’ll see the complete server implementation. It follows the MCP server standard, with the only difference being our use of Blaxel transport that leverages WebSockets for efficient platform serving.The main component you’ll need to modify is the tool definition:
from blaxel.core import env
from blaxel.core.mcp.server import FastMCP
from typing import Annotated
from logging import getLogger
mcp = FastMCP("mcp-helloworld-python")
logger = getLogger(__name__)
@mcp.tool()
def hello_world(
first_name: Annotated[
str,
"First name of the user",
],
) -> str:
"""Say hello to the user"""
return f"Hello {first_name}!"
if not env["BL_DEBUG"]:
mcp.run(transport="ws")
bl deploy
in the folder of your project, as explained in this guide.
bl deploy
blaxel.toml
file at the root of your directory. Read the file structure section down below for more details.
type
so Blaxel knows which kind of entity to deploy. Others are not mandatory but allow you to customize the deployment.
name = "my-mcp-server"
workspace = "my-workspace"
type = "function"
[env]
DEFAULT_CITY = "San Francisco"
name
, workspace
, and type
fields are optional and serve as default values. Any bl command run in the folder will use these defaults rather than prompting you for input.[env]
section defines environment variables that the MCP server can access via the SDK. Note that these are NOT secrets.Define entrypoints in Python
[entrypoint]
section to specify how Blaxel is going to start your server....
[entrypoint]
prod = ".venv/bin/python3 src/server.py"
dev = "npx nodemon --exec uv run python src/server.py"
...
prod
: this is the command that will be used to serve your MCP server.venv/bin/python3 src/server.py
dev
: same as prod in dev mode, it will be used with the command --hotreload
. Example:npx nodemon --exec uv run python src/server.py
entrypoint
section is optional. If not specified, Blaxel will automatically detect in the MCP server’s content and configure your server’s startup settings.Define entrypoints in TypeScript
scripts
in the package.json
file at the root of the directory.scripts.start
: start the server locally through the TypeScript command, to avoid having to build the project when developing.scripts.build
: build the project. It is done automatically when deploying.scripts.prod
: start the server remotely on Blaxel from the dist folder, the project needs to be have been built before.scripts.dev
: same as start, but with hotreload. It’s useful when developing locally, each file change is reflected immediately.Was this page helpful?