← Projects
MIT · Open source

mcp-harness-fme

Manage Harness FME (Split.io) feature flags & segments from any MCP client — list, toggle, kill

Features

  • 30 tools — covers workspaces, environments, feature flags, flag definitions, segments, rule-based segments, and change requests.
  • Kill & restore — instantly kill a flag to force all traffic to the default treatment, or restore it with a single tool call.
  • Safety guard — every destructive operation (delete, kill, archive, disable) requires confirm: true, preventing accidental changes.
  • Rule-based segments — create, update, enable, disable, and submit change requests for rule-based segments per environment.
  • Change request flow — submit segment definition changes with optional approvers for teams that require approval gates.
  • Zero-config startup — reads MCP_HARNESS_FME_API_KEY from the environment and exits immediately if it is missing.

Install

Add to your MCP client config (see Usage below), or install globally to run manually:

npx --yes @kud/mcp-harness-fme@latest

Set the environment variable MCP_HARNESS_FME_API_KEY to your Harness FME API key before starting the server.

Usage

This is a standard stdio MCP server — it works with any MCP client (Claude Desktop, Claude Code, Cursor, Windsurf, Cline, Zed, …). Add it to your client's MCP config:

{
  "mcpServers": {
    "harness-fme": {
      "command": "npx",
      "args": ["--yes", "@kud/mcp-harness-fme@latest"],
      "env": {
        "MCP_HARNESS_FME_API_KEY": "your_api_key"
      }
    }
  }
}

Most clients read this mcpServers shape — Claude Desktop's config file, Cursor's .cursor/mcp.json, Windsurf, Cline, and so on. For Claude Code, there's a CLI shortcut:

claude mcp add --transport stdio --scope user harness-fme \
  --env MCP_HARNESS_FME_API_KEY=your_api_key \
  -- npx --yes @kud/mcp-harness-fme@latest

To enable the get_flag_url deep-link tool, also set two optional keys — add them to the env block above (or as extra --env flags for the CLI). See Configuration for where to find their values.

"env": {
  "MCP_HARNESS_FME_API_KEY": "your_api_key",
  "MCP_HARNESS_FME_ACCOUNT_ID": "your_account_id",
  "MCP_HARNESS_FME_ORG_GUID": "your_org_guid"
}

Leave them out and every other tool still works — get_flag_url just reports what's missing.

Available tools

ToolDescription
list_workspacesList all FME workspaces in the account
list_environmentsList all environments in a workspace
list_traffic_typesList all traffic types in a workspace
list_rollout_statusesList rollout status definitions for a workspace
list_feature_flagsList feature flags in a workspace (filter by tag, status, name)
get_feature_flagGet metadata for a specific feature flag
create_feature_flagCreate a new feature flag for a given traffic type
update_feature_flagUpdate a flag's description, tags, owners, or rollout status
delete_feature_flagPermanently delete a feature flag (confirm: true required)
archive_feature_flagArchive a flag, removing it from active use (confirm: true required)
unarchive_feature_flagRestore a previously archived feature flag
kill_feature_flagKill a flag in an environment — forces default treatment (confirm: true required)
restore_feature_flagRestore a killed feature flag in an environment
list_flag_definitionsList flag targeting rules in an environment
get_flag_definitionGet treatments and targeting rules for a flag in an environment
create_flag_definitionActivate a flag in an environment with treatments and targeting rules — pass title/comment when requiresTitleAndComments: true
update_flag_definitionFully replace a flag's targeting rules in an environment — pass title/comment when requiresTitleAndComments: true
delete_flag_definitionRemove a flag's targeting rules from an environment (confirm: true required)
add_segment_to_treatmentAdd a segment to a flag treatment via safe read-modify-write (idempotent; avoids full-replace) — pass title/comment when requiresTitleAndComments: true
get_flag_urlBuild a Harness FME web-UI deep-link for a flag — pass workspace/flag/environment by name or id (needs two MCP_HARNESS_FME_* env vars, see Configuration)
list_segmentsList all segments in a workspace (API caps page size at 20)
list_rule_based_segmentsList all rule-based segments in a workspace
get_rule_based_segmentGet a rule-based segment's workspace-level metadata
create_rule_based_segmentCreate a new rule-based segment in a workspace
delete_rule_based_segmentPermanently delete a rule-based segment (confirm: true required)
list_rule_based_segment_definitionsList rule-based segment definitions in an environment
update_rule_based_segment_definitionUpdate a rule-based segment's rules in an environment
enable_rule_based_segment_definitionActivate a rule-based segment in an environment
disable_rule_based_segment_definitionRemove a rule-based segment from an environment (confirm: true required)
create_rule_based_segment_change_requestSubmit a change request for a segment definition with optional approval flow

Configuration

The server reads these environment variables:

VariableRequired?Used by
MCP_HARNESS_FME_API_KEYRequiredEvery tool — server exits at startup if absent
MCP_HARNESS_FME_ACCOUNT_IDOptionalget_flag_url only
MCP_HARNESS_FME_ORG_GUIDOptionalget_flag_url only

The account ID and org GUID are Harness platform identifiers that the API does not expose, so get_flag_url reads them from env. Grab them once from any flag's URL in the Harness FME web UI:

https://app.harness.io/ng/account/<ACCOUNT_ID>/all/fme/orgs/<ORG_SLUG>/projects/<PROJECT>/org/<ORG_GUID>/ws/<WORKSPACE_ID>/splits/<FLAG_ID>/env/<ENV_ID>/definition
URL segmentWhere it goes
/account/<ACCOUNT_ID>MCP_HARNESS_FME_ACCOUNT_ID env var
/org/<ORG_GUID> (singular)MCP_HARNESS_FME_ORG_GUID env var
/orgs/<ORG_SLUG> (plural)Resolved by get_flag_url from the workspace — not an env var
/ws/… · /splits/… · /env/…Resolved by get_flag_url from the workspace / flag / environment you pass (by name or id)

⚠ The URL has two org-ish segments: /orgs/ (plural) is the human slug; /org/ (singular) is the GUID you want for MCP_HARNESS_FME_ORG_GUID. Grab the singular one.

With those two set, get_flag_url needs only a workspace, flag, and environment (name or id) — it resolves everything else. Without them, it returns a message telling you what to set, and every other tool works normally.

Development

git clone https://github.com/kud/mcp-harness-fme.git
cd mcp-harness-fme
npm install
npm run dev           # run from source with tsx
npm run inspect:dev   # MCP Inspector at http://localhost:5173
npm test              # vitest
npm run build         # compile to dist/

Environment variables are documented in Configuration above. All tools are defined in src/index.ts.