SlimContext MCP Server
# SlimContext MCP Server
A Model Context Protocol (MCP) server that wraps the [SlimContext](https://www.npmjs.com/package/slimcontext) library, providing AI chat history compression tools for MCP-compatible clients.
## Overview
SlimContext MCP Server exposes two powerful compression strategies as MCP tools:
1. **`trim_messages`** - Token-based compression that removes oldest messages when exceeding token thresholds
2. **`summarize_messages`** - AI-powered compression using OpenAI to create concise summaries
## Installation
```bash
npm install -g slimcontext-mcp-server
# or
pnpm add -g slimcontext-mcp-server
```
## Development
```bash
# Clone and setup
git clone <repository>
cd slimcontext-mcp-server
pnpm install
# Build
pnpm build
# Run in development
pnpm dev
# Type checking
pnpm typecheck
```
## Configuration
### MCP Client Setup
Add to your MCP client configuration:
```json
{
"mcpServers": {
"slimcontext": {
"command": "npx",
"args": ["-y", "slimcontext-mcp-server"]
}
}
}
```
### Environment Variables
- `OPENAI_API_KEY`: OpenAI API key for summarization (optional, can be passed as tool parameter)
## Tools
### trim_messages
Compresses chat history using token-based trimming strategy.
**Parameters:**
- `messages` (required): Array of chat messages
- `maxModelTokens` (optional): Maximum model token context window (default: 8192)
- `thresholdPercent` (optional): Percentage threshold to trigger compression 0-1 (default: 0.7)
- `minRecentMessages` (optional): Minimum recent messages to preserve (default: 2)
**Example:**
```json
{
"messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "user", "content": "Hello!" },
{ "role": "assistant", "content": "Hi there! How can I help you today?" },
{ "role": "user", "content": "Tell me about AI." }
],
"maxModelTokens": 4000,
"thresholdPercent": 0.8,
"minRecentMessages": 2
}
```
**Response:**
```json
{
"success": true,
"original_message_count": 4,
"compressed_message_count": 3,
"messages_removed": 1,
"compression_ratio": 0.75,
"compressed_messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "assistant", "content": "Hi there! How can I help you today?" },
{ "role": "user", "content": "Tell me about AI." }
]
}
```
### summarize_messages
Compresses chat history using AI-powered summarization strategy.
**Parameters:**
- `messages` (required): Array of chat messages
- `maxModelTokens` (optional): Maximum model token context window (default: 8192)
- `thresholdPercent` (optional): Percentage threshold to trigger compression 0-1 (default: 0.7)
- `minRecentMessages` (optional): Minimum recent messages to preserve (default: 4)
- `openaiApiKey` (optional): OpenAI API key (can also use OPENAI_API_KEY env var)
- `openaiModel` (optional): OpenAI model for summarization (default: 'gpt-4o-mini')
- `customPrompt` (optional): Custom summarization prompt
**Example:**
```json
{
"messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "user", "content": "I want to build a web scraper." },
{
"role": "assistant",
"content": "I can help you build a web scraper! What programming language would you prefer?"
},
{ "role": "user", "content": "Python please." },
{
"role": "assistant",
"content": "Great choice! For Python web scraping, I recommend using requests and BeautifulSoup..."
},
{ "role": "user", "content": "Can you show me a simple example?" }
],
"maxModelTokens": 4000,
"thresholdPercent": 0.6,
"minRecentMessages": 2,
"openaiModel": "gpt-4o-mini"
}
```
**Response:**
```json
{
"success": true,
"original_message_count": 6,
"compressed_message_count": 4,
"messages_removed": 2,
"summary_generated": true,
"compression_ratio": 0.67,
"compressed_messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{
"role": "system",
"content": "The user expressed interest in building a web scraper and requested help with Python. The assistant recommended using requests and BeautifulSoup libraries for Python web scraping."
},
{
"role": "assistant",
"content": "Great choice! For Python web scraping, I recommend using requests and BeautifulSoup..."
},
{ "role": "user", "content": "Can you show me a simple example?" }
]
}
```
## Message Format
Both tools expect messages in SlimContext format:
```typescript
interface SlimContextMessage {
role: 'system' | 'user' | 'assistant' | 'tool' | 'human';
content: string;
}
```
## Error Handling
All tools return structured error responses:
```json
{
"success": false,
"error": "Error message description",
"error_type": "SlimContextError" | "OpenAIError" | "UnknownError"
}
```
Common error scenarios:
- Missing OpenAI API key for summarization
- Invalid message format
- OpenAI API rate limits or errors
- Invalid parameter values
## Token Estimation
SlimContext uses a simple heuristic for token estimation: `Math.ceil(content.length / 4) + 2`. This provides a reasonable approximation for most use cases. For more accurate token counting, you would need to implement a custom token estimator in your client application.
## Compression Strategies
### Trimming Strategy
- Preserves all system messages
- Preserves the most recent N messages
- Removes oldest non-system messages until under token threshold
- Fast and deterministic
- No external API dependencies
### Summarization Strategy
- Preserves all system messages
- Preserves the most recent N messages
- Summarizes middle portion of conversation using AI
- Creates contextually rich summaries
- Requires OpenAI API access
## License
MIT
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests for new functionality
5. Submit a pull request
## Related
- [SlimContext](https://www.npmjs.com/package/slimcontext) - The underlying compression library
- [Model Context Protocol](https://modelcontextprotocol.io/) - The protocol specification
- [MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk) - TypeScript SDK for MCP
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: summarize_messages uses AI-powered summarization to compress history by creating concise summaries, while trim_messages uses token-based trimming to remove oldest messages when exceeding thresholds. There is no overlap in their approaches, making them easily distinguishable.
Both tools follow a consistent verb_noun pattern with underscore separation: summarize_messages and trim_messages. The naming is predictable and readable, with no deviations in style or convention.
With only 2 tools, the server feels thin for a context management domain, as it lacks operations like retrieval, update, or deletion of summaries/trims. However, the tools cover compression strategies adequately for a minimal scope.
The server is severely incomplete for context management; it only offers compression methods (summarization and trimming) but lacks any tools to retrieve, modify, or manage the compressed contexts, leaving agents with no way to access or update the results of these operations.