{"slug": "connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http", "title": "Connect Cursor to a Live Project Board over Hosted MCP (Streamable HTTP)", "summary": "Soheil Saheb-Jamii (Anymfah) has built Stellary's MCP surface, enabling AI hosts to connect to the same NestJS backend as the app via hosted Streamable HTTP at https://api.stellary.co/mcp. The setup guide details configuring clients like Cursor or Claude Desktop with OAuth or a read-only personal access token, then verifying access with list_projects and other read-only tools. Saheb-Jamii emphasizes starting with read-only scopes and notes that every call is rechecked against scopes, project membership, and agent status.", "body_md": "I’m Soheil Saheb-Jamii (Anymfah). I built Stellary’s MCP surface so an AI host talks to the same NestJS backend as the app — not a toy wrapper and not a local stdio process you have to babysit.\n\nThis post is a setup guide. By the end you should have the endpoint in your client, a read-only credential, and one successful `list_projects` call.\n\nOnce connected, the host sees Stellary tools the same way it sees any other MCP server. Typical Agent loop:\n\nNo separate daemon. No `npx` package. Transport is **hosted Streamable HTTP** at:\n\n`https://api.stellary.co/mcp`\n\nGET is useful for discovery / negotiation; POST carries MCP requests. The server creates a fresh transport per request, so clients that do not persist `Mcp-Session-Id` still work.\n\nPrefer OAuth when the client supports it. In Cursor or Claude Desktop-style configs, URL-only is enough — the client discovers Stellary, opens consent, and stores tokens. No PAT in the file.\n\nDrop that in `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project), or the equivalent MCP settings UI. Restart / reload MCP tools until `stellary` shows as connected.\n\nIf your client cannot complete OAuth, create a personal access token in [app.stellary.co](https://app.stellary.co) under Account settings → API tokens. Start with:\n\n`projects:read` — boards, cards, documents, project context`pilotage:read` — cockpit and steering signals\nA PAT acts as **you** (the human). Workspace membership and project access still apply on every call. Add write scopes only after the read path works.\n\nPut the secret in an environment variable — never paste a raw token into the article, git, or a shared gist:\n\n```\n{\n  \"mcpServers\": {\n    \"stellary\": {\nExport `STELLARY_TOKEN` in the environment that launches the IDE / MCP host. Revoke the token if it ever leaks.\n\n## First read-only checks\n\nAsk the agent (or call tools manually) in this order. Stay on reads until the IDs look right.\n\n1. **`list_projects`** — confirm the workspace and project list match what you see in the app.\n2. **`list_cards`** (or `get_project_details`) with an **exact project ID** from step 1 — fuzzy name matching exists, but IDs are safer.\n3. **Cockpit** — `get_cockpit_dashboard` or `get_pilotage_state` with `pilotage:read` — sprint / steering signals without opening the browser.\n\nIf `list_projects` fails with 401, the host is not sending a valid Bearer (OAuth session expired, missing header, or env var not visible to the client process). Fix auth before adding write scopes.\n\n## Tools overview (board / cockpit / missions)\n\nExact tool lists depend on identity and installed plugins. At a high level:\n\n| Area | What you use it for | Examples |\n| --- | --- | --- |\n| **Board** | Inspect and change delivery work | `list_projects`, `list_cards`, `get_card_details`, `create_card`, `move_card`, `assign_card`, `add_comment` |\n| **Cockpit** | Supervision and steering | `get_pilotage_state`, `get_cockpit_dashboard`, `get_agent_status`, `list_pending_proposals` |\n| **Missions** | External agent loops against queued work | `stellary_init`, `get_next_mis\nFull registry and edge cases live in the docs — this post is the minimum path to a live read.\n\n## Permissions worth remembering\n\n- **PAT = human identity.** Same access you have in the UI, narrowed by token scopes.\n- **Start read-only:** `projects:read` + `pilotage:read`.\n- **Writes:** add `projects:write` / `pilotage:write` only when you need them.\n- **Every call is rechecked:** scopes, project membership, agent status, and mission context stay authoritative. Suspending an agent or revoking a token takes effect immediately.\n\n## Links\n\n- Docs: [https://stellary.co/docs/mcp/](https://stellary.co/docs/mcp/)\n- Repo: [https://github.com/Anymfah/stellary-mcp](https://github.com/Anymfah/stellary-mcp)\n- App: [https://app.stellary.co](https://app.stellary.co)\n\n## Cover image note\n\nUse a screenshot of the Stellary Kanban board from the app (columns + cards). Upload it as the Dev.to cover; keep the path/filename local to your editor — do not invent a CDN URL here.\n\n---\n\nThat’s the whole first mile: URL in `mcp.json`, OAuth or `STELLARY_TOKEN`, then `list_projects` → cards → cockpit. If something breaks, check Bearer format and that the MCP host process can see the env var before you dig into tool names.sion` / `wait_for_mission`, `complete_mission`, `fail_mission` |\n\nInteractive use with a human PAT: board + cockpit first. Queued missions and most plugin tools (GitHub, Slack, etc.) fit better with a dedicated **agent token** and the agent’s autonomy policy (`approval` / `supervised` / `autonomous`). Humans act as themselves; agent proposal rules apply to agent tokens.\n\n      \"url\": \"https://api.stellary.co/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer ${env:STELLARY_TOKEN}\"\n      }\n    }\n  }\n}\n{\n  \"mcpServers\": {\n    \"stellary\": {\n      \"url\": \"https://api.stellary.co/mcp\"\n    }\n  }\n}\n```\n\n", "url": "https://wpnews.pro/news/connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http", "canonical_source": "https://dev.to/anymfah/connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http-154o", "published_at": "2026-09-08 23:28:23+00:00", "updated_at": "2026-09-09 00:15:50.530173+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-agents", "mlops"], "entities": ["Soheil Saheb-Jamii", "Stellary", "Cursor", "Claude Desktop", "NestJS", "MCP"], "alternates": {"html": "https://wpnews.pro/news/connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http", "markdown": "https://wpnews.pro/news/connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http.md", "text": "https://wpnews.pro/news/connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http.txt", "jsonld": "https://wpnews.pro/news/connect-cursor-to-a-live-project-board-over-hosted-mcp-streamable-http.jsonld"}}