Ember.js를 사용하여 MCP 서버를 만들었습니다.

작성자

카테고리:

← 피드로
DEV Community · Lloyd Smith · 2026-07-08 개발(SW)

Lloyd Smith

https://mcp.decile.com is an MCP Server I built that uses Ember.js!

Okay, perhaps I overstated that a bit. The MCP server was built using a whole bunch of stuff for the backend, frontend, and infrastructure from Kubernetes to Starlette to Django REST Framework to nginx to … you name it. Ember.js only powers the MCP Apps that are embedded by the MCP Server (about 5 of them so far). Unsurprisingly, ember was well suited to this problem (although not perfect).

What went well?

  • The “gjs” file format is very pleasant for human authoring and AI did a great job of working with it. I suspect that this is because it uses strict imports for everything so the AI (or human) don’t have to rely on implicit context in order to reason about what a component does.
  • The new build system based on Vite was lightning fast and flexible! I was able to make the customizations I needed to execute in an MCP App context pretty easily.
  • Using a monorepo with shared components importable by any of the MCP Apps and tree-shaken away if not used was very convenient! Sharing the boilerplate lint config files, vite configs, etc., as importable “.mjs” files to avoid copying those across each separate mcp-app (and full ember app).
  • Using an Ember.js service to abstract away the mcp-apps SDK into a more reactive, “ember native” API was really easy and makes testing trivial.
'use strict';

module.exports = function (environment) {
  const modulePrefix = 'view-audience';
  const ENV = {
    modulePrefix,
    environment,
    rootURL: '/',
    locationType: 'hash',
    EmberENV: {
      EXTEND_PROTOTYPES: false,
      FEATURES: {},
    },
    APP: {
      MCP_SERVER_BASE_URL: '__MCP_SERVER_BASE_URL__',
    },
    'mcp-app': {
      appInfo: {
        name: modulePrefix,
        title: 'View Audience',
        version: '1.0.0',
      },
      capabilities: { availableDisplayModes: ['inline', 'fullscreen'] },
    },
  };

  ...

  return ENV;
};

Enter fullscreen mode Exit fullscreen mode

What didn’t go so well?

  • Originally, I planned on using the new renderComponent( helper that allows rendering an individual component instead of a full app with router, service injections, etc., but I quickly started to miss the things the app provided.
  • The bundle size is larger than desired, but much of that is actually the MCP Apps SDK, which bundles every locale of zod.

There’s a lot more to speak to but I’m out of time (it’s 9 AM now)!

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다