Skip to main content

scrumdo-mcp

Connect Claude Code, Codex, Cursor, OpenCode, Antigravity, GitHub Copilot, and other MCP hosts to your ScrumDo / Spryng boards over local stdio.

The default connection is a personal smcp_ token and the collaborate tool profile: read, comment, propose, and follow events as you. A broad organization API key is not equivalent human identity.


Installation

pip install scrumdo-mcp

Requires Python 3.11+. The process speaks MCP over stdio (scrumdo-mcp). That local path is the supported compatibility floor.

The hosted Django endpoint POST https://app.spryng.io/api/scrumdo/organizations/<org>/mcp/rpc/ is a transitional bearer beta. It is not OAuth and is not official Streamable HTTP general availability. Prefer stdio until remote GA.


Get a personal token

  1. Sign in at https://app.spryng.io.
  2. Open your organization → Settings → MCP Tokens.
  3. Create a named personal connection and copy the secret once.

Personal tokens start with smcp_. Do not use Settings → API Tokens (OrgAPIKey) for human AI-client collaboration.

Your org and project slugs are the path segments in app.spryng.io/my-company/engineering.


Local stdio (supported)

Replace the placeholder. Never commit a real token.

Cursor — ~/.cursor/mcp.json

{
  "mcpServers": {
    "scrumdo": {
      "command": "scrumdo-mcp",
      "env": {
        "SCRUMDO_TOKEN": "smcp_YOUR_PERSONAL_TOKEN",
        "SCRUMDO_ORG": "your-org-slug",
        "SCRUMDO_PROJECT": "your-default-project-slug",
        "SCRUMDO_BASE_URL": "https://app.spryng.io",
        "SCRUMDO_MCP_PROFILE": "collaborate",
        "SCRUMDO_CLIENT_NAME": "cursor"
      }
    }
  }
}

Claude Code — ~/.claude.json

Same mcpServers shape as Cursor. Prefer the CLI so you do not edit ~/.claude/claude.json by mistake:

claude mcp add scrumdo \
  -e SCRUMDO_TOKEN=smcp_YOUR_PERSONAL_TOKEN \
  -e SCRUMDO_ORG=your-org-slug \
  -e SCRUMDO_PROJECT=your-default-project-slug \
  -e SCRUMDO_BASE_URL=https://app.spryng.io \
  -e SCRUMDO_MCP_PROFILE=collaborate \
  -e SCRUMDO_CLIENT_NAME=claude-code \
  -- scrumdo-mcp

Codex — ~/.codex/config.toml

[mcp_servers.scrumdo]
command = "scrumdo-mcp"

[mcp_servers.scrumdo.env]
SCRUMDO_TOKEN = "smcp_YOUR_PERSONAL_TOKEN"
SCRUMDO_ORG = "your-org-slug"
SCRUMDO_PROJECT = "your-default-project-slug"
SCRUMDO_BASE_URL = "https://app.spryng.io"
SCRUMDO_MCP_PROFILE = "collaborate"
SCRUMDO_CLIENT_NAME = "codex"

Restart Codex after changing the token so the stdio process picks up the new env.

OpenCode — opencode.json

OpenCode uses a top-level mcp object (not mcpServers):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "scrumdo": {
      "type": "local",
      "command": ["scrumdo-mcp"],
      "enabled": true,
      "environment": {
        "SCRUMDO_TOKEN": "smcp_YOUR_PERSONAL_TOKEN",
        "SCRUMDO_ORG": "your-org-slug",
        "SCRUMDO_PROJECT": "your-default-project-slug",
        "SCRUMDO_BASE_URL": "https://app.spryng.io",
        "SCRUMDO_MCP_PROFILE": "collaborate",
        "SCRUMDO_CLIENT_NAME": "opencode"
      }
    }
  }
}

Antigravity

Use the same mcpServers shape as Cursor and set SCRUMDO_CLIENT_NAME=antigravity. The connector still enforces the personal smcp_ credential and collaborate profile server-side.

GitHub Copilot Chat — .vscode/mcp.json

Use Copilot Chat in Agent mode with a local stdio server:

{
  "servers": {
    "scrumdo": {
      "type": "stdio",
      "command": "scrumdo-mcp",
      "env": {
        "SCRUMDO_TOKEN": "smcp_YOUR_PERSONAL_TOKEN",
        "SCRUMDO_ORG": "your-org-slug",
        "SCRUMDO_PROJECT": "your-default-project-slug",
        "SCRUMDO_BASE_URL": "https://app.spryng.io",
        "SCRUMDO_MCP_PROFILE": "collaborate",
        "SCRUMDO_CLIENT_NAME": "github-copilot-vscode"
      }
    }
  }
}

