Skip to main content
Glama

mcp-refactoring

An MCP (Model Context Protocol) server that exposes Martin Fowler's refactoring catalog to LLMs through a pluggable, language-agnostic architecture.

Features

  • 71+ Refactorings: Full implementation of Martin Fowler's refactoring catalog

  • Pluggable Architecture: Support for multiple languages (Python first, Ruby/Java/Go planned)

  • Safe by Default: Preview mode shows changes before applying

  • LLM-Optimized: TOON output format for token efficiency

Related MCP server: Code Search MCP

Installation

# Using uvx (recommended)
uvx mcp-refactoring

# Using pip
pip install mcp-refactoring

# Using pipx
pipx install mcp-refactoring

Requirements

  • Python 3.10+

  • A language backend (e.g., molting-cli for Python)

Install the Python backend:

pip install molting-cli

Claude Desktop Configuration

Add to your Claude Desktop config:

{
  "mcpServers": {
    "refactoring": {
      "command": "uvx",
      "args": ["mcp-refactoring"]
    }
  }
}

Available Tools

list_refactorings

List available refactorings with their parameter contracts.

list_refactorings(language="python", category="composing_methods")

preview_refactoring

Preview what changes a refactoring would make (dry-run).

preview_refactoring(
    refactoring="extract-method",
    target="src/order.py::Order::calculate#L10-L15",
    params={"name": "calculate_tax"}
)

apply_refactoring

Apply a refactoring to the codebase.

apply_refactoring(
    refactoring="rename-method",
    target="src/order.py::Order::calc",
    params={"new_name": "calculate_total"}
)

inspect_structure

Get structural information about code.

inspect_structure(path="src/order.py", depth="method")

analyze_code

Analyze code for smells and suggest refactorings.

analyze_code(path="src/order.py", smells=["long-method"])

Target Specification

Each language uses its native conventions:

Python

src/order.py::Order::calculate_total        # Method
src/order.py::Order::calculate_total#L10-L15  # Line range
src/order.py::Order                         # Class

Configuration

Create ~/.mcp-refactoring/config.toml:

[backends.python]
enabled = true
command = "molting"

[backends.ruby]
enabled = false
command = "molting-rb"

Environment variable overrides:

MCP_REFACTORING_PYTHON_COMMAND=/path/to/molting
MCP_REFACTORING_PYTHON_ENABLED=true

Refactoring Categories

Based on Martin Fowler's catalog:

  • Composing Methods: extract-method, inline-method, etc.

  • Moving Features: move-method, extract-class, etc.

  • Organizing Data: encapsulate-field, replace-type-code, etc.

  • Simplifying Conditionals: decompose-conditional, guard-clauses, etc.

  • Simplifying Method Calls: rename-method, add-parameter, etc.

  • Dealing with Generalization: pull-up-method, extract-interface, etc.

Development

# Clone the repository
git clone https://github.com/marshally/mcp-refactoring.git
cd mcp-refactoring

# Install in development mode
pip install -e ".[dev]"

# Run tests
pytest

# Run linter
ruff check .

# Run type checker
mypy src/

License

MIT License - see LICENSE for details.

Available Tools

5 tools
analyze_codeA
Read-onlyIdempotent

Analyze code for smells and suggest refactorings.

Detects code smells like long methods, large classes, feature envy, and suggests appropriate refactorings to address them.

Note: This feature requires backend support. Returns backend_supported: false for backends that don't implement analysis yet.

Args: path: File or directory path to analyze smells: Optional list of smell types to check for (e.g., ['long-method', 'large-class', 'feature-envy'])

Returns: TOON-formatted string with analysis results.

Supported smell types (when backend supports analysis): - long-method: Method exceeds line threshold - large-class: Class has too many responsibilities - feature-envy: Method uses another class's data excessively - data-clumps: Same data items appear together repeatedly - primitive-obsession: Overuse of primitives instead of objects - duplicate-code: Similar code in multiple locations

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
smellsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds that it returns a TOON-formatted string and requires backend support, which is useful beyond annotations.

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?

Concise at ~250 characters, well-structured with clear sections (purpose, args, returns, supported types), no wasted words.

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

Completeness5/5

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

Given the simple tool with two parameters and an output schema, the description covers purpose, parameters, backend dependency, return format, and allowed values completely.

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

