{
  "markdown": "<!-- mcp-name: com.smplkit/mcp -->\n\n# smplkit MCP Server\n\n[![smplkit/mcp MCP server](https://glama.ai/mcp/servers/smplkit/mcp/badges/score.svg)](https://glama.ai/mcp/servers/smplkit/mcp)\n\nA hosted, agent-native [Model Context Protocol](https://modelcontextprotocol.io)\nserver — the gateway that lets an AI agent (Claude Code, Claude Desktop, Cursor,\n…) **operate the whole [smplkit](https://smplkit.com) platform** on your behalf,\nwithout you ever leaving the chat.\n\nOne server, the whole platform:\n\n- **Flags** — feature flags with per-environment values and targeting.\n- **Config** — keyed, typed config with per-environment overrides.\n- **Logging** — change runtime log levels per environment.\n- **Audit** — search the audit log and wire SIEM forwarders.\n- **Jobs** — scheduled HTTP jobs (cron, one-off, or on-demand) with response capture.\n\nOnce connected, tell your agent *\"turn on the new checkout for enterprise users in\nprod,\"* *\"set the staging database host,\"* *\"raise the SQL logger to DEBUG in\nprod,\"* *\"stream audit events to Datadog,\"* or *\"POST my endpoint every morning at\n7.\"* It makes the change, proves it works, and answers follow-up questions\nstraight from the live state.\n\nIt is a thin, **stateless** HTTP client to the smplkit product APIs — it holds no\ncredential of its own.\n\n## Connect once\n\n### 1. Add the server and sign in\n\nThe server lives at **`https://mcp.smplkit.com/api/mcp`**. Point your MCP client\nat that URL — the first time it connects, the client opens your browser for a\n**one-time sign-in** (**Continue with Google or Microsoft**, standard OAuth).\nAfter that it reconnects and refreshes access on its own; there's no key to mint,\ncopy, or rotate.\n\n**Claude Code** (CLI):\n\n```bash\nclaude mcp add --transport http smplkit https://mcp.smplkit.com/api/mcp\n```\n\n…or in `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"smplkit\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.smplkit.com/api/mcp\"\n    }\n  }\n}\n```\n\n**Cursor** (`~/.cursor/mcp.json` or project `.cursor/mcp.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"smplkit\": {\n      \"url\": \"https://mcp.smplkit.com/api/mcp\"\n    }\n  }\n}\n```\n\n**Claude Desktop** (`claude_desktop_config.json`) — Desktop bridges remote\nservers through `mcp-remote`, which opens a browser for the one-time sign-in and\ncaches the connection:\n\n```json\n{\n  \"mcpServers\": {\n    \"smplkit\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"https://mcp.smplkit.com/api/mcp\"]\n    }\n  }\n}\n```\n\n#### Prefer a static key?\n\nFor non-interactive use — CI, scripts, headless clients, or writing code with the\n[smplkit SDKs](https://docs.smplkit.com/products/sdks/python) — skip the browser\nand authenticate with an API key as a bearer token. Sign up at\n**https://smplkit.com** (Google or Microsoft SSO, email-verified instantly),\ncreate an **API key** in the console, and send it as\n`Authorization: Bearer YOUR_SMPLKIT_API_KEY` (a custom `X-Smplkit-Api-Key` header\nis also accepted). The SDKs read the same key from `SMPLKIT_API_KEY`. For example,\nadd a `headers` block to the config above:\n\n```json\n{\n  \"mcpServers\": {\n    \"smplkit\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.smplkit.com/api/mcp\",\n      \"headers\": { \"Authorization\": \"Bearer ${SMPLKIT_API_KEY}\" }\n    }\n  }\n}\n```\n\n### 2. Ask your agent\n\n> \"Create a boolean flag `new-checkout`, off by default, then turn it on in prod\n> only for enterprise users.\"\n\n> \"List my environments, then set `database.host` to `db-staging.internal` for\n> staging.\"\n\n> \"Raise the `sqlalchemy.engine` logger to DEBUG in production while I debug,\n> then reset it.\"\n\n> \"Test whether `https://http-intake.logs.datadoghq.com/...` accepts a sample,\n> then create a Datadog forwarder for our audit events.\"\n\n> \"POST `https://api.example.com/cache/warm` every morning at 7am NY time, then\n> run it now to prove it works.\"\n\n## Tools\n\nAll tools share intent-named verbs — `list_*`, `get_*`, `create_*`, `set_*`,\n`delete_*` — and hide the JSON:API envelopes, per-environment nesting, and\nfull-replace PUTs behind partial-intent calls.\n\n| Capability | Tools |\n|---|---|\n| **Flags** | `create_flag`, `list_flags`, `get_flag`, `set_flag`, `delete_flag` |\n| **Config** | `create_config`, `list_configs`, `get_config`, `set_config_value`, `delete_config` |\n| **Logging** | `set_log_level`, `list_loggers`, `get_logger`, `reset_logger` |\n| **Audit** | `query_events`, `get_event`, `list_forwarders`, `create_forwarder`, `test_forwarder`, `delete_forwarder` |\n| **Jobs** | `create_job`, `list_jobs`, `get_job`, `update_job`, `delete_job`, `run_job`, `list_runs`, `get_run` |\n| **Platform** | `list_environments` |\n\nA few load-bearing behaviors:\n\n- **`set_flag` / `set_config_value` / `set_log_level` are read-modify-write.** You\n  express a partial change in one environment and the tool preserves the rest.\n- **`list_environments`** tells you the valid environment targets (`production`,\n  `staging`, …) for every `set_*` tool and for jobs.\n- **Prove before you trust.** `run_job` fires a job once and returns the captured\n  response; `test_forwarder` dry-runs a SIEM destination before you save it.\n- **`create_job` infers the kind:** a cron `schedule` → recurring, a `run_at`\n  datetime → one-off, neither → manual. You never set a kind.\n\nThe bundled [SKILL.md](SKILL.md) teaches an agent the whole surface.\n\n## The public-internet constraint\n\nsmplkit calls **job targets** and **forwarder destinations** from the cloud, so\nthose URLs must be reachable from the public internet — `localhost`/private\naddresses won't fire. To target a local server, point at its deployed URL or\nexpose it with a tunnel (`cloudflared tunnel --url http://localhost:PORT` or\n`ngrok http PORT`) and set a secret auth header.\n\n## Development\n\n```bash\npython3.13 -m venv .venv && . .venv/bin/activate\npip install -r requirements-test.txt\npytest                                          # unit tests (acceptance deselected)\nruff check src tests\n```\n\nRun the server locally:\n\n```bash\nPYTHONPATH=src uvicorn smplkit_mcp.app:app --host 0.0.0.0 --port 8000\n# MCP endpoint:  http://localhost:8000/api/mcp\n# Health check:  http://localhost:8000/health\n```\n\nConfiguration (env vars) — each product's base host is independently\nconfigurable, mirroring the SDK's `base_domain` pattern:\n\n- `JOBS_BASE_DOMAIN` / `FLAGS_BASE_DOMAIN` / `CONFIG_BASE_DOMAIN` /\n  `LOGGING_BASE_DOMAIN` / `AUDIT_BASE_DOMAIN` / `APP_BASE_DOMAIN` — the host for\n  each product API (defaults `<product>.smplkit.com`; `APP_*` backs\n  `list_environments`).\n- `*_SCHEME` — `https` (default) or `http`.\n- `*_BASE_URL` — full base-URL override (e.g. `http://localhost:8002`); wins over\n  the two above. Used for the local platform and tests.\n\n### Acceptance tests\n\n`tests/test_acceptance.py` provisions an ephemeral verified account and drives\nthe full tool surface against the real product APIs end-to-end — create/set/get/\ndelete a flag, set and read a config value, set and list a log level, query\nevents, create/test/delete a forwarder, list environments, and the eight Jobs\ntools — then cleans up. These tests require smplkit-internal **admin**\ncredentials, so they self-skip unless an admin key is available (`ADMIN_API_KEY`\nenv or the `[admin]` profile in `~/.smplkit`) — external contributors can ignore\nthem; the unit suite needs no credentials. Run them explicitly:\n\n```bash\npytest -m acceptance\n# point at a non-prod platform with <PRODUCT>_BASE_URL=...\n```\n\n## Architecture\n\n- **Stateless** Python service built on [FastMCP](https://gofastmcp.com): it holds\n  no database and no platform credential of its own.\n- Auth is **per request** — whether the caller signs in with OAuth or sends an API\n  key, the credential is validated and used per request to reach each product API,\n  and is never cached or logged.\n- One thin JSON:API HTTP client per product (flags, config, logging, audit,\n  environments), each pointed at its own configurable base host.\n- The MCP endpoint is served under `/api/mcp` with a stateless, JSON-response\n  transport (no long-lived SSE), so it behaves correctly through proxies and load\n  balancers with short idle timeouts.\n\n## License\n\n[MIT](LICENSE).\n",
  "bytes": 8121,
  "sha": "1d0ff6e2a3259819f61255e4c16b4db99f7ce295260f9319e50e1f9c5520a7b2",
  "repo_slug": "smplkit/mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_smplkit_mcp_673937cd/readme"
}