教育元数据本体查询服务器

一个用于查询德国各联邦州学校课程元数据本体的模型上下文协议服务器,支持SPARQL查询、课程树浏览和全文搜索等功能。

  • by FWU-DE
  • JavaScript
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 FWU-DE/mem-mcp

使用说明

MEM本体MCP服务器

一个MCP(模型上下文协议)服务器,用于查询MEM(教育媒体元数据)本体,该本体对联邦各州的德国学校课程进行建模。

特性

服务器提供以下工具:

  1. sparql_query --对MEM三元组存储执行任意SPARQL SELECT查询
  2. list_bundeslaender --列出本体中可用的所有德国联邦州
  3. list_schulfaecher --列出给定州的所有学校科目
  4. list_schularten --列出给定州的所有学校类型
  5. find_lehrplaene --按州查找课程,可选择按学科、学校类型或年级筛选
  6. get_lehrplan_tree --获取Lehrplan的层次结构(以 depth,默认值2,最大值10)
  7. get_children --获取特定节点的直接子节点(用于深入分支)
  8. get_kompetenzen --所有子节点(Kompetenzerwartungen、Lernberiche、Inhalte等)的平面目录,可从匹配的Lehrpläne访问,并用其类标签进行注释。采用与相同的过滤器 find_lehrplaene.
  9. search --按关键字在所有Lehrplan节点上进行全文搜索(使用Virtuoso bif:contains),带可选的Bundesland过滤器

安装

npm install
npm run build

配置

环境变量

所有配置均通过 .env 项目根目录中的文件(启动时自动加载)。复制示例并根据需要进行编辑:

cp .env.example .env

如果缺少必需的变量,服务器将在启动时失败。

基础设施图 (必填):

变量 描述
SPARQL_ENDPOINT SPARQL端点URL
GRAPH_ONTOLOGY 本体图URI
GRAPH_SCHULART scholart图URI
GRAPH_SCHULFACH 图形URI。

状态图 (可选,每个州添加一个):

变量 描述
GRAPH_STATE_<CODE> 状态的图形URI,例如。 GRAPH_STATE_SN, GRAPH_STATE_BY

状态图是动态发现的——添加新状态只需要一个新的 GRAPH_STATE_<CODE> 进入 .env.

克劳德代码

添加a .mcp.json 项目根目录中的文件:

{
  "mcpServers": {
    "mem-ontology": {
      "type": "stdio",
      "command": "node",
      "args": ["build/index.js"]
    }
  }
}

适用于克劳德桌面

添加到MCP设置配置文件中:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "mem-ontology": {
      "command": "node",
      "args": ["/absolute/path/to/mem-ontologie-mcp/build/index.js"]
    }
  }
}

使用示例

查找萨克森体育馆的生物课程

Tool: find_lehrplaene
Arguments: { "bundesland": "SN", "schulfach": "Biologie", "schulart": "Gymnasium" }

浏览课程树(深度有限)

Tool: get_lehrplan_tree
Arguments: { "lehrplanUri": "https://lp-sachsen.org/resource/522", "depth": 2 }

深入特定节点

Tool: get_children
Arguments: { "nodeUri": "https://lp-sachsen.org/resource/7052" }

在所有州搜索主题

Tool: search
Arguments: { "query": "Wirbeltiere" }

在特定州内搜索

Tool: search
Arguments: { "query": "Fische", "bundesland": "SN" }

构建课程选择器

如果你想从web前端(通常是Bundesland)使用相同的本体→ 舒拉特→ 舒尔法赫→ Lehrplan下拉级联,带有主题节点树——请参阅 docs/curriculum-picker.md。当您需要服务器代理(主要是CORS)和gotchas(可传递)时,它会记录查询模板 BFO_0000051 过度断言、未标记标签、可选的Schulart过滤器)。

可运行的引用实现位于 examples/curriculum-picker-demo/ --节点代理加上vanilla JS前端,无需构建步骤。 node proxy.mjs,然后打开 http://localhost:5174.

州代码

  • 带宽 --巴登-符腾堡州
  • 由 --拜仁
  • 是 --柏林
  • BB --勃兰登堡
  • 血红蛋白 --不来梅
  • 哈哈 --汉堡
  • 他 -汉堡
  • 音乐视频 --梅克伦堡-前波美拉尼亚
  • NI --下萨克森州
  • 西北 特罗伦哈根
  • 角色扮演 — 莱茵兰 - 普法尔茨
  • SL --萨尔州
  • 序列号 --萨克森
  • ST --萨克森-安哈尔特
  • 上海 --石勒苏益格-荷尔斯泰因州
  • TH — 图林根

