@kjerneverk/riotplan-mcp-http 1.0.26-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -0
- package/deploy/cloud-run/Dockerfile +29 -0
- package/deploy/cloud-run/Dockerfile.from-npm +26 -0
- package/deploy/cloud-run/cloudbuild.from-npm.yaml +61 -0
- package/deploy/cloud-run/cloudbuild.yaml +58 -0
- package/deploy/cloud-run/deploy-prod.sh +73 -0
- package/deploy/cloud-run/env.example.yaml +17 -0
- package/deploy/cloud-run/rbac-keys.example.yaml +14 -0
- package/deploy/cloud-run/rbac-policy.example.yaml +17 -0
- package/deploy/cloud-run/rbac-users.example.yaml +11 -0
- package/deploy/local/riotplan-local.sh +32 -0
- package/output/kodrdriv/260319-0549-commit-message.md +39 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# @kjerneverk/riotplan-mcp-http
|
|
2
|
+
|
|
3
|
+
HTTP MCP server for RiotPlan.
|
|
4
|
+
|
|
5
|
+
This package is the network-facing surface of RiotPlan. It exposes every plan
|
|
6
|
+
operation as an MCP tool, resource, or prompt over HTTP using Hono and the
|
|
7
|
+
MCP SDK's `StreamableHTTPTransport`. Clients like Cursor, VS Code extensions,
|
|
8
|
+
and any MCP-compatible agent connect here.
|
|
9
|
+
|
|
10
|
+
## What lives here
|
|
11
|
+
|
|
12
|
+
### Server (`src/server-hono.ts`)
|
|
13
|
+
|
|
14
|
+
The Hono application that wires up MCP transport, session management, cloud
|
|
15
|
+
sync, RBAC authentication, plan download/upload routes, and the `/health`
|
|
16
|
+
endpoint. This is the main runtime entry point.
|
|
17
|
+
|
|
18
|
+
### Tools (`src/tools/`)
|
|
19
|
+
|
|
20
|
+
Every `riotplan_*` MCP tool definition. Each file exports a tool object with
|
|
21
|
+
a name, Zod schema, description, and execute function. Tools cover the full
|
|
22
|
+
plan lifecycle:
|
|
23
|
+
|
|
24
|
+
- **idea** -- create plans, add notes/constraints/questions/evidence/narrative
|
|
25
|
+
- **shaping** -- start shaping, add approaches, compare, select
|
|
26
|
+
- **build** -- prepare caller-side generation instructions from plan artifacts
|
|
27
|
+
- **build-write** -- validate and persist generated plan artifacts and steps
|
|
28
|
+
- **step** -- start, complete, add, remove, move steps
|
|
29
|
+
- **status** -- read plan status
|
|
30
|
+
- **transition** -- move between lifecycle stages
|
|
31
|
+
- **history** -- checkpoints and timeline
|
|
32
|
+
- **catalyst** -- manage catalyst associations
|
|
33
|
+
- **evidence** -- structured evidence writer
|
|
34
|
+
- **reflect** -- step reflections
|
|
35
|
+
- **retrospective** -- generate plan retrospectives
|
|
36
|
+
- **context** -- read plan context for LLM consumption
|
|
37
|
+
- **project** -- bind plans to projects, resolve project context
|
|
38
|
+
- **switch** -- list plans, switch active plan, rename, delete
|
|
39
|
+
- **generate** -- server-side AI plan generation (legacy)
|
|
40
|
+
- **validate** -- plan validation
|
|
41
|
+
|
|
42
|
+
### Resources (`src/resources/`)
|
|
43
|
+
|
|
44
|
+
MCP resource handlers for read-only access to plan data (plan metadata,
|
|
45
|
+
status, steps, individual step content, idea, shaping, evidence, timeline,
|
|
46
|
+
checkpoints, artifacts, prompts).
|
|
47
|
+
|
|
48
|
+
### Prompts (`src/prompts/`)
|
|
49
|
+
|
|
50
|
+
MCP prompt templates for guided workflows (create plan, explore idea, shape
|
|
51
|
+
approach, develop plan, execute step, execute plan, track progress, generate
|
|
52
|
+
retrospective).
|
|
53
|
+
|
|
54
|
+
### Session (`src/session/`)
|
|
55
|
+
|
|
56
|
+
Session management for multi-connection MCP server operation.
|
|
57
|
+
|
|
58
|
+
### Other
|
|
59
|
+
|
|
60
|
+
- **`rbac.ts`** -- role-based access control engine (API key auth, user/role
|
|
61
|
+
lookup, route-level enforcement).
|
|
62
|
+
- **`bin-http.ts`** -- CLI entry point for starting the HTTP server.
|
|
63
|
+
- **`heartbeat.ts`** -- health/liveness utilities.
|
|
64
|
+
- **`types.ts`** -- MCP-specific type definitions (McpTool, ToolResult,
|
|
65
|
+
ToolExecutionContext, resource types, prompt types).
|
|
66
|
+
- **`uri.ts`** -- `riotplan://` URI parser.
|
|
67
|
+
|
|
68
|
+
## Dependencies
|
|
69
|
+
|
|
70
|
+
| Package | Role |
|
|
71
|
+
|---|---|
|
|
72
|
+
| `@kjerneverk/riotplan` | Plan operations, types, AI artifact loading, config, status generation, step mutations, reflection writer, plan loader, plan categories |
|
|
73
|
+
| `@kjerneverk/riotplan-core` | Core service composition (lifecycle, status, idea, build helpers) -- used by a subset of tools |
|
|
74
|
+
| `@kjerneverk/riotplan-format` | SQLite provider for direct plan file/step/timeline access |
|
|
75
|
+
|
|
76
|
+
The dependency on `@kjerneverk/riotplan` is currently broad -- tools import
|
|
77
|
+
from subpaths like `@kjerneverk/riotplan/ai/artifacts` and
|
|
78
|
+
`@kjerneverk/riotplan/config`. A future goal is to narrow this so the MCP
|
|
79
|
+
server depends only on well-defined service interfaces rather than reaching
|
|
80
|
+
into riotplan internals.
|
|
81
|
+
|
|
82
|
+
## Development
|
|
83
|
+
|
|
84
|
+
During development, use `npm link` to resolve sibling packages:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
cd ../riotplan && npm link
|
|
88
|
+
cd ../riotplan-core && npm link
|
|
89
|
+
cd ../riotplan-mcp-http && npm link @kjerneverk/riotplan @kjerneverk/riotplan-core @kjerneverk/riotplan-format
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Status
|
|
93
|
+
|
|
94
|
+
Extraction in progress. Source code is real (copied from `riotplan/src/mcp/`
|
|
95
|
+
with imports rewritten to use package paths). The identical source still
|
|
96
|
+
exists in `riotplan/src/mcp/` and is tested through the `riotplan` test
|
|
97
|
+
suite. Standalone build, tests, and npm publishing are not yet configured.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
FROM node:24-bookworm-slim AS builder
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
# Native modules (better-sqlite3) may compile in CI.
|
|
6
|
+
RUN apt-get update \
|
|
7
|
+
&& apt-get install -y --no-install-recommends python3 make g++ \
|
|
8
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
9
|
+
|
|
10
|
+
COPY package*.json ./
|
|
11
|
+
RUN npm install
|
|
12
|
+
|
|
13
|
+
COPY . .
|
|
14
|
+
RUN npm run build
|
|
15
|
+
RUN npm prune --omit=dev
|
|
16
|
+
|
|
17
|
+
FROM node:24-bookworm-slim AS runtime
|
|
18
|
+
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
ENV NODE_ENV=production
|
|
21
|
+
|
|
22
|
+
COPY --from=builder /app/package*.json ./
|
|
23
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
24
|
+
COPY --from=builder /app/dist ./dist
|
|
25
|
+
|
|
26
|
+
EXPOSE 8080
|
|
27
|
+
|
|
28
|
+
# Cloud Run provides PORT; riotplan-mcp-http reads PORT and MCP_PORT.
|
|
29
|
+
CMD ["node", "dist/bin-http.js"]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
FROM node:24-bookworm-slim
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
ENV NODE_ENV=production
|
|
5
|
+
|
|
6
|
+
# Native toolchain helps if optional native deps need rebuild.
|
|
7
|
+
RUN apt-get update \
|
|
8
|
+
&& apt-get install -y --no-install-recommends \
|
|
9
|
+
python3 \
|
|
10
|
+
make \
|
|
11
|
+
g++ \
|
|
12
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
13
|
+
|
|
14
|
+
ARG RIOTPLAN_MCP_HTTP_VERSION=latest
|
|
15
|
+
|
|
16
|
+
# Install riotplan-mcp-http from npm.
|
|
17
|
+
RUN if [ "$RIOTPLAN_MCP_HTTP_VERSION" = "latest" ]; then \
|
|
18
|
+
npm install -g @kjerneverk/riotplan-mcp-http@latest; \
|
|
19
|
+
else \
|
|
20
|
+
npm install -g "@kjerneverk/riotplan-mcp-http@${RIOTPLAN_MCP_HTTP_VERSION}"; \
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
EXPOSE 8080
|
|
24
|
+
|
|
25
|
+
# Cloud Run provides PORT; riotplan-mcp-http reads PORT and MCP_PORT.
|
|
26
|
+
CMD ["riotplan-mcp-http"]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
substitutions:
|
|
2
|
+
_REGION: us-central1
|
|
3
|
+
_SERVICE_NAME: riotplan-mcp
|
|
4
|
+
_AR_REPO: riotplan
|
|
5
|
+
_IMAGE_NAME: riotplan-mcp
|
|
6
|
+
_SERVICE_ACCOUNT: riotplan-runtime@${PROJECT_ID}.iam.gserviceaccount.com
|
|
7
|
+
_ENV_VARS_FILE: env.prod.yaml
|
|
8
|
+
_OPENAI_SECRET: riotplan-openai-api-key
|
|
9
|
+
_RIOTPLAN_MCP_HTTP_VERSION: latest
|
|
10
|
+
_REQUEST_TIMEOUT: "3600"
|
|
11
|
+
_MIN_INSTANCES: "1"
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: gcr.io/cloud-builders/docker
|
|
15
|
+
id: build-image
|
|
16
|
+
args:
|
|
17
|
+
- build
|
|
18
|
+
- -f
|
|
19
|
+
- Dockerfile.from-npm
|
|
20
|
+
- --build-arg
|
|
21
|
+
- RIOTPLAN_MCP_HTTP_VERSION=${_RIOTPLAN_MCP_HTTP_VERSION}
|
|
22
|
+
- -t
|
|
23
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
24
|
+
- -t
|
|
25
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:latest
|
|
26
|
+
- .
|
|
27
|
+
|
|
28
|
+
- name: gcr.io/cloud-builders/docker
|
|
29
|
+
id: push-sha
|
|
30
|
+
args:
|
|
31
|
+
- push
|
|
32
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
33
|
+
|
|
34
|
+
- name: gcr.io/cloud-builders/docker
|
|
35
|
+
id: push-latest
|
|
36
|
+
args:
|
|
37
|
+
- push
|
|
38
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:latest
|
|
39
|
+
|
|
40
|
+
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
|
|
41
|
+
id: deploy-cloud-run
|
|
42
|
+
entrypoint: gcloud
|
|
43
|
+
args:
|
|
44
|
+
- run
|
|
45
|
+
- deploy
|
|
46
|
+
- ${_SERVICE_NAME}
|
|
47
|
+
- --region=${_REGION}
|
|
48
|
+
- --platform=managed
|
|
49
|
+
- --allow-unauthenticated
|
|
50
|
+
- --port=8080
|
|
51
|
+
- --image=${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
52
|
+
- --service-account=${_SERVICE_ACCOUNT}
|
|
53
|
+
- --env-vars-file=${_ENV_VARS_FILE}
|
|
54
|
+
- --update-secrets=OPENAI_API_KEY=${_OPENAI_SECRET}:latest
|
|
55
|
+
- --timeout=${_REQUEST_TIMEOUT}
|
|
56
|
+
- --min-instances=${_MIN_INSTANCES}
|
|
57
|
+
- --no-cpu-throttling
|
|
58
|
+
|
|
59
|
+
images:
|
|
60
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
61
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:latest
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
substitutions:
|
|
2
|
+
_REGION: us-central1
|
|
3
|
+
_SERVICE_NAME: riotplan-mcp
|
|
4
|
+
_AR_REPO: riotplan
|
|
5
|
+
_IMAGE_NAME: riotplan-mcp
|
|
6
|
+
_SERVICE_ACCOUNT: riotplan-runtime@${PROJECT_ID}.iam.gserviceaccount.com
|
|
7
|
+
_ENV_VARS_FILE: deploy/cloud-run/env.example.yaml
|
|
8
|
+
_OPENAI_SECRET: riotplan-openai-api-key
|
|
9
|
+
_REQUEST_TIMEOUT: "3600"
|
|
10
|
+
_MIN_INSTANCES: "1"
|
|
11
|
+
|
|
12
|
+
steps:
|
|
13
|
+
- name: gcr.io/cloud-builders/docker
|
|
14
|
+
id: build-image
|
|
15
|
+
args:
|
|
16
|
+
- build
|
|
17
|
+
- -f
|
|
18
|
+
- deploy/cloud-run/Dockerfile
|
|
19
|
+
- -t
|
|
20
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
21
|
+
- -t
|
|
22
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:latest
|
|
23
|
+
- .
|
|
24
|
+
|
|
25
|
+
- name: gcr.io/cloud-builders/docker
|
|
26
|
+
id: push-sha
|
|
27
|
+
args:
|
|
28
|
+
- push
|
|
29
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
30
|
+
|
|
31
|
+
- name: gcr.io/cloud-builders/docker
|
|
32
|
+
id: push-latest
|
|
33
|
+
args:
|
|
34
|
+
- push
|
|
35
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:latest
|
|
36
|
+
|
|
37
|
+
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
|
|
38
|
+
id: deploy-cloud-run
|
|
39
|
+
entrypoint: gcloud
|
|
40
|
+
args:
|
|
41
|
+
- run
|
|
42
|
+
- deploy
|
|
43
|
+
- ${_SERVICE_NAME}
|
|
44
|
+
- --region=${_REGION}
|
|
45
|
+
- --platform=managed
|
|
46
|
+
- --allow-unauthenticated
|
|
47
|
+
- --port=8080
|
|
48
|
+
- --image=${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
49
|
+
- --service-account=${_SERVICE_ACCOUNT}
|
|
50
|
+
- --env-vars-file=${_ENV_VARS_FILE}
|
|
51
|
+
- --update-secrets=OPENAI_API_KEY=${_OPENAI_SECRET}:latest
|
|
52
|
+
- --timeout=${_REQUEST_TIMEOUT}
|
|
53
|
+
- --min-instances=${_MIN_INSTANCES}
|
|
54
|
+
- --no-cpu-throttling
|
|
55
|
+
|
|
56
|
+
images:
|
|
57
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:${BUILD_ID}
|
|
58
|
+
- ${_REGION}-docker.pkg.dev/${PROJECT_ID}/${_AR_REPO}/${_IMAGE_NAME}:latest
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
|
|
6
|
+
PROJECT_ID="${PROJECT_ID:-discursive}"
|
|
7
|
+
REGION="${REGION:-us-central1}"
|
|
8
|
+
SERVICE_NAME="${SERVICE_NAME:-riotplan-mcp}"
|
|
9
|
+
AR_REPO="${AR_REPO:-riotplan}"
|
|
10
|
+
IMAGE_NAME="${IMAGE_NAME:-riotplan-mcp}"
|
|
11
|
+
SERVICE_ACCOUNT="${SERVICE_ACCOUNT:-riotplan-runtime@${PROJECT_ID}.iam.gserviceaccount.com}"
|
|
12
|
+
OPENAI_SECRET="${OPENAI_SECRET:-riotplan-openai-api-key}"
|
|
13
|
+
RIOTPLAN_MCP_HTTP_VERSION="${RIOTPLAN_MCP_HTTP_VERSION:-latest}"
|
|
14
|
+
ENV_FILE="${ENV_FILE:-${SCRIPT_DIR}/env.prod.yaml}"
|
|
15
|
+
STORAGE_ROLE="${STORAGE_ROLE:-roles/storage.objectAdmin}"
|
|
16
|
+
SKIP_STORAGE_IAM="${SKIP_STORAGE_IAM:-false}"
|
|
17
|
+
REQUEST_TIMEOUT="${REQUEST_TIMEOUT:-3600}"
|
|
18
|
+
MIN_INSTANCES="${MIN_INSTANCES:-1}"
|
|
19
|
+
|
|
20
|
+
if [[ ! -f "${ENV_FILE}" ]]; then
|
|
21
|
+
echo "Missing env file: ${ENV_FILE}"
|
|
22
|
+
echo "Copy ${SCRIPT_DIR}/env.example.yaml to ${SCRIPT_DIR}/env.prod.yaml and edit values."
|
|
23
|
+
exit 1
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
extract_yaml_value() {
|
|
27
|
+
local key="$1"
|
|
28
|
+
local file="$2"
|
|
29
|
+
sed -nE "s/^${key}:[[:space:]]*\"?([^\"#]+)\"?.*$/\1/p" "${file}" | sed -n '1p'
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
grant_bucket_access() {
|
|
33
|
+
local bucket="$1"
|
|
34
|
+
if [[ -z "${bucket}" ]]; then
|
|
35
|
+
return 0
|
|
36
|
+
fi
|
|
37
|
+
echo "Ensuring ${SERVICE_ACCOUNT} has ${STORAGE_ROLE} on gs://${bucket}"
|
|
38
|
+
gcloud storage buckets add-iam-policy-binding "gs://${bucket}" \
|
|
39
|
+
--project="${PROJECT_ID}" \
|
|
40
|
+
--member="serviceAccount:${SERVICE_ACCOUNT}" \
|
|
41
|
+
--role="${STORAGE_ROLE}" \
|
|
42
|
+
--quiet
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
echo "Deploying @kjerneverk/riotplan-mcp-http version: ${RIOTPLAN_MCP_HTTP_VERSION}"
|
|
46
|
+
echo "Project: ${PROJECT_ID}, Region: ${REGION}, Service: ${SERVICE_NAME}"
|
|
47
|
+
echo "Env file: ${ENV_FILE}"
|
|
48
|
+
echo "Cloud Run timeout: ${REQUEST_TIMEOUT}s, min instances: ${MIN_INSTANCES}, CPU: always allocated"
|
|
49
|
+
|
|
50
|
+
if [[ "${SKIP_STORAGE_IAM}" != "true" ]]; then
|
|
51
|
+
PLAN_BUCKET="$(extract_yaml_value "RIOTPLAN_PLAN_BUCKET" "${ENV_FILE}")"
|
|
52
|
+
CONTEXT_BUCKET="$(extract_yaml_value "RIOTPLAN_CONTEXT_BUCKET" "${ENV_FILE}")"
|
|
53
|
+
|
|
54
|
+
declare -A BUCKETS=()
|
|
55
|
+
[[ -n "${PLAN_BUCKET}" ]] && BUCKETS["${PLAN_BUCKET}"]=1
|
|
56
|
+
[[ -n "${CONTEXT_BUCKET}" ]] && BUCKETS["${CONTEXT_BUCKET}"]=1
|
|
57
|
+
|
|
58
|
+
if [[ ${#BUCKETS[@]} -gt 0 ]]; then
|
|
59
|
+
echo "Applying Cloud Storage IAM for runtime access..."
|
|
60
|
+
for BUCKET in "${!BUCKETS[@]}"; do
|
|
61
|
+
grant_bucket_access "${BUCKET}"
|
|
62
|
+
done
|
|
63
|
+
else
|
|
64
|
+
echo "No RIOTPLAN_*_BUCKET values found in ${ENV_FILE}; skipping IAM binding."
|
|
65
|
+
fi
|
|
66
|
+
else
|
|
67
|
+
echo "SKIP_STORAGE_IAM=true, skipping bucket IAM binding."
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
gcloud builds submit "${SCRIPT_DIR}" \
|
|
71
|
+
--project="${PROJECT_ID}" \
|
|
72
|
+
--config="${SCRIPT_DIR}/cloudbuild.from-npm.yaml" \
|
|
73
|
+
--substitutions="_REGION=${REGION},_SERVICE_NAME=${SERVICE_NAME},_AR_REPO=${AR_REPO},_IMAGE_NAME=${IMAGE_NAME},_SERVICE_ACCOUNT=${SERVICE_ACCOUNT},_ENV_VARS_FILE=$(basename "${ENV_FILE}"),_OPENAI_SECRET=${OPENAI_SECRET},_RIOTPLAN_MCP_HTTP_VERSION=${RIOTPLAN_MCP_HTTP_VERSION},_REQUEST_TIMEOUT=${REQUEST_TIMEOUT},_MIN_INSTANCES=${MIN_INSTANCES}"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
MCP_PORT: "8080"
|
|
2
|
+
RIOTPLAN_DEBUG: "true"
|
|
3
|
+
RIOTPLAN_HTTP_SECURED: "false"
|
|
4
|
+
RBAC_USERS_PATH: "/var/run/riotplan-rbac/users.yaml"
|
|
5
|
+
RBAC_KEYS_PATH: "/var/run/riotplan-rbac/keys.yaml"
|
|
6
|
+
RBAC_POLICY_PATH: "/var/run/riotplan-rbac/policy.yaml"
|
|
7
|
+
RBAC_RELOAD_SECONDS: "0"
|
|
8
|
+
RIOTPLAN_CLOUD_ENABLED: "true"
|
|
9
|
+
RIOTPLAN_CLOUD_INCREMENTAL_SYNC_ENABLED: "true"
|
|
10
|
+
RIOTPLAN_CLOUD_SYNC_FRESHNESS_TTL_MS: "5000"
|
|
11
|
+
RIOTPLAN_CLOUD_SYNC_TIMEOUT_MS: "120000"
|
|
12
|
+
RIOTPLAN_PLAN_BUCKET: "riotplan"
|
|
13
|
+
RIOTPLAN_PLAN_PREFIX: "plans"
|
|
14
|
+
RIOTPLAN_CONTEXT_BUCKET: "redaksjon"
|
|
15
|
+
RIOTPLAN_CONTEXT_PREFIX: "context"
|
|
16
|
+
RIOTPLAN_CLOUD_CACHE_DIR: "/tmp/riotplan-cache"
|
|
17
|
+
GOOGLE_CLOUD_PROJECT: "discursive"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
keys:
|
|
2
|
+
- key_id: key-reader
|
|
3
|
+
# Use scrypt format: scrypt$N$r$p$<salt_base64>$<derived_key_base64>
|
|
4
|
+
secret_hash: "scrypt$16384$8$1$REPLACE_WITH_BASE64_SALT$REPLACE_WITH_BASE64_HASH"
|
|
5
|
+
user_id: user-reader
|
|
6
|
+
enabled: true
|
|
7
|
+
created_at: "2026-03-03T00:00:00Z"
|
|
8
|
+
expires_at: null
|
|
9
|
+
- key_id: key-admin
|
|
10
|
+
secret_hash: "scrypt$16384$8$1$REPLACE_WITH_BASE64_SALT$REPLACE_WITH_BASE64_HASH"
|
|
11
|
+
user_id: user-admin
|
|
12
|
+
enabled: true
|
|
13
|
+
created_at: "2026-03-03T00:00:00Z"
|
|
14
|
+
expires_at: null
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
rules:
|
|
2
|
+
"GET /health":
|
|
3
|
+
public: true
|
|
4
|
+
"GET /auth/whoami":
|
|
5
|
+
any_roles: ["*"]
|
|
6
|
+
"GET /admin/ping":
|
|
7
|
+
any_roles: [admin]
|
|
8
|
+
"GET /plan/:planId":
|
|
9
|
+
any_roles: ["*"]
|
|
10
|
+
"POST /plan/upload":
|
|
11
|
+
any_roles: [admin]
|
|
12
|
+
"POST /mcp":
|
|
13
|
+
any_roles: ["*"]
|
|
14
|
+
"GET /mcp":
|
|
15
|
+
any_roles: ["*"]
|
|
16
|
+
"DELETE /mcp":
|
|
17
|
+
any_roles: ["*"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
6
|
+
SERVER_ENTRYPOINT="${REPO_ROOT}/dist/bin-http.js"
|
|
7
|
+
|
|
8
|
+
HOST="${RIOTPLAN_HOST:-127.0.0.1}"
|
|
9
|
+
PORT="${RIOTPLAN_MCP_PORT:-3002}"
|
|
10
|
+
PLANS_DIR="${RIOTPLAN_PLANS_DIR:-${SCRIPT_DIR}/plans}"
|
|
11
|
+
CONTEXT_DIR="${RIOTPLAN_CONTEXT_DIR:-${SCRIPT_DIR}/context}"
|
|
12
|
+
|
|
13
|
+
if [[ ! -f "${SERVER_ENTRYPOINT}" ]]; then
|
|
14
|
+
echo "Missing server entrypoint: ${SERVER_ENTRYPOINT}" >&2
|
|
15
|
+
echo "Build riotplan-mcp-http first (from ${REPO_ROOT}): npm run build" >&2
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
mkdir -p "${PLANS_DIR}" "${CONTEXT_DIR}"
|
|
20
|
+
|
|
21
|
+
echo "Starting local RiotPlan MCP HTTP server"
|
|
22
|
+
echo "Entrypoint: ${SERVER_ENTRYPOINT}"
|
|
23
|
+
echo "Plans dir: ${PLANS_DIR}"
|
|
24
|
+
echo "Context dir: ${CONTEXT_DIR}"
|
|
25
|
+
echo "URL: http://${HOST}:${PORT}"
|
|
26
|
+
echo "Health: http://${HOST}:${PORT}/health"
|
|
27
|
+
|
|
28
|
+
exec node "${SERVER_ENTRYPOINT}" \
|
|
29
|
+
--port "${PORT}" \
|
|
30
|
+
--plans-dir "${PLANS_DIR}" \
|
|
31
|
+
--context-dir "${CONTEXT_DIR}" \
|
|
32
|
+
"$@"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
SUGGESTED_SPLITS:
|
|
2
|
+
Split 1:
|
|
3
|
+
Files: [
|
|
4
|
+
".gitignore",
|
|
5
|
+
"deploy/cloud-run/.gitignore",
|
|
6
|
+
"deploy/cloud-run/Dockerfile",
|
|
7
|
+
"deploy/cloud-run/Dockerfile.from-npm",
|
|
8
|
+
"deploy/cloud-run/cloudbuild.from-npm.yaml",
|
|
9
|
+
"deploy/cloud-run/cloudbuild.yaml",
|
|
10
|
+
"deploy/cloud-run/deploy-prod.sh",
|
|
11
|
+
"deploy/cloud-run/env.example.yaml",
|
|
12
|
+
"deploy/cloud-run/rbac-keys.example.yaml",
|
|
13
|
+
"deploy/cloud-run/rbac-policy.example.yaml",
|
|
14
|
+
"deploy/cloud-run/rbac-users.example.yaml",
|
|
15
|
+
"deploy/local/.gitignore",
|
|
16
|
+
"deploy/local/riotplan-local.sh"
|
|
17
|
+
]
|
|
18
|
+
Rationale: These files are focused on the deployment setup and configuration for both local and cloud-run environments. They were all modified within a short time frame during the same session, indicating they are part of a cohesive change.
|
|
19
|
+
Message: configure deployment setup for local and Cloud Run environments
|
|
20
|
+
|
|
21
|
+
Split 2:
|
|
22
|
+
Files: [
|
|
23
|
+
"deploy/local/README.md",
|
|
24
|
+
"guide/cloud-run.md"
|
|
25
|
+
]
|
|
26
|
+
Rationale: This set of files relates to documentation updates. The changes are focused on improving user guides and instructions, which can be reviewed independently of the deployment configuration changes.
|
|
27
|
+
Message: update README and guides for local and Cloud Run usage
|
|
28
|
+
|
|
29
|
+
Split 3:
|
|
30
|
+
Files: [
|
|
31
|
+
"src/tools/context.ts",
|
|
32
|
+
"src/tools/idea.ts",
|
|
33
|
+
"src/tools/reflect.ts",
|
|
34
|
+
"src/tools/shaping.ts",
|
|
35
|
+
"src/tools/status.ts",
|
|
36
|
+
"src/tools/step.ts"
|
|
37
|
+
]
|
|
38
|
+
Rationale: These files are all part of the source code and represent changes to various tools within the application. They were modified as part of a separate work session focused on development rather than configuration or documentation.
|
|
39
|
+
Message: refactor tools for enhanced functionality and maintainability
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kjerneverk/riotplan-mcp-http",
|
|
3
|
+
"version": "1.0.26-dev.0",
|
|
4
|
+
"description": "HTTP MCP server package for RiotPlan",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=24.0.0"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"clean": "rm -rf dist",
|
|
19
|
+
"build": "echo \"MCP HTTP extraction in progress\"",
|
|
20
|
+
"test": "echo \"No standalone tests yet\"",
|
|
21
|
+
"test:coverage": "npm run test",
|
|
22
|
+
"lint": "echo \"No standalone lint yet\"",
|
|
23
|
+
"precommit": "npm run build && npm run lint && npm run test",
|
|
24
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"riotplan",
|
|
28
|
+
"mcp",
|
|
29
|
+
"http",
|
|
30
|
+
"server"
|
|
31
|
+
],
|
|
32
|
+
"author": "Tim O'Brien <tobrien@discursive.com>",
|
|
33
|
+
"license": "Apache-2.0",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/kjerneverk/riotplan-mcp-http"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@kjerneverk/riotplan": "^1.0.26-dev.0",
|
|
40
|
+
"@kjerneverk/riotplan-core": "^1.0.26-dev.0",
|
|
41
|
+
"@kjerneverk/riotplan-format": "^1.0.1"
|
|
42
|
+
}
|
|
43
|
+
}
|