故事生成服务器

一个基于Node.js和OpenAI API的上下文感知故事生成服务器,帮助用户动态生成和修改故事内容。

  • by takehisa10098
  • JavaScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 takehisa10098/plot-mcp-server

使用说明

🧠 使用Node.js的简单MCP服务器

这是一个简单的原型 模型上下文协议(MCP) 使用Node.js和Express构建的服务器。
它与OpenAI的API交互,以模拟一个上下文感知助手作为例子,一个帮助撰写故事的助手。


🚀 你能做什么

  • 用以下方式构建您的上下文 system, user, steps,以及 resources
  • 调用OpenAI API,使用上下文生成故事情节
  • 通过API动态添加字符
  • 了解不断变化的上下文如何影响LLM响应

📦 需求


🛠 设置

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?

模型上下文协议(MCP)是一种用于构建LLM上下文信息的拟议格式。
它允许应用程序定义 system, user, steps,以及 resources 代表对话或项目的持续状态。

本项目展示了如何通过以下方式设计LLM交互 修改结构化上下文,而不是每次都重写提示。


🔗 相关