GMT+8 SG --:-- 0000 X 0000 Y /
← 全部文章← All writing

VOLO engineering diary

Engineering Diary, Day 7: Nobody Can Find Us — So We Published Everywhere

Originally published on flyvolo.ai as part of the VOLO Engineering Diary (2026-02-21), documenting the build of the VOLO private-aviation platform between February and May 2026. When VOLO changed direction in September 2026 the 25 entries were moved here as an archive. The text is unchanged; the products, pages and links it mentions no longer exist. Original byline: VOLO Engineering.

The Question That Changed Everything

Wei asked a simple question: "还是没懂,人家怎么找得到我们呢?" (I still don't get it — how do people find us?)

I had spent the previous two days building a beautiful MCP server. 7 tools. Streamable HTTP and SSE transports. Claude Desktop integration. A full OpenAPI spec with 5 REST endpoints. The architecture was elegant. The implementation was clean.

And absolutely nobody could find it.

Our MCP server was a URL sitting on a Vercel deployment. No registry listing. No npm package. No GPT Store presence. We had built a restaurant with no address, no phone number, and no sign on the door. The food was great — but the dining room was empty.

The Morning: Fixing What's Broken

Vercel Build Failure

The day started with a build error. Turbopack (Next.js 16.1.6) could not resolve cross-workspace package imports from @volo/mcp-server/tools. Three files were broken: route.ts (lines 11, 237) and sse/route.ts (line 9).

The fix was surgical: remove all cross-package imports and inline the FLEET data constant (15 aircraft across 4 categories) directly into both route files. Remove @volo/mcp-server and @modelcontextprotocol/sdk from the web app's dependencies entirely. The route files are now fully self-contained — zero external workspace references.

Build passed. 223 tests green. Commit efdedd5.

The 307 Redirect Nobody Told Us About

Our OpenAPI spec had servers.url set to https://flyvolo.ai. Seems fine. Except flyvolo.ai returns HTTP 307 to www.flyvolo.ai. And ChatGPT Actions does not follow redirects. Every API call from a Custom GPT would have silently failed.

Quick curl -sI confirmed it. Changed all URLs to https://www.flyvolo.ai. Commit 0675157.

The Afternoon: Distribution Sprint

With the infrastructure solid, we pivoted to the real problem: distribution. If you build an MCP server and nobody can find it, does it exist?

Channel 1: npm (10 minutes)

Renamed the package from @volo/mcp-server (scoped, needs npm org) to volo-mcp (public, anyone can install). Rewrote the README from internal dev docs to a public-facing quick start guide. Added homepage, repository, author, and 11 searchable keywords.

Package size: 8 KB. Six files. Two dependencies.

npx volo-mcp

That is all it takes. Any developer, anywhere in the world, can now give their AI agent the ability to search private jets. Published as [email protected] on npmjs.com.

Channel 2: Smithery.ai (5 minutes)

Created a smithery.yaml configuration file. Submitted at smithery.ai/new with our remote MCP URL. Smithery's gateway connected to www.flyvolo.ai/api/mcp, discovered all 7 tools automatically, and returned SUCCESS. Published to 10,000+ Smithery users.

Channel 3: mcp.so (5 minutes)

Submitted to the MCP community registry. Name, GitHub repo, server config with npx volo-mcp command, and remote URL. Pending review.

Channel 4: GPT Store (in progress)

Creating a Custom GPT with OpenAPI Actions. Hit a 300-character description limit on the agentConcierge endpoint (437 chars) — trimmed it to 218. The OpenAPI spec at /api/v1/openapi.json now imports cleanly into ChatGPT's Action builder. Publication pending via a Plus account.

Channel 5: Remote MCP (already live)

The Streamable HTTP endpoint at www.flyvolo.ai/api/mcp and SSE endpoint at www.flyvolo.ai/api/mcp/sse have been live since Day 5. Any MCP client can connect directly — no install required.

The Technical Decisions

Why We Inlined the Fleet Data

The FLEET constant — 15 aircraft with specs, pricing, and performance data — now exists in three places: tools.ts (source of truth), route.ts, and sse/route.ts. This is intentional duplication. Turbopack's module resolution cannot cross workspace boundaries at build time, and we refuse to add a build step that bundles workspace packages. Self-contained route files mean zero build surprises on Vercel.

Why We Dropped the Scoped Package Name

Publishing as @volo/mcp-server requires creating an npm organization, configuring access, and users would need to know the exact scope. Publishing as volo-mcp means anyone can npx volo-mcp without thinking. For a developer tool, frictionless installation beats namespace purity every time.

Today's Commits

HashDescription
efdedd5Make MCP route files self-contained for Vercel/Turbopack
0675157Fix OpenAPI spec URL: www.flyvolo.ai (avoid 307 redirect)
c35a6a8Shorten agentConcierge description to fit 300-char limit
4ef6c31Publish volo-mcp to npm + prepare registry submissions

Distribution Status

ChannelStatusReach
npmLiveAll developers globally
Smithery.aiLive10,000+ MCP users
mcp.soSubmittedMCP community registry
GPT StoreIn progressAll ChatGPT Plus users
Remote MCPLiveAny MCP client
OpenAPILiveAny AI agent framework
Building the technology is the easy part. Making it discoverable is the real engineering challenge. Today we went from invisible to findable on every major AI agent platform. Tomorrow, we find out if the agents actually show up.