会议内容提取与合成工具

一个基于TypeScript的MCP服务器,提供用户故事、Gherkin场景和会议信号的提取与合成功能,支持确定性处理和可选的LLM增强。

  • by MarcKarbowiak
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 MarcKarbowiak/meetings-mcp-server

使用说明

会议mcp服务器

展示 MCP(模型上下文协议) TypeScript中的服务器。

它揭示了:

  • 工具: UserStory-Extractor, Gherkin-Extractor, MeetingSignals-Extractor, UserStory-Synthesizer, Gherkin-Synthesizer
  • 资源:租户特定的会议指南+来自 data/tenants/*
  • 提示:可重复使用的模板可驱动一致的提取

此回购是 默认情况下为确定性 (不需要API密钥)。

  • 这 提取器 只是确定性的。
  • 这 合成器 可以选择使用 OpenAI兼容 如果您提供env变量,则表示聊天完成端点;它们总是支持确定性回退。

先决条件

  • Node.js 20+

安装

npm install

运行(stdio)--默认值

npm run dev:stdio

演示(stdio)--端到端运行工具

这将运行一个小型演示客户端,生成stdio服务器,读取 examples/inputs/sample-notes.txt,调用这三个工具,并打印JSON结果。

npm run demo:stdio

演示(流式HTTP)——端到端运行工具

这将运行一个小型演示客户端,在本地主机上生成HTTP服务器入口点,通过Streamable HTTP客户端传输进行连接,调用三个工具,并打印JSON结果。

npm run demo:http

运行(流式HTTP)--可选

这是后续场景的第二个入口点。它绑定到 127.0.0.1.

npm run dev:http

然后POST MCP JSON-RPC请求:

  • http://127.0.0.1:3000/mcp

MCP表面的作用

工具

提取器工具接受相同的输入形状:

{ "text": "...", "tenantId": "demo" }

所有工具归还 structuredContent 形状像:

{ "ok": true, "result": { "tenantId": "demo", "...": "..." } }
  • UserStory-Extractor

    • 从以下行中提取明确的用户故事: As a <persona> I want <goal> so that <value>.
    • 捕获附近的验收标准(AC: / Acceptance Criteria: +子弹)。
    • 发射 gaps + followUpQuestions 当故事是缺失的领域。
    • 细节: docs/tools/UserStory-Extractor.md
  • Gherkin-Extractor

    • 提取物 Feature: / Scenario: 块和 Given/When/Then 步骤。
    • 支持 And / But 继续步骤。
    • 发射 nonGherkinFindings 适用于不符合Gherkin结构的线条。
    • 细节: docs/tools/Gherkin-Extractor.md
  • MeetingSignals-Extractor

    • 检测会议“信号”,如 Decision:, Action item:, Risk:, Dependency:, Open question:.
    • 如果 tenantId 如果提供了,它可以使用租户配置 extractionRules 从 data/tenants/<tenantId>/signals.json.
    • 发射 suggestedActions 基于检测到的信号。
    • 细节: docs/tools/MeetingSignals-Extractor.md
  • UserStory-Synthesizer

    • 从简单的英语成绩单/笔记中合成用户故事。
    • 支持 mode: auto (默认), deterministic, llm.
    • 细节: docs/tools/UserStory-Synthesizer.md
  • Gherkin-Synthesizer

    • 从简单的英语成绩单/笔记中合成小黄瓜风格的特征/场景。
    • 支持 mode: auto (默认), deterministic, llm.
    • 细节: docs/tools/Gherkin-Synthesizer.md

可选LLM配置(仅限合成器)

设置这些环境变量以启用LLM支持的合成:

  • LLM_CHAT_COMPLETIONS_URL (需要启用LLM)
  • LLM_API_KEY (除非 LLM_AUTH_MODE=none)
  • LLM_AUTH_MODE (可选): bearer (默认)| api-key | none
  • LLM_MODEL (可选)
  • LLM_EXTRA_HEADERS_JSON (可选):额外标头的JSON对象
  • LLM_TIMEOUT_MS (可选):请求超时(毫秒)(默认值: 20000)

验证说明:

  • LLM_AUTH_MODE 必须是以下之一 bearer, api-key, none.
  • LLM_EXTRA_HEADERS_JSON 必须是具有字符串值的JSON对象(例如。 {"x-foo":"bar"}).
  • 无效值会很快失败,并出现显式的启动/工具调用错误。

OpenAI示例:

set LLM_CHAT_COMPLETIONS_URL=https://api.openai.com/v1/chat/completions
set LLM_AUTH_MODE=bearer
set LLM_API_KEY=...your key...

Azure OpenAI示例(与OpenAI兼容的聊天完成):

set LLM_CHAT_COMPLETIONS_URL=https://YOUR-RESOURCE.openai.azure.com/openai/deployments/YOUR-DEPLOYMENT/chat/completions?api-version=YYYY-MM-DD
set LLM_AUTH_MODE=api-key
set LLM_API_KEY=...your key...

资源(数据通道)

资源将租户文件作为MCP资源公开:

  • tenant://<tenantId>/guidance → Markdown指导文本。

    • 支持: data/tenants/<tenantId>/guidance.md
    • 缺少租户/文件会返回一条友好的错误消息,其中包含所请求的 tenantId.
    • 细节: docs/resources/tenant-guidance.md
  • tenant://<tenantId>/signals → JSON信号分类+可选提取规则。

    • 支持: data/tenants/<tenantId>/signals.json
    • 缺少租户/文件或无效的JSON返回一条友好的错误消息,其中包含请求的 tenantId.
    • 细节: docs/resources/tenant-signals.md

静态知识资源(回购拥有的指导):

  • knowledge://user-story-structure → 用户故事结构指导。
  • knowledge://gherkin-structure → 小黄瓜结构指导。
  • knowledge://mapping-guidelines → 如何将会议文本映射到故事/场景。
    • 支持: data/knowledge/*
    • 细节: docs/resources/knowledge-docs.md

提示

提示是可重用的消息模板,适用于希望驱动一致提取的客户端。

  • extract-user-stories → 询问用户故事+接受标准+后续问题的提示。

    • 细节: docs/prompts/extract-user-stories.md
  • extract-gherkin → 一个提示,要求输入小黄瓜特征/场景/步骤。

    • 细节: docs/prompts/extract-gherkin.md

租户数据

租户文件位于:

  • data/tenants/<tenantId>/guidance.md
  • data/tenants/<tenantId>/signals.json

租户样本 demo 包括在内。

租户信号提取规则

signals.json 可以可选地包括 extractionRules 控制方式 MeetingSignals-Extractor 检测该租户的信号。

  • 如果 tenantId 提供给工具,以及 extractionRules 如果存在,则使用这些规则。
  • 如果规则缺失或无效,服务器将恢复其内置默认值。

图案格式:

  • 普通正则表达式源字符串(使用不区分大小写的标志编译),例如。 "^\\s*(decision)\\s*[:\\-]"
  • 或 /.../flags 形式,例如。 "/^\\s*decision\\s*[:\\-]/i"

备注

  • 提取逻辑是有意轻量级的(启发式+解析),以在没有API键的情况下保持repo可运行。
  • 您可以选择配置与OpenAI兼容的端点,以提高合成精度,而无需更改工具契约。