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
|
||||
- TZ=America/Denver
|
||||
- NEXT_PUBLIC_ENABLE_FILE_SYNC=true
|
||||
- REDIS_URL=redis://redis:6379
|
||||
# - FILE_POLLING=true
|
||||
volumes:
|
||||
# - ~/projects/faculty/3840_Telemetry/2024Spring_alex/modules:/app/storage/spring_2024_telemetry
|
||||
@@ -39,23 +40,34 @@ services:
|
||||
|
||||
- ~/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://github.com/jonas-merkle/container-cloudflare-tunnel
|
||||
cloudflare-tunnel:
|
||||
image: cloudflare/cloudflared
|
||||
container_name: cloudflare-tunnel
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
command: tunnel run
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
environment:
|
||||
- TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}
|
||||
healthcheck:
|
||||
test: [ "CMD", "cloudflared", "--version" ]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
# cloudflare-tunnel:
|
||||
# image: cloudflare/cloudflared
|
||||
# container_name: cloudflare-tunnel
|
||||
# restart: unless-stopped
|
||||
# env_file:
|
||||
# - .env
|
||||
# command: tunnel run
|
||||
# volumes:
|
||||
# - /etc/localtime:/etc/localtime:ro
|
||||
# environment:
|
||||
# - TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}
|
||||
# healthcheck:
|
||||
# test: [ "CMD", "cloudflared", "--version" ]
|
||||
# interval: 30s
|
||||
# timeout: 10s
|
||||
# retries: 3
|
||||
# start_period: 10s
|
||||
# https://ngrok.com/docs/using-ngrok-with/docker/
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
"test": "vitest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@modelcontextprotocol/sdk": "^1.15.1",
|
||||
"@next/env": "^15.3.5",
|
||||
"@tailwindcss/postcss": "^4.1.11",
|
||||
"@tanstack/react-query": "^5.81.5",
|
||||
@@ -29,6 +30,7 @@
|
||||
"form-data": "^4.0.3",
|
||||
"jsdom": "^26.1.0",
|
||||
"marked-katex-extension": "^5.1.5",
|
||||
"mcp-handler": "^1.0.0",
|
||||
"next": "^15.3.5",
|
||||
"react": "^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