注: 目前,课程数据可用于 由 (拜仁), 序列号 (萨克森), 角色扮演 (Rheinland-Pfalz) BB (勃兰登堡),以及 是 (柏林)。

建筑

  • 运输: stdio(默认)或流式HTTP(--http 旗帜)
  • SDK: @modelcontextprotocol/sdk 和 McpServer 和 zod 模式
  • 数据来源: SPARQL端点(可通过以下方式配置 SPARQL_ENDPOINT 任何人)
  • 运行时间: Node.js、TypeScript、ES模块

源文件:

  • src/index.ts --带有所有工具注册的主MCP服务器
  • src/http.ts --可流式HTTP传输(Express服务器)
  • src/sparql.ts --SPARQL查询执行和结果格式化

发展

npm run build      # Compile TypeScript
npm start          # Run the server (stdio)
npm run start:http # Run the server (HTTP)

HTTP模式

与一起跑步 --http 旗帜(或 npm run start:http)使用Streamable HTTP传输将MCP服务器作为HTTP服务公开。

配置 (通过 .env 或环境变量):

变量 默认值 描述
PORT 3000 HTTP侦听端口
API_KEY (未设置) 用于身份验证的承载令牌。如果未设置,则禁用身份验证。

身份验证: 当 API_KEY 已设置,全部 /mcp 请求必须包括 Authorization: Bearer <key>.没有 API_KEY,服务器是开放访问的。

客户端连接示例:

# Test with MCP Inspector
npx @modelcontextprotocol/inspector --url http://localhost:3000/mcp

# With authentication
npx @modelcontextprotocol/inspector --url http://localhost:3000/mcp --header "Authorization: Bearer your-secret-key-here"

部署(Docker)

A. Dockerfile 和 docker-compose.yml 包括用于自托管部署。容器在您自己的反向代理后以HTTP模式运行服务器(预计TLS将在上游终止)。

Forgejo Actions在每次推送时都会构建容器映像 main 和每一个 vX.Y.Z 标签,然后发布到Forgejo注册表 git.edufeed.org/laoc/mem-mcp。可用标签: :latest, :main, :sha-<short>, :vX.Y.Z.

# One-time on the deploy host: authenticate to the Forgejo registry.
# Skip this step if the package is set to public in Forgejo.
docker login git.edufeed.org

# First-time setup: configure environment.
cp .env.example .env
# Set API_KEY to a random secret for production.

# Deploy / update.
docker compose pull
docker compose up -d

# Logs
docker compose logs -f

默认情况下,容器绑定到 127.0.0.1:3000 在主机上,因此只能通过同一台机器上的反向代理访问。调整 ports: 进入 docker-compose.yml 如果你需要暴露在局域网中。

生产检查表

在公开服务之前:

  • 选择一个主机名。 替换 mcp.example.org 在下面的反向代理代码段中使用您的真实FQDN并创建DNS记录。
  • 集 API_KEY. 未设置时,服务器是开放访问的——适用于stdio或LAN,不适用于公共互联网。生成一个 openssl rand -hex 32 然后把它放进去 .env。然后客户端发送 Authorization: Bearer <key>.
  • 固定图像标签。 :latest 隐式更新。对于有意推出的产品,请进行更改 image: 在 docker-compose.yml 到发布标签(:vX.Y.Z)或提交密码(:sha-<short>)故意撞它。
  • 确认注册表访问权限。 git.edufeed.org/laoc/mem-mcp 可能是私人的。如果 docker compose pull 失败与 unauthorized,跑 docker login git.edufeed.org 在主机上运行一次(或在Forgejo中将包设置为public)。
  • 允许出口到SPARQL端点。 集装箱必须到达 https://sparql.mem.edufeed.org/sparql/ (或者别的什么 SPARQL_ENDPOINT 点)。若出站流量受到防火墙保护,请允许列出该主机。

本地建设(仅限开发)

docker build -t mem-ontology-mcp:dev .
docker run --rm -p 127.0.0.1:3000:3000 --env-file .env mem-ontology-mcp:dev

反向代理示例(Caddy)

mcp.example.org {
    reverse_proxy 127.0.0.1:3000
}

反向代理示例(nginx)

location /mcp {
    proxy_pass http://127.0.0.1:3000/mcp;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    # Streamable HTTP uses SSE for server->client messages.
    proxy_buffering off;
    proxy_read_timeout 3600s;
}

然后客户端连接到 https://mcp.example.org/mcp 和 Authorization: Bearer <API_KEY>.

许可证

无许可证