Parameters5/5

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

Schema has 0% description coverage, but the description fully explains both parameters (path, smells), provides examples, and lists all supported smell types.

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

Purpose5/5

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

The description clearly states the tool analyzes code for smells and suggests refactorings, listing specific smells. It distinguishes from sibling tools like apply_refactoring and preview_refactoring, which apply changes.

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

Usage Guidelines4/5

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

It mentions backend support requirement and provides optional smell filtering, but does not explicitly state when to use this tool over alternatives like inspect_structure.

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

apply_refactoringA

Apply a refactoring to the codebase.

This actually modifies files. Use preview_refactoring first to see what changes will be made. Changes can be reverted with git.

Args: refactoring: Name of the refactoring (e.g., 'extract-method') target: Target in language-native format (e.g., 'src/order.py::Order::calculate#L10-L15') params: Refactoring-specific parameters

Returns: TOON-formatted string with results of the applied refactoring.

Example: apply_refactoring( refactoring="rename-method", target="src/order.py::Order::calc_total", params={"new_name": "calculate_total"} )

ParametersJSON Schema
NameRequiredDescriptionDefault
refactoringYes
targetYes
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false. The description adds that it 'actually modifies files' and that changes are revertible, clarifying the mutation behavior without contradiction.

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?

The description is concise with a clear structure: purpose, usage hint, parameter docs, return info, and a practical example. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the complexity and presence of an output schema, the description covers all essential aspects: what the tool does, when to use it, parameter details, and return format. It is self-contained and sufficient for correct invocations.

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?

With 0% schema description coverage, the description provides meaningful examples and purpose for each parameter (e.g., 'Name of the refactoring (e.g., extract-method)' and target format). This compensates well for the schema's lack of documentation.

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

Purpose5/5

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

The description clearly states it applies a refactoring that modifies files, distinguishing it from 'preview_refactoring' which is for previewing. The verb 'Apply' and resource 'refactoring' are specific and unambiguous.

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

Usage Guidelines4/5

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

The description recommends using 'preview_refactoring first' and notes that changes can be reverted with git, providing clear context. It lacks explicit when-not-to-use scenarios but offers actionable guidance.

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

inspect_structureA
Read-onlyIdempotent

Get structural information about code (classes, methods, line numbers).

Inspects a file to return information about its structure. Use this to understand the code before applying refactorings.

Args: path: File path to inspect (e.g., 'src/order.py') depth: Level of detail - 'file', 'class', or 'method' (default: 'class')

Returns: TOON-formatted string with structural information.

Example: inspect_structure(path="src/order.py", depth="method")

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
depthNoclass

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark it as readOnly and idempotent; description adds that it returns a TOON-formatted string and explains behavior beyond annotations. No contradictions.

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?

Front-loaded with bold summary, followed by clear Args/Returns/Example sections. Every sentence is useful; no unnecessary text.

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

Completeness5/5

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

Given strong annotations and presence of output schema, the description is complete enough for correct agent invocation, covering purpose, parameters, and usage guidance.

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

Parameters5/5

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

With 0% schema description coverage, the description fully explains both parameters: path (example given) and depth (valid values and default), adding essential meaning.

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

Purpose5/5

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

The description clearly states it gets structural information about code (classes, methods, line numbers), distinguishing it from sibling tools like apply_refactoring or preview_refactoring.

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

Usage Guidelines4/5

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

Explicitly says 'Use this to understand the code before applying refactorings', providing clear when-to-use context, though not explicitly stating when not to use.

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

list_refactoringsA
Read-onlyIdempotent

List available refactorings with their parameter contracts.

Returns the catalog of available refactorings from all enabled backends, optionally filtered by language and/or category.

Args: language: Filter by language (e.g., 'python'). If not specified, returns all. category: Filter by Fowler category (e.g., 'composing_methods')

Returns: TOON-formatted string containing refactoring specifications.

Categories: - composing_methods: Extract/inline methods, variables - moving_features: Move methods/fields between classes - organizing_data: Encapsulation, type codes - simplifying_conditionals: Guard clauses, polymorphism - simplifying_method_calls: Rename, add/remove parameters - dealing_with_generalization: Pull up/push down, inheritance

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo
categoryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark the tool as readOnlyHint=true and idempotent. The description adds that it returns a TOON-formatted string and lists categories, providing beyond-annotation context. No contradictions.

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?

