mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
basic mcp working
This commit is contained in:
57
docker-compose.dev.yml
Normal file
57
docker-compose.dev.yml
Normal 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:
|
||||||
@@ -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/
|
||||||
|
|||||||
@@ -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
542
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
30
src/app/api/mcp/[transport]/route.ts
Normal file
30
src/app/api/mcp/[transport]/route.ts
Normal 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 };
|
||||||
Reference in New Issue
Block a user