basic mcp working

This commit is contained in:
2025-07-16 15:30:20 -06:00
parent bc2008f455
commit 31ab49ed16
5 changed files with 660 additions and 17 deletions

57
docker-compose.dev.yml Normal file
View File

@@ -0,0 +1,57 @@
services:
canvas_manager:
image: node
user: "1000:1000"
container_name: canvas-dev
command: npx --yes pnpm dev
working_dir: /app
ports:
- 3000:3000
env_file:
- .env
environment:
- storageDirectory=/app/storage
- TZ=America/Denver
- NEXT_PUBLIC_ENABLE_FILE_SYNC=true
- REDIS_URL=redis://redis:6379
volumes:
- .:/app
- ~/projects/faculty/1810/2025-spring-alex/in-person:/app/storage/intro_to_web_old
- ~/projects/faculty/1810/2025-fall-alex/modules:/app/storage/intro_to_web
- ~/projects/faculty/4850_AdvancedFE/2025-fall-alex/modules:/app/storage/advanced_frontend
- ~/projects/faculty/4850_AdvancedFE/2024-fall-alex/modules:/app/storage/advanced_frontend_old
- ~/projects/faculty/1430/2024-fall-alex/modules:/app/storage/ux_old
- ~/projects/faculty/1430/2025-fall-alex/modules:/app/storage/ux
- ~/projects/faculty/1420/2024-fall/Modules:/app/storage/1420_old
- ~/projects/faculty/1420/2025-fall-alex/modules:/app/storage/1420
- ~/projects/faculty/1425/2024-fall/Modules:/app/storage/1425_old
- ~/projects/faculty/1425/2025-fall-alex/modules:/app/storage/1425
- ~/projects/facultyFiles:/app/public/images/facultyFiles
redis:
image: redis
container_name: canvas-dev-redis
volumes:
- redis-data:/data
restart: unless-stopped
uvx_mcpo:
image: ghcr.io/astral-sh/uv:debian
container_name: canvas-dev-redis-mcpo
env_file:
- .env
command: |
bash -c '
uvx mcpo \
--port 8001 \
--api-key "$MCP_TOKEN" \
--server-type "streamable_http" \
--cors-allow-origins "*" \
-- http://canvas-dev:3000/api/mcp/mcp
'
working_dir: /app
ports:
- 8001:8001
volumes:
redis-data:

View File

@@ -11,6 +11,7 @@ services:
- storageDirectory=/app/storage - storageDirectory=/app/storage
- TZ=America/Denver - TZ=America/Denver
- NEXT_PUBLIC_ENABLE_FILE_SYNC=true - NEXT_PUBLIC_ENABLE_FILE_SYNC=true
- REDIS_URL=redis://redis:6379
# - FILE_POLLING=true # - FILE_POLLING=true
volumes: volumes:
# - ~/projects/faculty/3840_Telemetry/2024Spring_alex/modules:/app/storage/spring_2024_telemetry # - ~/projects/faculty/3840_Telemetry/2024Spring_alex/modules:/app/storage/spring_2024_telemetry
@@ -38,24 +39,35 @@ services:
- ~/projects/faculty/1425/2025-fall-alex/modules:/app/storage/1425 - ~/projects/faculty/1425/2025-fall-alex/modules:/app/storage/1425
- ~/projects/facultyFiles:/app/public/images/facultyFiles - ~/projects/facultyFiles:/app/public/images/facultyFiles
redis:
image: redis
container_name: redis
volumes:
- redis-data:/data
restart: unless-stopped
volumes:
redis-data:
# https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/ # https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/
# https://github.com/jonas-merkle/container-cloudflare-tunnel # https://github.com/jonas-merkle/container-cloudflare-tunnel
cloudflare-tunnel: # cloudflare-tunnel:
image: cloudflare/cloudflared # image: cloudflare/cloudflared
container_name: cloudflare-tunnel # container_name: cloudflare-tunnel
restart: unless-stopped # restart: unless-stopped
env_file: # env_file:
- .env # - .env
command: tunnel run # command: tunnel run
volumes: # volumes:
- /etc/localtime:/etc/localtime:ro # - /etc/localtime:/etc/localtime:ro
environment: # environment:
- TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN} # - TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}
healthcheck: # healthcheck:
test: [ "CMD", "cloudflared", "--version" ] # test: [ "CMD", "cloudflared", "--version" ]
interval: 30s # interval: 30s
timeout: 10s # timeout: 10s
retries: 3 # retries: 3
start_period: 10s # start_period: 10s
# https://ngrok.com/docs/using-ngrok-with/docker/ # https://ngrok.com/docs/using-ngrok-with/docker/

View File

@@ -13,6 +13,7 @@
"test": "vitest" "test": "vitest"
}, },
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.15.1",
"@next/env": "^15.3.5", "@next/env": "^15.3.5",
"@tailwindcss/postcss": "^4.1.11", "@tailwindcss/postcss": "^4.1.11",
"@tanstack/react-query": "^5.81.5", "@tanstack/react-query": "^5.81.5",
@@ -29,6 +30,7 @@
"form-data": "^4.0.3", "form-data": "^4.0.3",
"jsdom": "^26.1.0", "jsdom": "^26.1.0",
"marked-katex-extension": "^5.1.5", "marked-katex-extension": "^5.1.5",
"mcp-handler": "^1.0.0",
"next": "^15.3.5", "next": "^15.3.5",
"react": "^19.1.0", "react": "^19.1.0",
"react-dom": "^19.1.0", "react-dom": "^19.1.0",

542
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,30 @@
import { createMcpHandler } from "mcp-handler";
import { z } from "zod";
const handler = createMcpHandler(
(server) => {
server.tool(
"roll_dice",
"Rolls an N-sided die",
{
sides: z.number().int().min(2),
},
async ({ sides }) => {
const value = 1 + Math.floor(Math.random() * sides);
return {
content: [{ type: "text", text: `🎲 You rolled a ${value}!` }],
};
}
);
},
{
// Optional server options
},
{
// Optional redis config
redisUrl: process.env.REDIS_URL,
basePath: "/api/mcp", // this needs to match where the [transport] is located.
maxDuration: 60,
verboseLogs: true,
}
);
export { handler as GET, handler as POST };