The description is well-structured with a clear purpose sentence followed by Args, Returns, and Categories sections. Every sentence adds value, and it is appropriately sized for the information conveyed.

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

Completeness5/5

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

With an output schema present, the description adequately covers the return format (TOON string) and filtering details. Given the tool's simplicity and existing annotations, it is fully complete.

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

Parameters5/5

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

Schema coverage is 0% with no descriptions in the schema. The description compensates fully by explaining each parameter's purpose, expected values, and defaults, and listing valid category values.

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

Purpose5/5

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

The description starts with 'List available refactorings with their parameter contracts,' clearly stating the tool's action (list) and resource (refactorings). It includes optional filters and categories, distinguishing it from siblings like apply_refactoring or preview_refactoring.

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

Usage Guidelines4/5

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

The description explains optional filters (language, category) and provides a list of valid categories, guiding when to use this tool for exploration. It does not explicitly state when not to use or compare to siblings, but the context is clear.

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

preview_refactoringA
Read-onlyIdempotent

Preview what changes a refactoring would make without applying them.

This is a dry-run mode that shows the diff of what would change, without actually modifying any files. Always preview before applying.

Args: refactoring: Name of the refactoring (e.g., 'extract-method') target: Target in language-native format (e.g., 'src/order.py::Order::calculate#L10-L15') params: Refactoring-specific parameters (e.g., {'name': 'calculate_tax'})

Returns: TOON-formatted string with preview results including diff.

Example: preview_refactoring( refactoring="extract-method", target="src/order.py::Order::calculate#L10-L15", params={"name": "calculate_tax"} )

ParametersJSON Schema
NameRequiredDescriptionDefault
refactoringYes
targetYes
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds that it is a dry-run showing diff without modifying files, and specifies the return format (TOON-formatted string). This provides behavioral context beyond annotations.

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?

The description is succinct, front-loaded with a clear purpose, and uses structured sections (Args, Returns, Example). Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the tool's complexity (3 params, output schema), the description provides complete context: purpose, dry-run behavior, parameter formats, return type, and an example. The output schema exists but description still summarizes return type sufficiently.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining each parameter with examples (refactoring, target, params) and showing a full example call. This adds critical meaning beyond the bare schema.

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

Purpose5/5

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

The description clearly states the tool's verb (preview), resource (refactoring changes), and mode (without applying). It distinguishes itself from sibling tools like 'apply_refactoring' by highlighting the dry-run nature.

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

Usage Guidelines4/5

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

The description explicitly advises 'Always preview before applying,' which implies when to use it. It also clarifies it does not modify files, contrasting with the sibling 'apply_refactoring'. No explicit when-not-to-use, but context is clear.

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

TDQS

A4.7/5.0
Disambiguation5/5

Each tool serves a distinct purpose: analyzing code smells, inspecting structure, listing available refactorings, previewing changes, and applying refactorings. No overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with underscores (e.g., analyze_code, preview_refactoring). No mixing of conventions.

Tool Count5/5

Five tools is well-scoped for a refactoring server, covering analysis, inspection, listing, preview, and application without unnecessary tools.

Completeness4/5

The toolset covers the main refactoring workflow: analysis, preview, and application. Missing a dedicated undo tool, but git revert is suggested. Minor gap but acceptable.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to understand and navigate codebases through structural analysis. Provides code mapping, symbol search, and impact analysis using ast-grep for accurate parsing of Python, JavaScript, TypeScript, and Go projects.
    4
    52
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to perform high-performance code search and analysis across multiple languages using symbol indexing, regex text search, and structural AST pattern matching. It also provides tools for technology stack detection and dependency analysis with persistent caching for optimized performance.
    7
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides LLM-optimized tools for advanced code analysis, repository complexity evaluation, and call graph generation. It enables users to visualize directory structures, detect code patterns, and build semantic context with significant token savings.
    18
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables LLMs to efficiently read, write, and refactor code using precise AST-based operations, reducing token usage and context window waste.
    25
    33
    3
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/marshally/mcp-refactoring'

If you have feedback or need assistance with the MCP directory API, please join our Discord server