npm.io
0.2.0 • Published yesterday

@mwillbanks/elysia-mcp-adapter

Licence
MIT
Version
0.2.0
Deps
2
Size
183 kB
Vulns
0
Weekly
0

Elysia MCP Adapter logo

Elysia MCP Adapter

Expose Elysia routes and MCP-native primitives through one secure Model Context Protocol endpoint.

npm MIT License Documentation

@mwillbanks/elysia-mcp-adapter turns eligible Elysia HTTP routes into MCP tools while preserving the request lifecycle you already rely on: parsing, validation, hooks, guards, authentication, error handling, and response mapping. It also provides thin APIs for standalone tools, resources, resource templates, and prompts.

Why this adapter?

  • Keep Elysia in charge. Route-backed calls run through app.handle(new Request(...)); handlers are never invoked out of band.
  • Reuse schemas. Existing TypeBox and route schemas are normalized to JSON Schema for MCP clients.
  • Secure by default. Origin checks are enabled, model-controlled headers are denied, credential-bearing response headers are redacted, and binary responses are disabled.
  • Stay protocol-focused. The package is ESM-only and does not introduce a second application framework or translate TypeBox to Zod.

Install

bun add @mwillbanks/elysia-mcp-adapter elysia

Node.js >=20.11, Bun >=1.1, Elysia >=1.4, and TypeScript >=5.8 are supported.

Quick start

import { mcp } from '@mwillbanks/elysia-mcp-adapter'
import { Elysia, t } from 'elysia'

const app = new Elysia()
  .use(
    mcp({
      server: {
        name: 'users-api',
        version: '1.0.0'
      }
    })
  )
  .get(
    '/users/:id',
    ({ params }) => ({ id: params.id }),
    {
      params: t.Object({ id: t.String() }),
      detail: {
        operationId: 'users.get',
        summary: 'Get a user'
      }
    }
  )
  .listen(3000)

The adapter exposes GET /users/:id as the users.get MCP tool at POST /mcp. Tool calls are converted to internal HTTP requests and sent back through Elysia:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "users.get",
    "arguments": {
      "params": { "id": "user_123" }
    }
  }
}

Explicit MCP primitives

Install the plugin, then register MCP-only behavior alongside your HTTP routes:

const app = new Elysia()
  .use(mcp({ allowedRoutes: [] }))
  .mcpTool(
    'math.add',
    ({ a, b }: { a: number; b: number }) => ({ sum: a + b }),
    {
      inputSchema: {
        type: 'object',
        properties: {
          a: { type: 'number' },
          b: { type: 'number' }
        },
        required: ['a', 'b'],
        additionalProperties: false
      }
    }
  )
  .mcpResource('config://runtime', () => ({ environment: 'production' }))
  .mcpPrompt(
    'review-error',
    ({ message }: { message: string }) => `Review this error: ${message}`
  )

Routes become tools by default. Resources and prompts require explicit route metadata or the standalone methods above.

Documentation

The full guides and API reference live at mwillbanks.github.io/elysia-mcp-adapter:

Development

bun install
bun run lint
bun run typecheck
bun test
bun run fallow
bun run build

Documentation development runs independently from website/ with bun install and bun run dev.

License

MIT Mike Willbanks

Keywords