{
  "markdown": "<!--\nmcp-name: io.github.navaganeshr/sciple-mcp\n\nThis line is required by the MCP Registry to prove that the PyPI\npackage `sciple-mcp` belongs to the GitHub repo `navaganeshr/sciple-mcp`\n(see https://registry.modelcontextprotocol.io). Do not remove.\n-->\n\n# Sciple Platform MCP Server\n\nMCP server that lets a local Claude populate and manage Sciple platform content — environments, services, observability dashboards, runbooks, projects, and tickets — via the Sciple REST API. Engineers use it to bootstrap tenant structure, maintain the service catalog, build dashboards, author runbooks, and triage tickets without leaving their AI coding session.\n\n**Distribution channels:**\n\n| Channel | Use it from | How to install |\n|---|---|---|\n| **PyPI** | Claude Code, custom scripts, CI | `uvx sciple-mcp` |\n| **MCP Registry** | Anywhere an MCP client speaks the registry protocol | Resolves automatically by `io.github.navaganeshr/sciple-mcp` |\n| **Desktop Extension** (`.dxt`) | Claude Desktop | Double-click `sciple-mcp-<version>.dxt` from the [GitHub release](https://github.com/navaganeshr/sciple-mcp/releases/latest) |\n\n- PyPI: <https://pypi.org/project/sciple-mcp/>\n- MCP Registry: <https://registry.modelcontextprotocol.io/v0/servers/io.github.navaganeshr%2Fsciple-mcp>\n- Source: <https://github.com/navaganeshr/sciple-mcp>\n\n## Install\n\n```bash\n# Install uv (one-time, only if you don't have it)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n```\n\n`uvx sciple-mcp` resolves the latest version from PyPI and caches it.\n\n## Authentication — OAuth only (v0.7.0+)\n\n`sciple-mcp` authenticates against the Sciple platform via **OAuth 2.0\nwith PKCE**. The CLI is a credential helper: log in once via the\nbrowser, the access + refresh tokens land in `~/.sciple/credentials.json`\n(mode 0600), and the MCP server reads + auto-refreshes from there.\n\n> **PAT support was removed in v0.7.0.** Earlier versions accepted\n> `SCIPLE_API_TOKEN=sciple_pat_…` in the env (stdio mode). That path is\n> gone — the only credential the MCP server understands is the OAuth\n> JWT minted by `sciple-mcp login`. Personal Access Tokens on the\n> platform are unchanged and still work for scripts / CI / direct REST\n> calls against `/api/v1/*`.\n\n### 1. Log in (one-time per platform)\n\n```bash\nsciple-mcp login --platform-url https://your.sciple.cloud\n```\n\nOpens your browser, you click Approve on the consent page, the CLI\ncaptures the callback and writes the credential. No `--tenant-id` /\n`--scope` needed — the JWT inherits your full role on whichever tenant\nthe dashboard is currently showing.\n\n### 2. Wire into Claude\n\nThe Sciple platform now hosts `/mcp` itself, so the preferred shape is\nStreamable HTTP straight to the platform:\n\n```bash\n# Claude Code (HTTP transport — preferred)\nclaude mcp add-json sciple-platform \"$(cat <<EOF\n{\n  \"type\": \"http\",\n  \"url\": \"https://your.sciple.cloud/mcp\",\n  \"headers\": { \"Authorization\": \"Bearer $(sciple-mcp print-token)\" }\n}\nEOF\n)\"\n```\n\nFor Claude Desktop builds that only speak stdio MCP today, use the\nstdio mode — same credential, no PAT:\n\n```json\n{\n  \"mcpServers\": {\n    \"sciple-platform\": {\n      \"command\": \"uvx\",\n      \"args\": [\"sciple-mcp\"],\n      \"env\": {\n        \"SCIPLE_PLATFORM_URL\": \"https://your.sciple.cloud\"\n      }\n    }\n  }\n}\n```\n\n`SCIPLE_PLATFORM_URL` is optional — only needed if you have multiple\nplatforms cached. Stdio mode reads `~/.sciple/credentials.json`\ndirectly.\n\n### 3. Manage / rotate\n\n```bash\nsciple-mcp print-token            # current valid JWT (auto-refreshes near expiry)\nsciple-mcp logout                 # forget local cache\nsciple-mcp logout --revoke        # also revoke the refresh token server-side\n```\n\nRevoke any time from **Profile → Connected apps** on the dashboard.\n\n### Legacy: `sciple-mcp serve` (local HTTP server)\n\nFor air-gapped deployments where the client can't reach the platform's\nhosted `/mcp` endpoint, `sciple-mcp serve` still ships a local\nStreamable HTTP MCP server that re-validates OAuth JWTs against the\nplatform's JWKS. Same credential, same flow — only the network shape\ndiffers. See `--help` for `serve` / `install` / `uninstall`.\n\n## Tools\n\n### Cloud inventory (read-only)\n\n| Tool | Description |\n|---|---|\n| `list_aws_accounts` | List AWS accounts connected to the tenant (account_id, name, AWS number, regions, payer flag) |\n| `list_cloud_resource_types` | List synced resource types + row counts for one AWS service in an account |\n| `query_cloud_resources` | Query cached rows from any synced AWS resource table (paginated, region filter) |\n| `list_ec2_instances` | Summarize EC2 instances for one account or across all (state/type/id/name/ip) |\n\nThese read the platform's **last AWS sync** — they never call AWS directly and\nnever mutate anything. They require the credential to hold `cloud.view`.\n\n#### Example — explore your AWS estate\n\nAsk Claude in plain language; it chains the tools for you:\n\n> **You:** What EC2 instances are running across all our AWS accounts?\n\nClaude calls `list_ec2_instances` (no `account_id` → sweeps every connected\naccount) and summarizes:\n\n```\n45 EC2 instances across 4 accounts.\n\n### Production (account_id=LlDZzq) — 13 instances (12 running, 1 shutting-down)\n  [running] m5.2xlarge i-047323d5f680e822f portal-apps-ondemand (10.40.2.11)\n  [running] t2.micro   i-00fcaed2de8131fd1 prod-nat-instance-1a (10.40.0.9)\n  ...\n```\n\nTo drill into a single account, or a different resource type, Claude discovers\nwhat's synced first, then queries it:\n\n> **You:** Show the RDS databases in the Production account.\n\n```\n1. list_aws_accounts                  → Production has account_id \"LlDZzq\"\n2. list_cloud_resource_types(         → aws_rds_db_instance: 4\n     account_id=\"LlDZzq\", service=\"rds\")\n3. query_cloud_resources(             → 4 rows (engine, class, status, endpoint…)\n     account_id=\"LlDZzq\", service=\"rds\",\n     resource_type=\"aws_rds_db_instance\")\n```\n\n`query_cloud_resources` is the generic accessor for **any** of the 19 supported\nservices (`ec2`, `rds`, `s3`, `vpc`, `iam`, `lambda`, `eks`, `ecs`, `ebs`,\n`elasticache`, `route53`, `cloudfront`, `dynamodb`, `ecr`, `efs`, and the\n`code*` suite) — pass an unknown `service` and the tool returns the valid set.\nUse `region` to filter (`\"global\"` for S3) and `page` / `page_size` (≤500) to\nwalk large tables.\n\n### Environments\n\n| Tool | Description |\n|---|---|\n| `list_environments` | List all environments in the tenant (id, name, slug, group, default flag) |\n| `create_environment` | Create an environment with optional group assignment and default flag |\n| `update_environment` | Update an environment's name, description, group, or sort order |\n| `delete_environment` | Delete an environment by id (irreversible) |\n| `list_environment_groups` | List environment groups (id, name, slug, AWS account binding) |\n| `create_environment_group` | Create an environment group with optional AWS account binding |\n\n### Services\n\n| Tool | Description |\n|---|---|\n| `list_services` | List all services in the tenant catalog (id, name, slug) |\n| `create_service` | Create a service in the catalog with kind, language, SCM provider, and repository |\n| `update_service` | Update a service's metadata, lifecycle, owner, tags, links, or environment associations |\n| `delete_service` | Delete a service from the catalog by id (irreversible) |\n\n### Observability\n\n| Tool | Description |\n|---|---|\n| `list_dashboards` | List all observability dashboards in the tenant (id, name, panel count) |\n| `get_dashboard` | Get a dashboard's name, description, and panel list |\n| `create_dashboard` | Create a new dashboard with optional description |\n| `update_dashboard` | Replace a dashboard's name and description (full PUT; name required) |\n| `delete_dashboard` | Delete a dashboard and all its panels (irreversible) |\n| `add_panel` | Add a panel to a dashboard. Supports **5 shapes** end-to-end (pick one): **PromQL** (`promql`), **CloudWatch Metrics** (`cw_namespace`+`cw_metric_name`+`cw_stat` + optional `cw_dimensions`/`cw_period`), **ElasticSearch/OpenSearch logs** (`es_index` + optional `kql_filter`), **CloudWatch Logs** (`cw_log_group` + optional `cw_filter_pattern`), or **Text** (`text_content` + optional `text_background`). Log panels also accept display options (`log_columns`, `log_limit`, `log_wrap_message`, `log_expandable_rows`, `log_highlight_by_severity`, `log_live_tail`). Always pass `datasource_id` for metric + log panels. |\n| `delete_panel` | Delete a panel from a dashboard (irreversible) |\n\n### Runbooks\n\n| Tool | Description |\n|---|---|\n| `list_runbooks` | List all runbooks in the tenant with lifecycle status and cell count |\n| `get_runbook` | Get a runbook with its cells (name, status, content preview per cell) |\n| `create_runbook` | Create a new runbook in draft status |\n| `add_cell` | Add a markdown / shell / http cell to a runbook with optional k8s/ecs/ec2 target |\n| `update_cell` | Update a cell's content or execution target |\n| `delete_cell` | Remove a cell from a runbook |\n| `reorder_cells` | Set the execution order of all cells in a runbook |\n| `promote_runbook` | Advance the runbook lifecycle: draft → reviewed → standard |\n| `deprecate_runbook` | Mark a runbook as deprecated |\n\nRunbook lifecycle: `draft → reviewed → standard`. Deprecation is one-way from any state.\n\n### Projects\n\n| Tool | Description |\n|---|---|\n| `list_projects` | List all projects in the tenant (id, key, name, classification) |\n| `get_project` | Get a single project's details (owner, description, classification) |\n| `create_project` | Create a new project (name + uppercase key like \"PLAT\", optional classification + owner) |\n| `list_project_members` | List the user_ids and roles of a project's members (use to find an assignee) |\n| `list_project_issue_types` | List a project's issue types (required before `create_project_ticket`) |\n\n### Tickets\n\n| Tool | Description |\n|---|---|\n| `list_tickets` | List tickets across the tenant with optional filters (service, assignee, status, priority, type, tag, full-text `q`) |\n| `get_ticket` | Get a single ticket's full details + activity counts (by internal id) |\n| `create_ticket` | Create a **service-level** ticket (not bound to a project) — `tickets.manage` |\n| `update_ticket` | PATCH a ticket — change status, priority, assignee, dates, tags, parent |\n| `comment_on_ticket` | Add a comment to a ticket — `tickets.comment` |\n| `link_tickets` | Relate two tickets (`blocks` / `relates_to` / `duplicates`) |\n| `list_project_tickets` | List tickets in a project |\n| `get_project_ticket` | Get a project ticket by sequence number (the NNN in KEY-NNN) |\n| `create_project_ticket` | **Create a ticket inside a project** — returns a \"KEY-NNN\" display id. Recommended for most ticket creation. Supports `custom_fields` (JSON string of `{field_id: value}`). Requires `tickets.create`. |\n\nTicket statuses: `open → in_progress → done` (or `cancelled` from any state). Priorities: `low / medium / high / urgent`. Severities (optional): `minor / major / critical`. Types: `epic / story / task / subtask / bug`.\n\n## Security\n\nThe server can only do what the PAT's scope allows. Attempts to write without the relevant `manage` permission return a 403 from the API and are surfaced as an error in Claude's response. The PAT is revocable at any time from **Profile → Access tokens** in the Sciple dashboard — revoking it immediately cuts off the server's access without any config change.\n\n## Development\n\nTo work on the server itself:\n\n```bash\ngit clone https://github.com/navaganeshr/sciple-mcp\ncd sciple-mcp\nuv sync --all-groups\nuv run python -m pytest -q\n```\n\nReleases are tag-driven via a GitHub Actions workflow using PyPI Trusted Publishing (OIDC). To cut a release:\n\n1. Bump `version` in `pyproject.toml`.\n2. Commit, then `git tag vX.Y.Z && git push origin vX.Y.Z`.\n3. Approve the `pypi` environment deployment in the Actions UI.\n",
  "bytes": 11855,
  "sha": "cab5d1895386545dee8f509f76467997ad976ca2b0ea0a41d6d3c4ff747c6bb7",
  "repo_slug": "navaganeshr/sciple-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_navaganeshr_sciple_mcp_8700c7fe/readme"
}