Skip to main content
Glama

SSW Rules MCP

Unofficial community-built CLI tools and MCP server for searching SSW Rules with semantic search.

SSW Rules is a collection of 3,700+ best-practice rules covering software engineering, project delivery, communication, and more.

What it does

  • MCP Server — Exposes SSW Rules to AI agents (Claude Code, VS Code Copilot, Codex, LM Studio) via the Model Context Protocol

  • Semantic Search — Find rules by meaning, not just keywords (e.g. "how to handle technical debt" finds "Do you know the importance of paying back Technical Debt?")

  • CLI Tools — Search, browse, and read SSW Rules from the terminal

  • Auto-sync — Automatically clones and updates SSW.Rules.Content from GitHub

Related MCP server: Axon.MCP.Server

Prerequisites

  • Python 3.12+

  • uv (recommended) or pip

  • Docker for Qdrant vector search

Quick Start

1. Install

git clone https://github.com/jernejk/SSW.Rules.Mcp.git
cd SSW.Rules.Mcp
uv tool install .

This makes the ssw-rules command available system-wide.

To update after pulling new changes:

cd SSW.Rules.Mcp
git pull
uv tool install --force --reinstall .

To uninstall:

uv tool uninstall ssw-rules-mcp
git clone https://github.com/jernejk/SSW.Rules.Mcp.git
cd SSW.Rules.Mcp
uv sync

Then prefix all commands with uv run:

uv run ssw-rules index
uv run ssw-rules search "definition of done"

2. Start Qdrant

docker run -d -p 6333:6333 qdrant/qdrant

3. Build the search index

ssw-rules index

This will:

  1. Clone SSW.Rules.Content (shallow clone, ~1 min)

  2. Parse all ~3,700 rules from MDX files

  3. Generate embeddings with all-MiniLM-L6-v2 (downloads 90MB model on first run)

  4. Store vectors in Qdrant (~6MB, takes ~2 min)

On subsequent runs, it does git pull to get the latest rules before re-indexing.

ssw-rules search "definition of done"

CLI Reference

Command

Description

ssw-rules index

Clone/pull rules and build Qdrant search index

ssw-rules index --skip-git

Rebuild index without git pull

ssw-rules search QUERY

Semantic search across all rules

ssw-rules get URI

Get the full content of a specific rule

ssw-rules categories

List all categories and subcategories

ssw-rules category URI

List rules in a specific category

ssw-rules recent

Show recently updated rules

ssw-rules source [PATH]

Configure local SSW.Rules.Content path

ssw-rules config

Show current configuration

ssw-rules config --reset

Reset all settings to defaults

ssw-rules mcp

Start the MCP server (stdio)

ssw-rules search "pull request best practices"
ssw-rules search "technical debt" --limit 5
ssw-rules search "email etiquette" --json
ssw-rules search "scrum ceremonies" --include-archived

Get a specific rule

ssw-rules get 3-steps-to-a-pbi
ssw-rules get definition-of-done --json

Browse categories

ssw-rules categories
ssw-rules category rules-to-better-scrum-using-azure-devops

Recently updated rules

ssw-rules recent              # Last 30 days
ssw-rules recent --days 7     # Last week
ssw-rules recent --json       # JSON output

JSON Output

Add --json to any command for machine-readable output:

ssw-rules search "testing" --json
ssw-rules get definition-of-done --json
ssw-rules categories --json

Source Configuration

By default, ssw-rules index clones SSW.Rules.Content into ~/.config/ssw-rules-mcp/data/. To use an existing local clone instead:

ssw-rules source ~/Developer/SSW.Rules.Content

To use a fork:

ssw-rules source --repo https://github.com/my-fork/SSW.Rules.Content.git

MCP Server

The MCP server exposes SSW Rules to AI agents via stdio transport.

Tools

Tool

Description

search_rules(query, limit)

Semantic search across all SSW Rules

get_rule(uri)

Get full content of a rule by its URI slug

list_categories()

Browse the category hierarchy

get_category_rules(category_uri)

Get all rules in a category

get_recent_rules(days, limit)

Get recently updated rules

Claude Code

Add to your Claude Code MCP settings (~/.claude/settings.json):

{
  "mcpServers": {
    "ssw-rules": {
      "command": "ssw-rules",
      "args": ["mcp"]
    }
  }
}

Note: This requires the global install (uv tool install .). If using uv run instead, use "command": "uv", "args": ["run", "--directory", "/path/to/SSW.Rules.Mcp", "ssw-rules", "mcp"].

Then ask Claude things like:

  • "Search SSW Rules for definition of done"

  • "What are the SSW rules about pull requests?"

  • "Get the SSW rule about technical debt"

  • "What SSW Rules categories exist?"

VS Code (Copilot / Continue)

Add to your VS Code settings (.vscode/settings.json or user settings):

{
  "mcp": {
    "servers": {
      "ssw-rules": {
        "command": "ssw-rules",
        "args": ["mcp"]
      }
    }
  }
}