GitHub Copilot CLI — ~/.copilot/mcp-config.json

{
  "mcpServers": {
    "scrumdo": {
      "type": "stdio",
      "command": "scrumdo-mcp",
      "args": [],
      "env": {
        "SCRUMDO_TOKEN": "smcp_YOUR_PERSONAL_TOKEN",
        "SCRUMDO_ORG": "your-org-slug",
        "SCRUMDO_PROJECT": "your-default-project-slug",
        "SCRUMDO_BASE_URL": "https://app.spryng.io",
        "SCRUMDO_MCP_PROFILE": "collaborate",
        "SCRUMDO_CLIENT_NAME": "github-copilot-cli"
      }
    }
  }
}

GitHub Copilot cloud agent is not this personal-machine flow. Do not put a person's smcp_ token into a shared repository or organization Agent secret.


Hosted remote (beta, not GA)

You can point a remote-capable host at:

https://app.spryng.io/api/scrumdo/organizations/<org>/mcp/rpc/

with Authorization: Bearer smcp_….

This is the current Workbench bearer JSON-RPC POST. It is not OAuth 2.1, Protected Resource Metadata, or full Streamable HTTP GA. Treat it as beta. Local stdio remains the compatibility floor.

Microsoft 365 Copilot through Copilot Studio is not supported by this beta endpoint. It requires the planned standards-conformant Streamable HTTP endpoint and delegated per-user OAuth; a shared API key is not equivalent human identity.


Tool profiles

Profile Env What the model sees
collaborate (default) SCRUMDO_MCP_PROFILE=collaborate or unset Identity/capability discovery; card search/read and handoff brief; comments and blackboard notes; spec read and publish-as-proposal; proposal read/revise/request-changes; decision inbox and challenge status; run read/status; events.wait / events.ack
compat SCRUMDO_MCP_PROFILE=compat All registered tools, including card mutation, deletes, webhooks, inbox wait_for_notifications, direct spec writes, and run/loop writes. Aliases: full, legacy, all.

Call get_mcp_capabilities() for the exact tool_count and names on your process. This package version registers 56 tools on collaborate and 135 on compat (the previous 133 plus events.wait / events.ack). Compat restores the large surface only when you opt in.

Deprecated / inbox-coupled: wait_for_notifications stays in compat only. New clients should use events.wait / events.ack (connection cursor, independent of the web inbox).


Identity

  • Personal smcp_ token → credential_kind=personal_mcp, human collaboration.
  • Broad OrgAPIKey → org_api_key. The server refuses to start unless you set SCRUMDO_ALLOW_ORG_API_KEY=1. That flag is an explicit, documented compatibility mode. It does not make the key equivalent to a person.
  • SCRUMDO_AGENT_RUN_ID describes a run-scoped session, not human identity.

Events

events.wait(after?, timeout_s, limit) and events.ack(cursor) follow the frozen connection-cursor contract. Envelopes are schema_version 1 with a safe_summary only. If the cursor is behind the 30-day retention floor the adapter returns cursor_expired plus a handoff instruction.


Security

  • Create and revoke tokens at Settings → MCP Tokens, not API Tokens.
  • The secret is shown once. Do not put a real token in chat, git, tests, or docs.
  • Default collaborate omits deletes, webhook admin, org config, secrets, deployment, and direct accepted-spec writes.
  • Concurrent writes that this package translates carry Idempotency-Key / expected_version (and If-Match) when callers supply them. Closed error codes include not_found_or_denied, wrong_organization, connection_revoked, grant_required, human_step_up_required, stale_resource, duplicate_command, rate_limited, cursor_expired, unsupported_client_capability.
  • Revoke a connection if a machine is lost. The next operation fails.

Environment variables

Variable Default Description
SCRUMDO_TOKEN Required. Personal smcp_ token from Settings → MCP Tokens
SCRUMDO_ORG Organization slug
SCRUMDO_PROJECT Default project slug
SCRUMDO_BASE_URL https://app.spryng.io API base URL
SCRUMDO_MCP_PROFILE collaborate collaborate or compat
SCRUMDO_ALLOW_ORG_API_KEY unset Deprecated opt-in to start with an OrgAPIKey
SCRUMDO_AGENT_RUN_ID Optional run attribution header
SCRUMDO_CLIENT_NAME mcp Host name (codex, claude-code, cursor, opencode, antigravity, github-copilot-vscode, or github-copilot-cli)
SPRYNG_LOOP_ID Optional loop attribution

Legacy SPRYNG_* names are still accepted as aliases.


What you can do (collaborate)

