ファイルコンテキストMCP(モデルコンテキストプロセッサ)
概要
File Context MCPは、TypeScriptベースのアプリケーションで、ローカルファイルのコンテキストを用いて大規模言語モデル(LLM)をクエリするためのAPIを提供します。複数のLLMプロバイダー(OllamaとTogether.ai)をサポートし、様々なファイルタイプを処理してコンテキストに応じたレスポンスを生成できます。
Related MCP server: MemGPT MCP Server
コア機能
1. ファイルシステムナビゲーション
動的なファイルとディレクトリのトラバーサル
複数のファイル タイプ (
.txt、.md、.ts、.jsonなど) のサポート衛生管理による安全な通路の確保
import path from 'path';
export const fileUtils = {
isTextFile(filePath: string): boolean {
const textExtensions = [
'.txt', '.md', '.js', '.ts', '.json', '.yaml', '.yml',
'.html', '.css', '.csv', '.xml', '.log', '.env',
'.jsx', '.tsx', '.py', '.java', '.cpp', '.c', '.h'
];
return textExtensions.includes(path.extname(filePath).toLowerCase());
},
2. コンテキスト処理
LLMクエリのためのインテリジェントなコンテキストフォーマット
大きなファイルを処理するためのコンテキスト切り捨て
ディレクトリクエリのファイルコンテンツの集約
export const promptUtils = {
formatContextPrompt(context: string, query: string): string {
return `
You are an AI assistant analyzing the following content:
---BEGIN CONTEXT---
${context}
---END CONTEXT---
Please respond to the following query:
${query}
Base your response only on the information provided in the context above.
`;
},
truncateContext(context: string, maxLength: number = 4000): string {
if (context.length <= maxLength) return context;
// Try to truncate at a natural break point
const truncated = context.slice(0, maxLength);
const lastNewline = truncated.lastIndexOf('\n');
if (lastNewline > maxLength * 0.8) {
return truncated.slice(0, lastNewline) + '\n... (truncated)';
}
return truncated + '... (truncated)';
}
};3. マルチモデルサポート
Ollama(ローカル)統合
Together.ai(クラウド)統合
拡張可能なモデルインターフェース設計
export interface LLMResponse {
text: string;
model: string;
error?: string;
}
export class ModelInterface {
async queryOllama(prompt: string, context: string): Promise<LLMResponse> {
try {
const response = await axios.post(`${config.ollamaBaseUrl}/api/generate`, {
model: config.modelName,
prompt: this.formatPrompt(prompt, context),
stream: false
});
return {
if (!response.data || !response.data.response) {
throw new Error('Invalid response from Ollama');
}
} catch (error) {
return {
text: response.data.response,
model: 'ollama'
};
} catch (error) {
console.error('Ollama error:', error);
return {
text: '',
model: 'ollama',
error: error instanceof Error ? error.message : 'Unknown error'
};
}
}
model: config.modelName,
async queryTogether(prompt: string, context: string): Promise<LLMResponse> {
try {
const response = await axios.post(
'https://api.together.xyz/inference',
{
model: config.modelName,
prompt: this.formatPrompt(prompt, context),
max_tokens: 512,
},
{
headers: {
Authorization: `Bearer ${config.togetherApiKey}`
}
}
);
return {
return {
text: response.data.output.text,
model: 'together'
};
} catch (error) {
return {
text: '',
model: 'together',
error: error instanceof Error ? error.message : 'Unknown error'
};
}
}
private formatPrompt(prompt: string, context: string): string {
return `Context: ${context}\n\nQuestion: ${prompt}`;
}
}建築
コアコンポーネント
サーバー (server.ts)
Express.js REST API実装
multerによるファイルアップロード/削除処理
リクエストの検証とルーティング
OpenAPI/Swagger統合
ファイルシステムツール (core/fileSystem.ts)
ファイルとディレクトリの操作
コンテンツの読み取りと解析
ディレクトリトラバーサル
安全なファイル削除
ファイル操作のエラー処理
モデルインターフェース (core/modelInterface.ts)
複数の LLM プロバイダーのサポート (Ollama、Together.ai)
レスポンスのフォーマットとエラー処理
設定可能なモデルパラメータ
統合クエリインターフェース
ユーティリティモジュール
fileUtils: ファイルタイプの検出、パスのサニタイズ、サイズのフォーマットpromptUtils: コンテキストフォーマット、インテリジェントな切り捨てvalidators: パス、クエリ、モデルの検証logger: レベルによる構造化ログ
構成 (config/config.ts)
環境変数管理
APIキーとエンドポイント
モデル構成
サーバー設定
API 仕様 (resources/file-context-api.yml)
OpenAPI 3.0 ドキュメント
リクエスト/レスポンススキーマ
エンドポイントドキュメント
エラー応答の定義
APIエンドポイント
1. ファイルの一覧表示
GET /api/files
Query params:
- path: string (optional, defaults to './')
Response:
- Array of FileInfo objects with file/directory details2. ファイルをアップロードする
POST /api/files/upload
Content-Type: multipart/form-data
Body:
- file: File (must be a text file, max 5MB)
Response:
{
"message": "File uploaded successfully",
"file": {
"name": string,
"size": string,
"path": string
}
}3. ファイルを削除する
DELETE /api/files/{filename}
Params:
- filename: string (name of file to delete)
Response:
{
"message": "File deleted successfully"
}4. コンテキストを考慮したクエリ
POST /api/query
Body:
{
"path": string,
"query": string,
"model": "ollama" | "together"
}
Response:
{
"text": string,
"model": string,
"error?: string
}セットアップと構成
環境変数
TOGETHER_API_KEY=your_api_key_here
OLLAMA_BASE_URL=http://localhost:11434
MODEL_NAME=llama2
PORT=3001インストール
npm installSmithery経由でインストール
Smithery経由で Claude Desktop 用の File Context MCP を自動的にインストールするには:
npx @smithery/cli@latest install @compiledwithproblems/file-context-mcp --client claudeアプリケーションの実行
# Development
npm run dev
# Production
npm run build
npm start仕組み
ファイル処理フロー
リクエスト受信 → パス検証 → ファイルの読み取り → コンテンツの抽出
ディレクトリ処理には再帰的なファイル読み取りが含まれる
ファイルタイプに基づくコンテンツフィルタリング
ファイルのアップロードは種類とサイズが検証されます
パス検証による安全なファイル削除
コンテキスト処理
ファイルの内容が集約される
コンテキストは明確な境界でフォーマットされている
大きなコンテキストはインテリジェントに切り捨てられる
プロンプトのフォーマットはLLMの理解に構造を追加します
モデル統合
さまざまなLLMプロバイダー向けの統一インターフェース
エラー処理と応答の正規化
設定可能なモデルパラメータ
セキュリティ機能
パスサニタイズ
ディレクトリトラバーサル攻撃の防止
パスの検証と正規化
安全なファイルタイプのチェック
ファイルアップロードのセキュリティ
ファイルタイプの検証
ファイルサイズの制限(最大5MB)
安全なファイルストレージ
安全なファイル削除
入力検証
クエリコンテンツの検証
モデルタイプの検証
パス構造検証
ファイルコンテンツの検証
サポートされているファイル形式
アプリケーションは、次のテキストベースのファイル タイプをサポートしています。
ドキュメント:
.txt、.mdコードファイル:
.js、.ts、.jsx、.tsx、.py、.java、.cpp、.c、.h構成:
.json、.yaml、.yml、.envWeb ファイル:
.html、.cssデータファイル:
.csv、.xml、.log
ファイルタイプの検証は次の場合に適用されます:
ファイルのアップロード
コンテキスト処理
ファイル読み取り操作
最大ファイルサイズ: ファイルあたり5MB
エラー処理
アプリケーションは包括的なエラー処理を実装します。
ファイルシステムエラー
API応答エラー
無効な入力エラー
モデル固有のエラー
ファイルのアップロード/削除エラー
発達
プロジェクト構造
file-context-mcp/
├── src/
│ ├── server.ts # Main application server
│ ├── core/ # Core functionality
│ │ ├── fileSystem.ts # File operations handling
│ │ └── modelInterface.ts # LLM provider integrations
│ ├── utils/ # Utility functions
│ │ ├── fileUtils.ts # File type & path utilities
│ │ ├── promptUtils.ts # Prompt formatting
│ │ ├── validators.ts # Input validation
│ │ └── logger.ts # Application logging
│ ├── config/ # Configuration
│ │ └── config.ts # Environment & app config
│ └── resources/ # API specifications
│ └── file-context-api.yml # OpenAPI spec
├── storage/ # File storage directory
│ ├── code-samples/ # Example code files
│ └── notes/ # Documentation & notes
├── postman/ # API testing
│ └── File-Context-MCP.postman_collection.json # Postman collection
├── dist/ # Compiled output
└── node_modules/ # Dependencies新機能の追加
新しいファイルタイプ
fileUtils.isTextFile()に拡張機能を追加する必要に応じて特定のハンドラーを実装する
新しいモデルプロバイダー
ModelInterfaceクラスを拡張するvalidators.isValidModel()にプロバイダーを追加します。プロバイダ固有のエラー処理を実装する
テスト
ポストマンコレクション
このプロジェクトには、すべてのAPIエンドポイントをテストするためのPostmanコレクション( postman/File-Context-MCP.postman_collection.json )が含まれています。使用するには、以下の手順に従います。
コレクションをインポートする
ポストマンを開く
「インポート」ボタンをクリック
File-Context-MCP.postman_collection.jsonファイルを選択またはドラッグします。
利用可能なリクエスト
File-Context-MCP ├── List files │ └── GET http://localhost:3001/api/files?path=./storage ├── Query │ └── POST http://localhost:3001/api/query (single file analysis) ├── Analyze multiple files │ └── POST http://localhost:3001/api/query (directory analysis) └── File Upload └── POST http://localhost:3001/api/files/uploadファイル操作のテスト
ファイルの一覧: ストレージディレクトリの内容を表示します
ファイルのアップロード: キー「file」を持つフォームデータを使用し、テキストファイルを選択します。
クエリファイル: LLM を使用して単一ファイルの内容を分析する
ディレクトリ分析: LLM で複数のファイルを処理する
クエリの例
// Single file analysis { "path": "./storage/code-samples/example.ts", "query": "Explain what this TypeScript code does", "model": "ollama" } // Directory analysis { "path": "./storage", "query": "What types of files are in this directory and summarize their contents?", "model": "ollama" }ファイルアップロードガイド
「ファイルアップロード」リクエストを使用する
本文タブで「form-data」を選択します
タイプ「File」のキー「file」を追加します。
サポートされているテキストファイルを選択します(サポートされているファイルの種類を参照)
最大ファイルサイズ: 5MB
手動テスト
/storageに用意されているテストファイルを使用するさまざまなファイルタイプとクエリをテストする
モデルの応答とエラー処理を検証する
テストファイルのサイズ制限と種類の制限
環境設定
必ず次の点に注意してください:
サーバーを実行しておきます(
npm run dev)環境変数を設定する
Ollamaをローカルで実行する(Ollamaモデルの場合)
Together.ai APIキーを設定する(Togetherモデル用)
今後の検討事項
大きなファイルを効率的に処理する方法
サポートされるファイルタイプの拡張
コンテキスト処理の最適化
レスポンスのストリーミングサポートの追加
レート制限とキャッシュの実装
このプロジェクトは、モジュール性、型の安全性、エラー処理に重点を置いた最新の TypeScript/Node.js プラクティスを示し、ファイルベースのコンテキストとの LLM 対話のための柔軟なインターフェースを提供します。