使用说明
MEM本体MCP服务器
一个MCP(模型上下文协议)服务器,用于查询MEM(教育媒体元数据)本体,该本体对联邦各州的德国学校课程进行建模。
特性
服务器提供以下工具:
sparql_query--对MEM三元组存储执行任意SPARQL SELECT查询list_bundeslaender--列出本体中可用的所有德国联邦州list_schulfaecher--列出给定州的所有学校科目list_schularten--列出给定州的所有学校类型find_lehrplaene--按州查找课程,可选择按学科、学校类型或年级筛选get_lehrplan_tree--获取Lehrplan的层次结构(以depth,默认值2,最大值10)get_children--获取特定节点的直接子节点(用于深入分支)get_kompetenzen--所有子节点(Kompetenzerwartungen、Lernberiche、Inhalte等)的平面目录,可从匹配的Lehrpläne访问,并用其类标签进行注释。采用与相同的过滤器find_lehrplaene.search--按关键字在所有Lehrplan节点上进行全文搜索(使用Virtuosobif: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>.
许可证
无许可证