"What cards need my attention?"
"Read ENG-42 and the handoff brief"
"Comment on ENG-42 that the proposal is up"
"Publish this spec as a proposal on ENG-42"
"Wait for the next board event for this connection"

Direct column moves, webhook admin, and accepted-spec overwrites are not on the default profile.


Live conformance (opt-in)

The package includes a stdio-protocol harness (python -m spryng_mcp.conformance). The default hermetic mode launches two real scrumdo-mcp processes against an in-process HTTP fixture. It does not talk to Django.

The two-user live run is opt-in and fail-closed. It never reads tokens from source or fixtures. Export personal smcp_ values only in the process environment (never commit them):

Variable Required for live Purpose
SCRUMDO_LIVE_CONFORMANCE yes (1) Opt-in gate
SCRUMDO_ALICE_TOKEN yes Personal connection A
SCRUMDO_BOB_TOKEN yes Personal connection B
SCRUMDO_READONLY_TOKEN yes Read-only / guest control
SCRUMDO_UNRELATED_TOKEN yes Unrelated-room control
SCRUMDO_REVOKED_TOKEN yes Already-revoked personal token
SCRUMDO_TARGET_RUN_ID yes AgentRun id under test (do not reuse SCRUMDO_AGENT_RUN_ID)
SCRUMDO_BASE_URL no Default http://127.0.0.1:8018
SCRUMDO_ORG no Default test-account-a
SCRUMDO_PROJECT no Default room project slug
SCRUMDO_CARD_REF no Default AG-2
SCRUMDO_FOREIGN_ORG no Other-org slug for closed denial
SCRUMDO_ALICE_CLIENT / SCRUMDO_BOB_CLIENT no Distinct client names
SCRUMDO_COPILOT_TOKEN no Defaults to Alice; use with Copilot client name
SCRUMDO_ORG_API_KEY no Negative OrgAPIKey case
SCRUMDO_WEB_SESSIONID no Django session cookie for s8 web-inbox independence
SCRUMDO_WEB_CSRFTOKEN no CSRF token paired with the web session
SCRUMDO_WEB_SESSION_COOKIE_NAME no Session cookie name; defaults to sessionid (Spryng uses sprsession)
python -m spryng_mcp.conformance hermetic
SCRUMDO_LIVE_CONFORMANCE=1 python -m spryng_mcp.conformance live

If a required live name is missing, the command exits 2 with a missing-fixture message that lists names only.


Development

git clone https://github.com/ScrumDoLLC/scrumdo-mcp.git
cd scrumdo-mcp
pip install -e ".[dev]"
pytest tests/ -v
python -m spryng_mcp.conformance hermetic

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scrumdo_mcp-0.5.2.tar.gz (97.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

scrumdo_mcp-0.5.2-py3-none-any.whl (104.5 kB view details)

Uploaded Python 3

File details

Details for the file scrumdo_mcp-0.5.2.tar.gz.

File metadata

  • Download URL: scrumdo_mcp-0.5.2.tar.gz
  • Upload date:
  • Size: 97.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for scrumdo_mcp-0.5.2.tar.gz
Algorithm Hash digest
SHA256 5f4362a1cb43f4c6ed3013f80dfb641cd61fe523ad9aadd19cc3326f00dbb689
MD5 c81c5e5d226b2611c26ea7afcf93fce4
BLAKE2b-256 650eee2a9cf00d712eda6f63bb25976f65a1ab1795caa3bd22f759ccc1af12d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for scrumdo_mcp-0.5.2.tar.gz:

Publisher: publish.yml on ScrumDoLLC/scrumdo-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file scrumdo_mcp-0.5.2-py3-none-any.whl.

File metadata

  • Download URL: scrumdo_mcp-0.5.2-py3-none-any.whl
  • Upload date:
  • Size: 104.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for scrumdo_mcp-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7f0b704dcb4b8fb495e193a5fd2e740edd0f61965f5f55fe0f13e661c00c8bae
MD5 16b001cad417d86df055a50f728c2604
BLAKE2b-256 24a301d11ebbb116ad4324087dd65db66533e1f3d79a5014c5e7dbc54daa2302

See more details on using hashes here.

Provenance

The following attestation bundles were made for scrumdo_mcp-0.5.2-py3-none-any.whl:

Publisher: publish.yml on ScrumDoLLC/scrumdo-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.6.0

1 file

0.5.3

1 file

This release

0.5.2 This release

2 files

0.4.7

2 files

0.4.6

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.1

2 files

0.4.0

2 files

0.3.6

2 files

0.2.12

2 files

0.2.11

2 files

0.2.10

2 files

0.2.9

2 files

0.2.8

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page