MCP server for AI-powered code editing through FastApply integration
Project description
FastApply MCP Server
A streamlined Model Context Protocol server for efficient AI-powered code editing using FastApply. Inspired by opencode-fast-apply's simplicity and partial editing approach.
Overview
FastApply MCP Server provides intelligent code editing through partial file editing, achieving 80-98% token savings compared to full-file approaches. The server uses smart matching to locate and replace code sections automatically, making it ideal for editing large files efficiently.
Key Features
- Partial File Editing: Edit only the sections you need (50-500 lines recommended)
- Smart Matching: Automatic exact and normalized whitespace matching
- XML Safety: Built-in protection against prompt injection
- Token Efficiency: 80-98% token savings vs full-file editing
- Binary Detection: Automatic detection and rejection of binary files
- Atomic Operations: Safe file writes with automatic rollback on failure
- Clear Error Messages: Actionable suggestions for troubleshooting
Installation
Requirements
- Python 3.13 or higher
- FastApply-compatible server (LM Studio, Ollama, or OpenAI-compatible endpoint)
Using uvx (Recommended)
Run directly without installation:
uvx fastapply-mcp
Manual Installation
git clone https://github.com/your-org/fastapply-mcp.git
cd fastapply-mcp
# Using uv
uv sync
source .venv/bin/activate
uv pip install -e .
# Or using pip
pip install -e .
Configuration
Configure the server with just 3 environment variables:
# .env file
FAST_APPLY_URL=http://localhost:1234/v1
FAST_APPLY_MODEL=fastapply-1.5b
FAST_APPLY_API_KEY=optional-api-key
That's it! No complex configuration needed.
MCP Integration
Claude Desktop
Add to your Claude Desktop configuration:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Using uvx (Recommended)
{
"mcpServers": {
"fastapply": {
"command": "uvx",
"args": ["fastapply-mcp"],
"env": {
"FAST_APPLY_URL": "http://localhost:1234/v1",
"FAST_APPLY_MODEL": "fastapply-1.5b"
}
}
}
}
Manual Installation
{
"mcpServers": {
"fastapply": {
"command": "python",
"args": ["/path/to/fastapply-mcp/src/fastapply_mcp/main.py"],
"env": {
"FAST_APPLY_URL": "http://localhost:1234/v1",
"FAST_APPLY_MODEL": "fastapply-1.5b"
}
}
}
}
Other MCP Clients
The server implements the standard MCP protocol and works with any compatible client.
Tool: fast_apply_edit
The server provides a single, focused tool for efficient code editing.
Parameters
- target_filepath (required): Path to the file to edit (relative or absolute)
- original_code (required): The exact section of code to modify (50-500 lines recommended)
- code_edit (required): The changes to apply
How It Works
- Read the file to get current content
- Extract the relevant section (50-500 lines with context)
- Call FastApply API with partial content
- Smart match finds the section in the full file
- Replace the section atomically
- Generate diff for verification
Example Usage
{
"target_filepath": "src/utils.py",
"original_code": "def parse_config(path):\n with open(path) as f:\n return json.load(f)",
"code_edit": "def parse_config(path):\n try:\n with open(path) as f:\n return json.load(f)\n except FileNotFoundError:\n raise ConfigError(f'Config not found: {path}')"
}
Lazy Edit Markers
Use ... existing code ... markers for unchanged sections:
# ... existing code ...
def updated_function():
return "modified"
# ... existing code ...
This tells the AI to skip regenerating unchanged parts, making edits faster.
Token Efficiency
Partial editing provides massive token savings:
| File Size | Full File | Partial (100 lines) | Savings |
|---|---|---|---|
| 100 lines | 2,500 tokens | 500 tokens | 80% |
| 500 lines | 12,500 tokens | 1,000 tokens | 92% |
| 1000 lines | 25,000 tokens | 1,500 tokens | 94% |
| 5000 lines | 125,000 tokens | 2,000 tokens | 98% |
Smart Matching
The tool uses a two-tier matching system:
1. Exact Match (Priority)
Finds exact string match in the file.
2. Normalized Match (Fallback)
Handles CRLF/LF differences automatically:
- Normalizes
\r\n→\n - Normalizes
\r→\n - Matches whitespace-normalized content
3. Uniqueness Check
Ensures the section appears only once in the file to prevent ambiguous replacements.
XML Safety
Built-in protection against prompt injection:
# User code with XML tags
original_code = "<code>malicious</code>"
# Automatically escaped before API call
# "<code>malicious</code>"
# Safely processed and unescaped after
All XML special characters (&, <, >, ", ') are automatically escaped and unescaped.
FastApply Backend Options
LM Studio
- Install LM Studio from https://lmstudio.ai
- Download a FastApply-compatible model
- Start the local server (default: http://localhost:1234)
- Configure
FAST_APPLY_URL=http://localhost:1234/v1
Ollama
# Install Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Pull a FastApply model
ollama pull fastapply-1.5b
# Start the server
ollama serve
Configure FAST_APPLY_URL=http://localhost:11434/v1
OpenAI or Custom Servers
Any OpenAI-compatible API works:
FAST_APPLY_URL=https://api.openai.com/v1
FAST_APPLY_MODEL=gpt-4
FAST_APPLY_API_KEY=sk-...
Security
- Workspace Isolation: All operations confined to current working directory
- Path Validation: Prevents directory traversal attacks
- File Size Limits: 10MB default maximum
- Binary Detection: Rejects binary files automatically
- UTF-8 Validation: Ensures proper file encoding
- Atomic Writes: Safe file operations with rollback
Error Handling
Clear, actionable error messages:
❌ Error: Cannot locate original_code in file (whitespace mismatch detected).
💡 Troubleshooting:
1. Re-read the file to get current content
2. Ensure original_code matches exactly (including whitespace)
3. Provide more context to make the section unique
Troubleshooting
Connection Issues
Verify your FastApply server is running:
curl http://localhost:1234/v1/models
File Not Found
Use the tool only for existing files. For new files, use your MCP client's write tool.
Cannot Locate Section
- Re-read the file to get current content
- Ensure whitespace matches exactly (tabs vs spaces)
- Provide more context to make the section unique
Whitespace Mismatch
The tool handles CRLF/LF differences automatically, but tabs vs spaces must match exactly.
Development
Project Structure
fastapply-mcp/
├── src/
│ └── fastapply_mcp/
│ ├── __init__.py
│ └── main.py # Single-file implementation (~487 lines)
├── .env.example
├── pyproject.toml
└── README.md
Code Quality
# Format code
ruff format .
# Lint code
ruff check .
# Type checking
mypy src/
# Syntax check
python -m py_compile src/fastapply_mcp/main.py
Design Philosophy
This implementation follows these principles:
- Do one thing well - Focus on efficient file editing
- Trust the client - MCP client handles undo, concurrency, etc.
- Optimize for common case - Partial editing is 10x more efficient
- Clear errors - Help users fix problems quickly
- No premature optimization - Remove unused features
Performance
Original Approach (Full File)
- Read: 5000 lines
- Send to API: 125,000 tokens
- Process: ~30 seconds
- Cost: High
Simplified Approach (Partial)
- Read: 5000 lines (send only 100)
- Send to API: 2,000 tokens
- Process: ~3 seconds
- Cost: 98% cheaper
Contributing
Contributions are welcome! Please:
- Fork the repository and create a feature branch
- Write tests for new functionality
- Ensure code meets quality standards
- Submit a pull request with clear description
License
MIT License - see LICENSE file for details.
Acknowledgments
- Inspiration: opencode-fast-apply for the partial editing approach
- MCP Community: For the Model Context Protocol specification
- FastApply: For the efficient code merging models
Support
- GitHub Issues: Report bugs and request features
- Discussions: Ask questions and share ideas
- Documentation: See inline code comments for implementation details
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapply_mcp-1.1.1.tar.gz.
File metadata
- Download URL: fastapply_mcp-1.1.1.tar.gz
- Upload date:
- Size: 35.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0321dd2363d367bf3cd275aeaf5a1c805436f124b7e427eecac317ef9d957299
|
|
| MD5 |
7f18fdd75d5a8670364fd75bdd9df71a
|
|
| BLAKE2b-256 |
8bdd41b8ed4da688971d1ac4ead763cd4054ca6b29588b08ff787624d6831b52
|
Provenance
The following attestation bundles were made for fastapply_mcp-1.1.1.tar.gz:
Publisher:
publish-to-pypi.yml on tickernelz/fastapply-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastapply_mcp-1.1.1.tar.gz -
Subject digest:
0321dd2363d367bf3cd275aeaf5a1c805436f124b7e427eecac317ef9d957299 - Sigstore transparency entry: 804809497
- Sigstore integration time:
-
Permalink:
tickernelz/fastapply-mcp@abe5ef7fafc9d2b6b0425edf342570aac8289cfa -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/tickernelz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@abe5ef7fafc9d2b6b0425edf342570aac8289cfa -
Trigger Event:
push
-
Statement type:
File details
Details for the file fastapply_mcp-1.1.1-py3-none-any.whl.
File metadata
- Download URL: fastapply_mcp-1.1.1-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00fd93ed2056596e93597f6e7f9f872454a226155b6e4a100eb59b9c1a6ae460
|
|
| MD5 |
b8f8b4dfdb1ed9bb2d6693dbd90e2d8c
|
|
| BLAKE2b-256 |
3275377ed56134934799ec7cbf5b86acf588f029f4a8e29e35c7578186fcf8cd
|
Provenance
The following attestation bundles were made for fastapply_mcp-1.1.1-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on tickernelz/fastapply-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastapply_mcp-1.1.1-py3-none-any.whl -
Subject digest:
00fd93ed2056596e93597f6e7f9f872454a226155b6e4a100eb59b9c1a6ae460 - Sigstore transparency entry: 804809519
- Sigstore integration time:
-
Permalink:
tickernelz/fastapply-mcp@abe5ef7fafc9d2b6b0425edf342570aac8289cfa -
Branch / Tag:
refs/tags/v1.1.1 - Owner: https://github.com/tickernelz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@abe5ef7fafc9d2b6b0425edf342570aac8289cfa -
Trigger Event:
push
-
Statement type: