my-mcp-server

my-mcp-server

A TypeScript MCP server boilerplate that provides tools like calculator, weather, geocoding, and image generation via HuggingFace, supporting both Streamable HTTP (for Vercel deployment) and stdio transports.

Category
访问服务器

README

TypeScript MCP Server — Vercel 배포용 보일러플레이트

Model Context Protocol (MCP) 서버 보일러플레이트입니다. 하나의 도구 정의를 두 개의 트랜스포트가 공유합니다.

  • Streamable HTTP — Next.js App Router 라우트(/api/mcp), Vercel 배포용
  • stdio — 로컬에서 node build/index.js로 실행하는 기존 방식

📁 프로젝트 구조

typescript-mcp-server-boilerplate/
├── app/
│   ├── api/mcp/route.ts     # Streamable HTTP 엔드포인트 (mcp-handler)
│   ├── layout.tsx           # 랜딩 페이지 레이아웃
│   ├── page.tsx             # 서버 정보 안내 페이지
│   ├── page.module.css
│   └── globals.css
├── src/
│   ├── mcp/register.ts      # 도구/프롬프트/리소스 정의 (공용)
│   └── index.ts             # stdio 진입점
├── build/                   # stdio 빌드 산출물
├── next.config.ts
├── tsconfig.json            # Next.js용
├── tsconfig.stdio.json      # stdio 빌드용
└── package.json

핵심은 src/mcp/register.ts의 registerAll(server, options) 함수입니다. 도구를 추가하려면 이 파일만 수정하면 HTTP와 stdio 양쪽에 동시에 반영됩니다.

🛠️ 제공 기능

도구 설명 토큰 필요
greet 이름과 언어로 인사말 생성
calculator 두 숫자의 사칙연산
get-time timezone 또는 도시명의 현재 시각
geocode 도시명 → 위경도 (Open-Meteo)
get-weather 위경도 → 현재 날씨와 일별 예보 (Open-Meteo)
generate-image 프롬프트 → 이미지 생성 (FLUX.1-schnell) ✅

이 외에 프롬프트 code-review와 리소스 server-info(info://server)를 제공합니다.

🔑 HuggingFace 토큰 전달 방식

generate-image 도구는 HuggingFace 토큰이 필요합니다. 토큰은 https://hf.co/settings/tokens 에서 발급합니다.

HTTP 트랜스포트는 두 가지 경로를 지원하며, 헤더가 환경변수보다 우선합니다.

x-hf-token 헤더  →  없으면  →  서버의 HF_TOKEN 환경변수

덕분에 서버에 토큰을 두지 않고도 각 클라이언트가 자기 토큰을 쓸 수 있습니다. stdio 트랜스포트는 HF_TOKEN 환경변수만 사용합니다.

mcp-handler 1.x가 사용하는 StreamableHTTPServerTransport는 도구 콜백에 HTTP 헤더를 전달하지 않습니다. 그래서 app/api/mcp/route.ts에서 요청마다 헤더를 읽어 registerAll에 클로저로 주입합니다.

🚀 로컬 개발 (HTTP)

1. 의존성 설치

npm install

2. 환경변수 설정 (선택)

x-hf-token 헤더로 토큰을 전달할 계획이라면 생략해도 됩니다.

cp .env.example .env.local
# .env.local 에 HF_TOKEN=hf_xxx 입력

3. 개발 서버 실행

npm run dev

4. MCP Inspector로 테스트

npx @modelcontextprotocol/inspector
  1. 브라우저에서 http://127.0.0.1:6274 접속
  2. 왼쪽 드롭다운에서 Streamable HTTP 선택
  3. URL에 http://localhost:3000/api/mcp 입력
  4. Configuration 을 펼쳐 터미널에 출력된 Proxy Session Token 붙여넣기
  5. Connect → List Tools 로 도구 확인

generate-image를 테스트하려면 Inspector의 커스텀 헤더 설정에 x-hf-token을 추가하세요.

🖥️ 로컬 개발 (stdio)

npm run build:stdio
npm run start:stdio

☁️ Vercel 배포

npm i -g vercel
vercel

또는 GitHub 저장소를 Vercel 프로젝트에 연결하면 push마다 자동 배포됩니다.

배포 후 서버 쪽 폴백 토큰이 필요하면 환경변수를 등록합니다.

vercel env add HF_TOKEN

배포 URL의 엔드포인트는 https://<your-project>.vercel.app/api/mcp 입니다.

app/api/mcp/route.ts는 runtime = 'nodejs'로 설정되어 있습니다. generate-image가 Buffer를 사용하므로 Edge 런타임에서는 동작하지 않습니다.

🔧 MCP 클라이언트 연결

Cursor

.cursor/mcp.json (프로젝트) 또는 ~/.cursor/mcp.json (전역):

{
    "mcpServers": {
        "my-mcp-server": {
            "url": "https://<your-project>.vercel.app/api/mcp",
            "headers": {
                "x-hf-token": "hf_xxx"
            }
        }
    }
}

로컬 개발 중이라면 URL만 http://localhost:3000/api/mcp로 바꿉니다.

Streamable HTTP를 지원하지 않는 클라이언트

mcp-remote로 stdio ↔ HTTP 브릿지를 사용합니다.

{
    "mcpServers": {
        "my-mcp-server": {
            "command": "npx",
            "args": [
                "-y",
                "mcp-remote",
                "https://<your-project>.vercel.app/api/mcp",
                "--header",
                "x-hf-token:hf_xxx"
            ]
        }
    }
}

테스트 명령어

  • "5 더하기 3은 얼마야?" (calculator)
  • "삿포로 날씨 알려줘" (geocode → get-weather)
  • "우주를 나는 고양이 이미지 만들어줘" (generate-image)

🧩 도구 추가하기

src/mcp/register.ts의 registerAll 안에 server.registerTool을 추가합니다.

server.registerTool(
    'reverse-text',
    {
        description: '입력한 문자열을 뒤집어 반환합니다.',
        inputSchema: z.object({
            text: z.string().describe('뒤집을 문자열')
        }),
        outputSchema: textOutputSchema('뒤집힌 문자열')
    },
    async ({ text }) => toolResult([...text].reverse().join(''))
)

외부 비밀정보가 필요한 도구라면 process.env를 직접 읽지 말고 RegisterOptions에 필드를 추가해 주입받으세요. 그래야 클라이언트별 헤더 전달이 가능합니다.

🔧 스크립트

스크립트 설명
npm run dev Next.js 개발 서버 (HTTP 트랜스포트)
npm run build Next.js 프로덕션 빌드
npm start Next.js 프로덕션 서버
npm run build:stdio stdio 서버를 build/로 컴파일
npm run start:stdio 컴파일된 stdio 서버 실행
npm run typecheck 양쪽 tsconfig 타입 검사

📦 주요 의존성

  • next: App Router 라우트 핸들러로 HTTP 엔드포인트 제공
  • mcp-handler: MCP 서버를 Web 표준 Request → Response 핸들러로 변환 (1.0.6 고정 — 상위 버전은 SDK 버전을 정확히 고정하므로 peer 충돌)
  • @modelcontextprotocol/sdk: MCP 공식 SDK
  • @huggingface/inference: 이미지 생성
  • zod: 스키마 검증

🔗 참고 자료

📄 라이선스

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选