MCP 服务器: mcp-academia-server
当我开始研究时,大多数教程都解释了如何运行 mcp服务器在一个脚本中包含其他组件,例如连接的代码 LLM,文件 via-stdio.ts 这是这个例子的摘录。
另一方面,作为一名软件工程师,我一直在想,我能做些什么。 在多个解决方案中使用相同的服务器,因此index.ts文件是一个使用该概念的例子: 通过 HTTP/SSE 集中的 MCP 服务器
开发
通过http执行
curl -X POST http://localhost:3000 \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'通过stdio执行
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | bun run via-stdio.ts通过 docker 生成发布
创建图像
docker image build \
--pull -t mcp-server-academia .执行中
docker container run \
--rm --name mcp-server-academia \
-d -p 3000:3000 mcp-server-academia这个MCP到底在做什么?
基于代码和工具/列表响应,MCP 服务器专门用于管理和查询健身房练习。它提供了以下工具(为了清晰起见,从curl响应中复制):
按组搜索练习:
描述: 通过肌肉群过滤来搜索运动。 可用组: 背部 (背部, 腰部), 肩膀 (三角形), 腿, 胸部 (胸部), 手臂 (二头肌, 三头肌, 前臂). 输入:{“肌肉组”:“字符串”}(例如:“螺栓”)。 输出:包括序列、重复、间隔和观察的练习列表。 列出肌肉组:
描述: 列出数据库中可用的所有肌肉群。 输入:无(空对象)。 输出: 组列表( 例如 “- 腿n- 胸部 (胸部)n… ” ) 。 按_名称搜索练习:
描述: 按名称搜索练习(部分搜索,近似不敏感)。 输入:{“name”:“string”}(例如:“crochet”)。 输出:找到的练习详细信息,包括ID,组,系列等。 列出所有练习:
描述: 按肌肉群组列出所有记录的练习。 入口:无。 输出:按组排序的完整列表。 get_details_exercise:
描述: 通过 ID 获取特定练习的完整详细信息。 Entrada:{“id”:数字}(例如:1)。 输出:详细信息(名称,组,序列,重复,间隔,观察)。
{
"tools": [
{
"name": "buscar_exercicios_por_grupo",
"description": "Busca exercícios filtrando por grupo muscular. Grupos disponíveis: 'Costas (dorsais, lombar)', 'Ombros (deltoides)', 'Pernas', 'Peito (peitoral)', 'Braços (Bíceps, Tríceps, Antebraço)'",
"inputSchema": {
"type": "object",
"properties": {
"grupo_muscular": {
"type": "string",
"description": "Nome do grupo muscular (ex: 'Pernas', 'Peito (peitoral)')"
}
},
"required": [
"grupo_muscular"
]
}
},
{
"name": "listar_grupos_musculares",
"description": "Lista todos os grupos musculares disponíveis no banco de dados",
"inputSchema": {
"type": "object",
"properties": {}
}
},
{
"name": "buscar_exercicio_por_nome",
"description": "Busca exercícios específicos por nome (busca parcial, case-insensitive)",
"inputSchema": {
"type": "object",
"properties": {
"nome": {
"type": "string",
"description": "Nome ou parte do nome do exercício (ex: 'agachamento', 'supino')"
}
},
"required": [
"nome"
]
}
},
{
"name": "listar_todos_exercicios",
"description": "Lista todos os exercícios cadastrados no banco de dados",
"inputSchema": {
"type": "object",
"properties": {}
}
},
{
"name": "obter_detalhes_exercicio",
"description": "Obtém detalhes completos de um exercício específico pelo ID",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID do exercício"
}
},
"required": [
"id"
]
}
}
]
}可能的客户呼叫示例
curl -X POST http://localhost:3000 -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "buscar_exercicios_por_grupo",
"arguments": {"grupo_muscular": "Pernas"}
}
}'{
"content": [
{
"type": "text",
"text": "Encontrados 8 exercícios para Pernas:\n\n**Agachamento livre - Exercício composto para quadríceps, glúteos e posterior**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Extensora drop 10-10-10 - Exercício isolado para quadríceps com técnica drop set**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Agachamento triângulo halteres - Agachamento com halteres em posição triângulo**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Afundo - Exercício para quadríceps, glúteos e posterior**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Mesa flexora - Exercício para posterior de coxa (isquiotibiais)**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Abdutora - Exercício para glúteos médios e mínimo**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Agachamento Sumô - Agachamento com postura sumô para glúteos e adutores**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n\n**Stiffe barra - Exercício para posterior de coxa e glúteos**\n- Séries: 4\n- Repetições: 8\n- Intervalo: 90s\n- Observações: carga a definir\n"
}
]
}