Codex (OpenAI CLI)

{
  "mcpServers": {
    "ssw-rules": {
      "command": "ssw-rules",
      "args": ["mcp"]
    }
  }
}

LM Studio

Configure a new MCP server:

  • Name: SSW Rules

  • Command: ssw-rules

  • Arguments: mcp

  • Transport: stdio

Using with SugarLearning MCP

SSW Rules MCP is designed to work alongside SugarLearning MCP for comprehensive SSW process guidance:

  • SSW Rules — Public best-practice rules (this tool)

  • SugarLearning — Internal training modules and learning paths

Configure both in Claude Code:

{
  "mcpServers": {
    "ssw-rules": {
      "command": "ssw-rules",
      "args": ["mcp"]
    },
    "sugarlearning": {
      "command": "sl",
      "args": ["mcp"]
    }
  }
}

Then ask Claude to combine knowledge from both sources:

  • "What SSW rules apply to the Spec Reviews training module?"

  • "Create onboarding instructions using SSW Rules and SugarLearning modules"

How Search Works

SSW Rules MCP uses a semantic search approach powered by:

  1. sentence-transformers with the all-MiniLM-L6-v2 model (384-dimensional embeddings, runs locally, no API key needed)

  2. Qdrant vector database for fast similarity search

  3. Text search fallback when Qdrant is unavailable

Each rule is indexed with its title, SEO description, and a preview of its content. Search queries are embedded with the same model and compared using cosine similarity.

With 3,700+ rules, the Qdrant collection uses ~6MB of storage. Indexing takes about 2 minutes.

Project Structure

SSW.Rules.Mcp/
├── src/ssw_rules_mcp/
│   ├── cli.py              # Click CLI entry point
│   ├── config.py           # Pydantic settings (.env)
│   ├── models.py           # Pydantic models (Rule, Category)
│   ├── parser.py           # MDX frontmatter parsing + JSX stripping
│   ├── qdrant_index.py     # Qdrant vector indexing + search
│   ├── categories.py       # Category hierarchy parser
│   └── mcp_server.py       # FastMCP server
├── tests/                  # pytest test suite
├── .env.example            # Configuration template
└── pyproject.toml          # Project definition

Configuration

All settings use the SSW_RULES_ prefix and can be set via environment variables or ~/.config/ssw-rules-mcp/.env:

Variable

Default

Description

SSW_RULES_CONTENT_PATH

~/.config/ssw-rules-mcp/data/SSW.Rules.Content

Path to SSW.Rules.Content repo

SSW_RULES_REPO_URL

https://github.com/SSWConsulting/SSW.Rules.Content.git

Git repo URL for auto-clone

SSW_RULES_QDRANT_URL

http://localhost:6333

Qdrant server URL

SSW_RULES_QDRANT_COLLECTION

ssw-rules

Qdrant collection name

Running Tests

uv run --extra dev pytest

License

MIT

Available Tools

5 tools
get_category_rulesGet Category RulesA

Get all rules in a specific category.

