🧠 Simple MCP Server with Node.js について
Node.jsとExpressで構築されたMCPのプロトタイプで、構造化したコンテキストを使ってOpenAI APIから物語の筋書きを生成します。コンテキストがLLMの応答に与える影響を調べる開発者向けで、API経由のキャラクター追加にも対応します。
主な機能
- 01system、user、steps、resourcesの構成
- 02OpenAI APIで筋書きを生成
- 03API経由でキャラクターを追加
- 04コンテキストによる応答の変化を確認
活用シーン
- 01物語の設定から筋書き案を生成
- 02キャラクターや制約を変えて出力を比較
MCP 対応
MCPサーバーのプロトタイプと説明されています。READMEではMCPをLLMコンテキストの構成形式として説明していますが、MCPクライアント向けのツールや接続方法は記載されていません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🧠 Node.js を使ったシンプルな MCP サーバー
これは、Node.js と Express で構築された Model Context Protocol(MCP) サーバーのシンプルなプロトタイプです。
OpenAI の API と連携し、たとえば物語の執筆を支援するような、コンテキストを認識するアシスタントをシミュレートします。
🚀 できること
system、user、steps、resourcesを使ってコンテキストを構成する- OpenAI API を呼び出し、コンテキストを使って物語の筋書きを生成する
- API 経由でキャラクターを動的に追加する
- コンテキストの変更が LLM の応答に与える影響を確認する
📦 必要なもの
- Node.js v18+
- npm
- OpenAI API キー(こちらから取得)
🛠 セットアップ
1. このリポジトリをクローンする
git clone https://github.com/takehisa10098/plot-mcp-server.git
cd plot-mcp-server
2. 依存関係をインストールする
npm install
3. .env ファイルを作成する
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
4. context.json ファイルを作成する
{
"system": "あなたは小説執筆のサポートAIです。",
"user": {
"goal": "和風ファンタジーの短編小説を書きたい",
"constraints": ["文字数は3000字以内", "テーマは『喪失と再生』"]
},
"steps": [
{ "name": "キャラクター作成", "status": "done" },
{ "name": "プロット生成", "status": "in_progress" }
],
"resources": {
"characters": [
{ "name": "アカネ", "role": "主人公", "trait": "寡黙で芯が強い" }
],
"world": "戦国時代風の異世界。陰陽術が存在する。"
}
}
5. server.js を作成する
const express = require('express');
const fs = require('fs');
const dotenv = require('dotenv');
const { getPlotSuggestion } = require('./openai');
dotenv.config();
const app = express();
app.use(express.json());
const PORT = 3000;
const CONTEXT_PATH = './context.json';
const readContext = () => JSON.parse(fs.readFileSync(CONTEXT_PATH, 'utf-8'));
app.get('/context', (req, res) => {
const context = readContext();
res.json(context);
});
app.post('/step/plot', async (req, res) => {
const context = readContext();
const plot = await getPlotSuggestion(context);
res.json({ plot });
});
app.post('/update/characters', (req, res) => {
const context = readContext();
const newCharacter = req.body;
if (!newCharacter.name || !newCharacter.role || !newCharacter.trait) {
return res.status(400).json({ error: 'name, role, and trait are required' });
}
context.resources.characters.push(newCharacter);
fs.writeFileSync(CONTEXT_PATH, JSON.stringify(context, null, 2), 'utf-8');
res.json({ message: 'Character added', character: newCharacter });
});
app.listen(PORT, () => {
console.log(`MCP server running at http://localhost:${PORT}`);
});
6. openai.js を作成する
const { OpenAI } = require('openai');
require('dotenv').config();
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
async function getPlotSuggestion(context) {
const { system, user, resources } = context;
const messages = [
{ role: 'system', content: system },
{
role: 'user',
content: `
目標: ${user.goal}
制約: ${user.constraints.join(', ')}
キャラクター: ${JSON.stringify(resources.characters)}
世界観: ${resources.world}
これを踏まえて、小説のプロット案を出してください。
`
}
];
const res = await openai.chat.completions.create({
model: 'gpt-4-turbo',
messages,
});
return res.choices[0].message.content;
}
module.exports = { getPlotSuggestion };
🧪 使い方
サーバーを起動する
node server.js
現在のコンテキストを取得する
curl http://localhost:3000/context
筋書きを生成する
curl -X POST http://localhost:3000/step/plot
新しいキャラクターを追加する
curl -X POST http://localhost:3000/update/characters \
-H "Content-Type: application/json" \
-d '{
"name": "ユキ",
"role": "謎の旅人",
"trait": "静かで何かを知っているような雰囲気"
}'
💡 MCP とは?
Model Context Protocol(MCP)は、LLM 向けのコンテキスト情報を構造化するために提案された形式です。
アプリケーションはこれを使って、会話やプロジェクトの現在の状態を表す system、user、steps、resources を定義できます。
このプロジェクトでは、プロンプトを毎回書き直すのではなく、構造化されたコンテキストを変更することで、LLM とのやり取りを設計する方法を紹介します。
🔗 関連リンク
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。