From a4384655d03f24201dce0ff504f9eaa7b085acae Mon Sep 17 00:00:00 2001 From: ang3l12 Date: Wed, 8 Jul 2026 19:16:38 -0600 Subject: [PATCH] README accuracy pass: fix mcp-remote header pattern, add skill install steps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Desktop config examples showed an inline 'Authorization: Bearer ...' header, which Claude Desktop breaks by splitting args on spaces — replace with the verified env-var pattern (Authorization:${MCP_AUTH_HEADER}, no space). Also: document how the skill is installed/discovered in Claude Code, note the person command in the CLI summary, and correct /health description (it now reports the secret-expiry countdown). Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 19 ++++++++++++++----- mcp-server/README.md | 11 +++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 68d37dc..7d6906a 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The repo ships the same capability in two forms, sharing one core Graph client │ ├── SKILL.md # how the skill works + usage │ ├── .env.example # credential template (.env is git-ignored) │ ├── scripts/ -│ │ ├── sp.mjs # CLI: test|lists|columns|items|get|create|update|delete +│ │ ├── sp.mjs # CLI: test|lists|columns|items|get|person|create|update|delete │ │ └── lib/graph.mjs # shared, dependency-free Graph client (single source of truth) │ └── references/ │ ├── setup.md # Azure AD (Entra) app registration walkthrough @@ -48,6 +48,12 @@ Credentials live only in git-ignored `.env` files — **never commit secrets.** ## Option A — the skill (Claude Code) +**Install:** clone this repo and open it in Claude Code — skills under +`.claude/skills/` are discovered automatically at session start (invokable as +`/sharepoint-lists`). To use the skill in a *different* project, copy the +`.claude/skills/sharepoint-lists/` folder into that project (or into +`~/.claude/skills/` to make it available everywhere), then create its `.env`: + ```bash cp .claude/skills/sharepoint-lists/.env.example .claude/skills/sharepoint-lists/.env # fill in SP_TENANT_ID / SP_CLIENT_ID / SP_CLIENT_SECRET (optionally SP_SITE_URL) @@ -129,7 +135,7 @@ curl -s http://localhost:3838/health # -> {"ok":true,...} The service has `restart: unless-stopped` and a healthcheck. The port publishes on all host interfaces; restrict it to a LAN IP in `docker-compose.yml` (or via firewall) if desired — the bearer token guards `/mcp` regardless. `/health` is -intentionally open (liveness only, returns no data). +intentionally open (liveness + secret-expiry countdown only; no secrets). Full hosting details: [mcp-server/README.md](mcp-server/README.md). @@ -163,16 +169,19 @@ server automatically. "-y", "mcp-remote", "http://:3838/mcp", "--allow-http", - "--header", "Authorization: Bearer ${SP_MCP_TOKEN}" + "--header", "Authorization:${MCP_AUTH_HEADER}" ], - "env": { "SP_MCP_TOKEN": "" } + "env": { "MCP_AUTH_HEADER": "Bearer " } } } } ``` `--allow-http` permits a plain-HTTP LAN URL; the token must match the container's -`MCP_AUTH_TOKEN`. Fully quit and reopen Claude Desktop after editing the config. +`MCP_AUTH_TOKEN`. Note the header value is passed via the env var (including the +`Bearer ` prefix) and there is **no space after `Authorization:`** — Claude +Desktop splits config args on spaces, so an inline `Bearer ` breaks. +Fully quit and reopen Claude Desktop after editing the config. --- diff --git a/mcp-server/README.md b/mcp-server/README.md index 841703e..c013268 100644 --- a/mcp-server/README.md +++ b/mcp-server/README.md @@ -91,16 +91,18 @@ Desktop: "-y", "mcp-remote", "http://192.168.101.12:3838/mcp", "--allow-http", - "--header", "Authorization: Bearer ${SP_MCP_TOKEN}" + "--header", "Authorization:${MCP_AUTH_HEADER}" ], - "env": { "SP_MCP_TOKEN": "" } + "env": { "MCP_AUTH_HEADER": "Bearer " } } } } ``` `--allow-http` permits the plain-HTTP LAN URL (no TLS). The token must match the -container's `MCP_AUTH_TOKEN`. +container's `MCP_AUTH_TOKEN`. The header value goes through the env var (with the +`Bearer ` prefix) and there is **no space after `Authorization:`** — Claude +Desktop splits config args on spaces, so an inline `Bearer ` breaks. ### Claude Desktop → local stdio (no container) @@ -124,6 +126,7 @@ The repo-root `.mcp.json` registers the local stdio server automatically. - App-only auth = the server has full access to the granted SharePoint sites with no per-user check. Anyone who can reach an unauthenticated `/mcp` has that access — always set `MCP_AUTH_TOKEN` for the HTTP transport. -- `/health` is intentionally unauthenticated (liveness only; returns no data). +- `/health` is intentionally unauthenticated (liveness + secret-expiry countdown + only; no secrets). - Field formats for writes (person/lookup/choice/date) are in `../.claude/skills/sharepoint-lists/references/graph-api.md`.