Works for both top-level categories (returns all rules across subcategories) and subcategories (returns just that subcategory's rules).

ParametersJSON Schema
NameRequiredDescriptionDefault
category_uriYesThe category URI slug (e.g. 'software-engineering', 'rules-to-better-scrum-using-azure-devops').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses that top-level categories return rules across subcategories while subcategories return only their own rules, which is real behavioral context. However, it omits read-only confirmation, pagination behavior, and result limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, purpose front-loaded, no wasted words. The scope nuance is stated immediately after the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the description resolves the main ambiguity (category-level scoping). For a single-parameter read tool with full schema coverage, this is essentially complete, though it could note read-only nature or result size.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the category_uri slug and examples already documented. The description adds no additional parameter meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get all rules in a specific category') and the scope distinction between top-level and subcategory is clear. It does not explicitly differentiate itself from the singular sibling get_rule or search_rules, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when the tool behaves a certain way (by category level) but never states when to choose this over get_rule, search_rules, or get_recent_rules. Usage is left to inference from the sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_rulesGet Recent RulesC

Get recently updated SSW Rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days to look back (default 30).
limitNoMaximum results (default 20).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It says nothing about sort order, whether results are newest-first, whether 'updated' versus 'created' matters, or any pagination behavior beyond the raw defaults. For a list tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no waste and the core concept front-loaded. It is efficient, though arguably under-specified rather than optimally concise for a tool with two behavioral parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. The parameters are fully documented in the schema, but the absence of annotations plus the lack of any usage routing or ordering semantics leaves real gaps for an agent deciding between this and its four siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both days and limit fully documented in the schema, so the baseline of 3 applies. The description adds no syntax, unit, or interaction detail (e.g., whether limit truncates the most recent or oldest entries) beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and a well-defined resource (recently updated SSW Rules), which is clearer than a tautology. However, it does nothing to distinguish itself from the sibling search_rules or get_rule — an agent must infer that this is the chronological/browse variant rather than a search or single-fetch tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this instead of search_rules, get_rule, or get_category_rules. 'Recently updated' hints at a recency-browsing use case, but no exclusions or alternative-routing conditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ruleGet RuleA

Get the full content of a specific SSW Rule by its URI slug.

Returns the rule's title, URL, metadata, and full cleaned markdown content. The content has JSX components stripped for clean reading.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesThe rule URI slug (e.g. '3-steps-to-a-pbi', 'definition-of-done').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose a non-obvious behavioral trait: the returned content is cleaned markdown with JSX components stripped, so an agent knows not to expect raw source. It still omits error behavior for an unknown slug and any read-only/auth guarantees, though 'Get' strongly implies a safe read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and key, with no filler. The middle sentence restates return fields that the output schema already defines, which is mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be re-explained, and the description covers purpose, key, and content processing adequately. It could be fully complete by pointing at search_rules as the way to obtain a slug.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already provides example slugs, so the description's 'by its URI slug' adds no syntax or meaning beyond it. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (a specific SSW Rule) plus the exact lookup key (URI slug), which separates it from the list/search siblings at a glance. It never names a sibling outright, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is only an implicit hint that the caller must already know the slug ('by its URI slug'), which suggests search_rules might precede this call, but no when-to-use statement, no exclusions, and no alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesList CategoriesB

List all SSW Rules categories in the hierarchy.

Returns top-level categories (e.g. Software Engineering, Communication) with their subcategories and rule counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the shape of the result (top-level categories, subcategories, rule counts), which signals a read-only listing operation, but it says nothing about ordering, caching, or completeness guarantees — reasonable but not rich for a zero-parameter read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the core action front-loaded and the return shape second. No filler, though the second sentence partially restates what the output schema already conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and there are no parameters to cover. The definition is nearly complete for such a simple tool; the missing piece is any hint of when to prefer it over get_category_rules.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the baseline there is nothing for the description to document. No misleading parameter language is present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all SSW Rules categories in the hierarchy') and clarifies the granularity by explaining it returns top-level categories with subcategories and rule counts. It is clearly distinguishable from get_category_rules in practice, but it never names or contrasts a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given. The description does not mention that this is a discovery/navigation step before calling get_category_rules, nor does it state any conditions or alternatives. Usage is only inferable from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_rulesSearch RulesA

Semantic search across all SSW Rules (https://ssw.com.au/rules).

Returns matching rules with title, URL, description, and relevance score. Requires Qdrant to be running and indexed (run 'ssw-rules index' first). Falls back to text search if Qdrant is unavailable.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 10).
queryYesNatural language search query (e.g. "definition of done", "pull request best practices").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does reasonably well. It discloses return fields (title, URL, description, relevance score), a critical operational dependency (Qdrant must be running and indexed), and fallback behavior to text search. It doesn't mention error handling or what happens if both search methods fail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place. The purpose is front-loaded, followed by return format, prerequisite, and fallback behavior. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values needn't be fully detailed, yet the description still usefully summarizes return fields. It covers prerequisites and fallback behavior, which are critical operational details not covered by schema or annotations. The main omission is guidance on when to prefer this tool over siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (query, limit) are already documented in the schema. The description adds no parameter-level information beyond what the schema provides. Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Semantic search across all SSW Rules'. This distinguishes it from retrieval siblings like get_rule (singular retrieval) and get_recent_rules (time-based filtering). It doesn't explicitly name siblings, but the scope of 'all SSW Rules' is clear enough to differentiate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: use this when you need to search rules by query. The description mentions the Qdrant dependency and fallback behavior, which are operational prerequisites rather than usage guidance. There's no explicit when-to-use or when-not-to-use vs alternatives like get_recent_rules or list_categories.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedget_category_rules
    • First observedget_recent_rules
    • First observedget_rule
    • First observedlist_categories
    • First observedsearch_rules

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct retrieval mode: recent updates, semantic search, full rule content by slug, category hierarchy, and category-filtered rules. There is no overlap that would lead an agent to misselect.

Naming Consistency5/5

All tools follow a clear snake_case verb_noun pattern (get_recent_rules, search_rules, get_rule, list_categories, get_category_rules). Minor verb variation between get and list is standard and predictable.

Tool Count5/5

Five tools form a tight, well-scoped set for a read-only rules knowledge base. No redundant or missing operations are apparent at this scale.

Completeness5/5

The set covers discovery (recent, search, categories) and retrieval (full rule content, category-filtered lists). For a read-only reference, the surface is complete with no dead ends.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server for semantic code search & navigation that helps AI agents work efficiently without burning through costly tokens. Instead of reading entire files, agents can search conceptually and jump directly to the specific functions, classes, and code chunks they need.
    119
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that transforms codebases into intelligent, queryable knowledge bases, enabling AI assistants to perform semantic search, explore architecture, and analyze code relationships.
    167
    -
  • A
    license
    A
    quality
    F
    maintenance
    MCP server for semantic code search that indexes your codebase and allows AI editors to search using natural language queries.
    9
    53 npm
    53
    MIT