Skip to content

get_file_summary

Get a quick summary of file metadata and basic statistics.

Overview

The get_file_summary tool provides a concise overview of file characteristics without the detailed analysis of get_file_structure. It's optimized for speed and gives you essential information quickly.

Usage

json
{
  "tool": "get_file_summary",
  "arguments": {
    "filePath": "/var/log/app.log"
  }
}

Parameters

ParameterTypeRequiredDefaultDescription
filePathstringYes-Absolute or relative path to the file

Response Format

typescript
{
  filePath: string;       // Absolute path to file
  fileName: string;       // File name without path
  fileSize: number;       // Size in bytes
  fileSizeFormatted: string; // Human-readable size (e.g., "10.5 MB")
  totalLines: number;     // Total line count
  created: Date;          // File creation date
  modified: Date;         // Last modified date
  accessed: Date;         // Last accessed date
  isReadable: boolean;    // Whether file is readable
  isWritable: boolean;    // Whether file is writable
}

Examples

Basic Summary

Quick file overview:

json
{
  "tool": "get_file_summary",
  "arguments": {
    "filePath": "/var/log/system.log"
  }
}

Response:

json
{
  "filePath": "/var/log/system.log",
  "fileName": "system.log",
  "fileSize": 10485760,
  "fileSizeFormatted": "10 MB",
  "totalLines": 25000,
  "created": "2024-01-01T00:00:00.000Z",
  "modified": "2024-01-10T15:30:00.000Z",
  "accessed": "2024-01-10T16:00:00.000Z",
  "isReadable": true,
  "isWritable": false
}

CSV File Summary

json
{
  "tool": "get_file_summary",
  "arguments": {
    "filePath": "/data/sales.csv"
  }
}

Response:

json
{
  "filePath": "/data/sales.csv",
  "fileName": "sales.csv",
  "fileSize": 52428800,
  "fileSizeFormatted": "50 MB",
  "totalLines": 500000,
  "created": "2024-01-05T08:00:00.000Z",
  "modified": "2024-01-09T23:45:00.000Z",
  "accessed": "2024-01-10T09:15:00.000Z",
  "isReadable": true,
  "isWritable": true
}

Code File Summary

json
{
  "tool": "get_file_summary",
  "arguments": {
    "filePath": "/code/app.ts"
  }
}

Response:

json
{
  "filePath": "/code/app.ts",
  "fileName": "app.ts",
  "fileSize": 65536,
  "fileSizeFormatted": "64 KB",
  "totalLines": 1250,
  "created": "2024-01-01T10:00:00.000Z",
  "modified": "2024-01-10T16:45:00.000Z",
  "accessed": "2024-01-10T16:50:00.000Z",
  "isReadable": true,
  "isWritable": true
}

Comparison: Summary vs Structure

Featureget_file_summaryget_file_structure
SpeedFast (< 100ms)Slower (200ms-5s)
File size
Line count
Timestamps
Permissions
File type detection
Chunk information
Statistics✅ (detailed)
Encoding detection

Use get_file_summary when:

  • You need quick file information
  • You're doing permission checks
  • You're building file listings
  • You need human-readable sizes

Use get_file_structure when:

  • You need detailed statistics
  • You're planning file processing
  • You need chunk information
  • You need encoding detection

Common Use Cases

1. File Listing

Build file browser interface:

typescript
async function listFiles(directory: string) {
  const files = await readdir(directory);
  const summaries = await Promise.all(
    files.map(file =>
      get_file_summary({
        filePath: path.join(directory, file)
      })
    )
  );
  return summaries.sort((a, b) => b.modified - a.modified);
}

2. Permission Check

Verify file accessibility before operations:

typescript
const summary = await get_file_summary({
  filePath: "/data/important.csv"
});

if (!summary.isReadable) {
  throw new Error("Cannot read file: permission denied");
}

if (!summary.isWritable) {
  console.warn("File is read-only");
}

3. File Age Check

Find old files for archival:

typescript
const summary = await get_file_summary({
  filePath: "/logs/old.log"
});

const daysSinceModified =
  (Date.now() - summary.modified.getTime()) / (1000 * 60 * 60 * 24);

if (daysSinceModified > 30) {
  console.log(`Archive candidate: ${summary.fileName}`);
}

4. Size-Based Processing

Choose processing strategy based on size:

typescript
const summary = await get_file_summary({
  filePath: "/data/dataset.csv"
});

if (summary.fileSize < 1_000_000) {
  // Process in memory
  console.log("Small file, loading directly");
} else if (summary.fileSize < 100_000_000) {
  // Stream processing
  console.log("Medium file, using streaming");
} else {
  // Distributed processing
  console.log("Large file, using distributed processing");
}

5. Recent Files

Show recently modified files:

typescript
async function getRecentFiles(directory: string, days: number = 7) {
  const files = await readdir(directory);
  const summaries = await Promise.all(
    files.map(f => get_file_summary({ filePath: path.join(directory, f) }))
  );

  const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;
  return summaries
    .filter(s => s.modified.getTime() > cutoff)
    .sort((a, b) => b.modified.getTime() - a.modified.getTime());
}

Performance

File SizeSummary TimeNotes
< 1MB< 20msStat + quick line count
1-10MB20-50msStreaming line count
10-100MB50-200msOptimized counting
100MB-1GB200-1000msLine-by-line count
> 1GB1-5sProgressive counting

Performance Tips

  1. Cache Results: File metadata rarely changes
  2. Batch Operations: Use Promise.all for multiple files
  3. Skip Line Count: If not needed, use fs.stat directly
  4. Use Indexes: Build file index for large directories

Error Handling

File Not Found

json
{
  "error": "File not found: /path/to/missing.log",
  "code": "ENOENT"
}

Permission Denied

json
{
  "filePath": "/root/protected.log",
  "fileName": "protected.log",
  "isReadable": false,
  "isWritable": false,
  "error": "Permission denied"
}
json
{
  "filePath": "/var/log/current.log",
  "fileName": "current.log",
  "isSymlink": true,
  "linkTarget": "/var/log/2024-01-10.log"
}

Human-Readable Sizes

The fileSizeFormatted field uses the following format:

Size RangeFormatExample
< 1 KBBytes"512 bytes"
1 KB - 1 MBKB"128 KB"
1 MB - 1 GBMB"45.5 MB"
1 GB - 1 TBGB"2.3 GB"
>= 1 TBTB"1.5 TB"

Best Practices

1. Quick Checks

Use for fast validation:

typescript
// Quick check before processing
const summary = await get_file_summary({ filePath });

if (summary.fileSize === 0) {
  throw new Error("File is empty");
}

if (!summary.isReadable) {
  throw new Error("Cannot read file");
}

2. File Browser

Build responsive file browsers:

typescript
// Fast initial load
const summaries = await Promise.all(
  files.map(f => get_file_summary({ filePath: f }))
);

// Display in UI
summaries.forEach(s => {
  console.log(`${s.fileName} - ${s.fileSizeFormatted} - ${s.modified}`);
});

3. Caching

Cache summary data:

typescript
const cache = new Map<string, FileSummary>();

async function getSummaryCached(filePath: string) {
  const summary = await get_file_summary({ filePath });

  // Cache if file hasn't changed
  const cached = cache.get(filePath);
  if (cached && cached.modified.getTime() === summary.modified.getTime()) {
    return cached;
  }

  cache.set(filePath, summary);
  return summary;
}

4. Batch Processing

Process multiple files efficiently:

typescript
async function summarizeDirectory(dir: string) {
  const files = await readdir(dir);

  // Batch process
  const summaries = await Promise.all(
    files.map(f =>
      get_file_summary({
        filePath: path.join(dir, f)
      })
    )
  );

  return summaries;
}

Integration Examples

File Dashboard

typescript
interface FileDashboard {
  totalFiles: number;
  totalSize: number;
  oldestFile: Date;
  newestFile: Date;
  largestFile: string;
  files: FileSummary[];
}

async function createDashboard(directory: string): Promise<FileDashboard> {
  const files = await readdir(directory);
  const summaries = await Promise.all(
    files.map(f => get_file_summary({ filePath: path.join(directory, f) }))
  );

  return {
    totalFiles: summaries.length,
    totalSize: summaries.reduce((sum, s) => sum + s.fileSize, 0),
    oldestFile: new Date(Math.min(...summaries.map(s => s.created.getTime()))),
    newestFile: new Date(Math.max(...summaries.map(s => s.modified.getTime()))),
    largestFile: summaries.reduce((max, s) =>
      s.fileSize > max.fileSize ? s : max
    ).fileName,
    files: summaries
  };
}

Watch File Changes

typescript
class FileWatcher {
  private lastSummary: FileSummary;

  async hasChanged(filePath: string): Promise<boolean> {
    const current = await get_file_summary({ filePath });

    if (!this.lastSummary) {
      this.lastSummary = current;
      return false;
    }

    const changed =
      current.modified.getTime() !== this.lastSummary.modified.getTime() ||
      current.fileSize !== this.lastSummary.fileSize;

    this.lastSummary = current;
    return changed;
  }
}

See Also

Released under the MIT License.